1. 面向对象
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
面向过程注重的是过程,在整个过程中所涉及的行为,就是功能。
面向对象注重的是对象,也就是参与过程所涉及到的主体。是通过逻辑将一个个功能实现连接起来
面向对象就是用代码(类)来描述客观世界的事物的一种方式. 一个类主要包含一个事物的属性和行为
1. 注重洗衣服过程
2.注重洗衣对象
总共有四个对象:人、衣服、洗衣粉、洗衣机。
整个过程主要是:人、衣服、洗衣粉、洗衣机四个对象之间交互完成的,人不需要关心洗衣机具体是如何洗衣粉的,是如何甩干的。以面向对象的方式进行处理,就不需要关注洗衣服的过程,是通过对象之间的交互来完成的。
什么是类
对象从何而来,从类来,你可以想象成一个类型,面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识。这个类我们要定义出来,该怎么定义呢?需要开发人员告诉给计算机什么是洗衣机。
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥)
比如:洗衣机,它是一个品牌,在Java中可以将其看成是一个类别。
属性:产品品牌,型号,产品重量,外观尺寸,颜色…
功能:洗衣,烘干、定时…
class为定义类的关键字,WashMachine为类的名字,{}中为类的主体(类体)。 类中的元素称为:成员属性(成员变量)。类中的函数称为:成员方法。
class WashMachine{
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public double length; // 长
public double width; // 宽
public double height; // 高
public String color; // 颜色
public void washClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
}
类new个对象
用类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
public class ClassAndObject {
public static void main(String[] args) {
// 现在我们有了类,那么怎么产生对象的呢? 通过 new 去实例化一个对象,也就是说去产生一个对象
WashMachine xiyiji = new WashMachine();//xiyiji是一个变量
// 注意此时的变量是由类定义的,由类定义的变量,都是引用变量,意味着初值可以赋 null
// 而且 前面也说,同一个类,我们可以产生很多对象
// 意味着 我们生成 很多人 xiyiji
WashMachine xiyiji2 = new WashMachine();
WashMachine xiyiji3 = new WashMachine();
WashMachine xiyiji4 = new WashMachine();
// ......
}
}
类.成员变量
使用 . 来访问对象中的属性和方法.
public class ClassAndObject {
public static void main(String[] args) {
WashMachine xiyiji = new WashMachine();
xiyiji.brand="苹果牌";
xiyiji.length=100;
xiyiji.washClothes();
//.....
System.out.println(xiyiji.length);
}
}
类和对象的内存
public类名修改
注意事项:
- 一一个java文件当中只能定义一个public类
- main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
- public修饰的类必须要和文件名相同
- 不要轻易去修改public修饰的类的名称,要通过开发工具修改(src–>旧类名右击—>Refactor---->Rename—>新的类名)
类的说法易错点
2.this
为什么要有this引用
定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打
印,代码整体逻辑非常简单,没有任何问题。
public class Date {
public int year;
public int month;
public int day;
public void setDay(int y, int m, int d){
year = y;
month = m;
day = d;
}
public void printDate(){
System.out.println(year + "/" + month + "/" + day);
}
public static void main(String[] args) {
// 构造三个日期类型的对象 d1 d2 d3
Date d1 = new Date();
Date d2 = new Date();
Date d3 = new Date();
// 对d1,d2,d3的日期设置
d1.setDay(2020,9,15);
d2.setDay(2020,9,16);
d3.setDay(2020,9,17);
// 打印日期中的内容
d1.printDate();
d2.printDate();
d3.printDate();
}
}
但是细思之下有以下两个疑问?
- 形参名不小心与成员变量名相同
public void setDay(int year, int month, int day){
year = year;
month = month;
day = day;
}
结果就不能赋值,全部都是默认值0,原因是形参是局部变量,局部变量优先使用,不能对成员变量进行赋值。- 三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和
printDate函数如何知道打印的是那个对象的数据呢?
this引用的特性
- this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
- this只能在"成员方法"中使用
- 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
- this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法 对象的引用传递给该成员方法,this负责来接收
this的用法
1.this.data 调用当前的对象的 属性/字段/成员变量
2.this.func() 调用当前的对象的方法
3.this() 调用当前对象的其他构造方法====类( )
class Date{
public int year;
public Date(){
this();
// 注意不能这么去写,因为 this() 表示调用当前对象的构造方法
// 而现在Date 就是当前的构造方法,两者嵌套使用,会造成死循环
// Date(){} 调用 this(), this() 调用 Date(){}
// 而且编译器也出现 红色波浪线警告
System.out.println("不带参数的构造方法");
}
}
3. 构造方法
什么是构造方法?
这个方法没有返回值,方法名和类名是一样(都是Date)的。
- 名字必须与类名相同
- 没有返回值类型,设置为void也不行
- 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
- 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
public Date(){//括号里不含参数
System.out.println("不带参数的构造方法");
}
public Date(int x,char y,double z){//括号里含参数
System.out.println("带参数的构造方法");
}
系统提供的:
public Date(){//什么都没有
}
不带参数:当你什么构造方法都没有写的时候,系统是默认给你写上一个不带参数的。
带参数:肯定就是你写的,也只会调用你写的,那系统就不会多此一举再提供了。
构造方法只会调用一次。Date d = new Date();
实例化对象调用
构造方法的作用?
在构造函数时就可以去初始化了,而不需要去构造一个类似于setDate这样的函数。
public class Date {
public int year;
public int month;
public int day;
public Date(int year,int month,int day) {
//this();
this.year = year;
this.month = month;
this.day = day;
System.out.println("调用了带有3个参数的构造方法!");
this.show();
}
public void setDate(int year,int month,int day) {
this.show();
this.year = year;
this.month = month;
this.day = day;
}
public void show() {
System.out.println("年:"+this.year+" 月:"+this.month+" 日:"+this.day);
}
public static void main(String[] args) {
Date date = new Date(2022,12,23);//传参
date.show();
}
}
输出结果:
调用了带有3个参数的构造方法!
年:2022 月:12 日:23
年:2022 月:12 日:23
通过this调用其他构造方法来简化代
public class Date {
public int year;
public int month;
public int day;
// 无参构造方法-内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
// 此处可以在无参构造方法中通过this调用带有三个参数的构造方法
// 但是this(1900,1,1);必须是构造方法中第一条语句
public Date(){
//System.out.println(year); 注释取消掉,编译会失败
this(1900, 1, 1);
//this.year = 1900;
//this.month = 1;
//this.day = 1;
}
// 带有三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
}
public static void main(String[] args) {
Date date = new Date();