前言:
Java中类和对象是比较重要的一章,这一章可以让我们深刻认识到Java语言的"精妙之处",它不像C语言那么"细",也不想其他语言封装的那么"保守"。
游刃有余的解决一系列面向对象问题。
面向对象的理解:
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
面向对象和面向过程:
什么是面向过程:面向过程大家可以理解为把一件事,或者一个东西拆的很细,比如说一辆汽车,这个汽车就是一个对象,这个过程是什么,就是把汽车拆解,每一个零件的生产拼装,或者是每一个功能是怎么是实现的,都有详细的过程。
什么是面向对象:刚刚举例的汽车其实就是一个对象,当我们使用汽车的时候,我们只需要知道它有哪些功能,这些功能能做什么,需要的时候就去用,不需要了解其内部是怎么实现这个功能的。人和车就是两个对象,其实整个过程就是人与车两个对象之间的交互。
类的定义和使用:
面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。
所以我们需要抽象出一个对象出来,也就是告诉计算机这个洗衣机的长,宽,高,颜色,可以使用的功率等的特征,还需要告诉洗衣机它的作用功能有哪些。
综上我们在抽象出一个对象的时候,需要描述抽象对象的特征和功能!!
类的定义格式:
在java中定义类时需要用到class关键字,具体语法如下:
注意事项:1. 一般一个文件当中只定义一个类2. main 方法所在的类 一般要使用public修饰 ( 注意: Eclipse 默认会在 public 修饰的类中找 main 方法 )3. public修饰的类必须要和文件名相同4. 不要轻易去修改 public 修饰的类的名称,如果要修改,通过开发工具修改 。
类的实例化:
什么是实例化:
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自 带的内置类型,而类是用户自定义了一个新的类型。它们都是类(一种新定 义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
类只是一个对象的框架,至于框架里面是是什么还得自己填充。
例如:
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.color = "yellow";
dog.name = "旺财";
dog.wag();
dog.barks();
//dog2
Dog dog2 = new Dog();
dog2.color = "black";
dog2.name = "小黑";
dog2.barks();
dog2.wag();
}
}
注意事项1、new 关键字用于创建一个对象的实例 .2、使用 . 来访问对象中的属性和方法 .3、同一个类可以创建对个实例
类和对象的说明:
this引用:
什么是this引用,又为什么会有this引用?
为什么会有this引用:
先看例子:
//写一个类
class Date{ public int year; public int month; public int day; public void setDay(int x,int y,int z){ year = x; month = y; day = z; } public void print(){ System.out.println(year+"."+month+"."+day); } }//实例化类
public static void main(String[] args) { Date d1 = new Date(); Date d2 = new Date(); Date d3 = new Date(); d1.setDay(2024,9,7); d2.setDay(2024,9,8); d3.setDay(2024,9,9); //打印日期 d1.print(); d2.print(); d3.print(); }
这是一个关于可与日期的类,类中有年月日三个成员变量,还有两个方法(行为),一个是可以可以修改日期的方法,一个是可以打印日期的方法。
此时注意我将修改日期的方法中的参数改为和成员变量同名的会怎么样!
class Date{ public int year; public int month; public int day; public void setDay(int year,int month,int day){ year = year; month = month; day = day; } public void print(){ System.out.println(year+"."+month+"."+day); } }
public static void main(String[] args) { Date d1 = new Date(); Date d2 = new Date(); Date d3 = new Date(); d1.setDay(2024,9,7); d2.setDay(2024,9,8); d3.setDay(2024,9,9); //打印日期 d1.print(); d2.print(); d3.print(); }
结果会是怎样?
此时那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计自己都搞不清楚了。
以上的两个疑问问题都会在this这里得到解决!
什么是this引用:
class Date{ public int year; public int month; public int day; public void setDay(int year,int month,int day){ this.year = year;//表示该对象的year与参数的year做区分 this.month = month;//表示该对象的month与参数的month做区分 this.day = day;//表示该对象的day与参数的day做区分 } public void print(){ System.out.println(year+"."+month+"."+day); } }
也就相当于this里面存的是调用该成员方法的对象的地址! (this是引用类型,之前讲到过引用类型的特点!)
所以为了避免以上的问题,可以在类里面有关变量的方法里都可以加上this。
this引用的特征:
对象的构造和初始化:
如何初始化对象:
public static void main ( String [] args ) {int a ;System . out . println ( a );}// Error:(26, 28) java: 可能尚未初始化变量 a
public static void main ( String [] args ) {Date d = new Date ();d . printDate ();d . setDate ( 2021 , 6 , 9 );d . printDate ();}// 代码可以正常通过编译
需要调用之前写的 SetDate 方法才可以将具体的日期设置到对象中。 通过上述例子发现两个问题:1. 每次对象创建好后调用 SetDate 方法设置具体日期,比较麻烦,那对象该如何初始化?2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?
构造方法:
public class Date {public int year ;public int month ;public int day ;// 构造方法:// 名字与类名相同,没有返回值类型,设置为 void 也不行// 一般情况下使用 public 修饰// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次public Date(int year, int month, int day){this.year = year;this.month = month;this.day = day;System.out.println("Date(int,int,int)方法被调用了");}public void printDate (){System . out . println ( year + "-" + month + "-" + day );}public static void main ( String [] args ) {// 此处创建了一个 Date 类型的对象,并没有显式调用构造方法Date d = new Date ( 2021 , 6 , 9 ); // 输出 Date(int,int,int) 方法被调用了d . printDate (); // 2021-6-9}}
注意是每次实例化一个对象的时候就会首先调用构造方法。(不论这个构造方法在哪)
如果自己没有构造方法,系统会自动调用一个空的构造方法,如果自己写了构造方法,那么就不会再调用系统的构造方法了,只会调用自己写的。
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
特征:
注意: 一旦用户定义,编译器则不再生成。
构造方法中,可以通过this调用其他构造方法来简化代码:
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; } }