目录
1 类是什么
1.1 面向对象
1.2 面向对象与面向过程
2 类定义和使用
2.1 类的定义格式
2.2 练习定义一个狗类
3 类的实例化
4 this引用
5 对象的构造与初始化
5.1 构造方法与初始化
5.2 默认初始化
5.3 就地初始化
1 类是什么
关于类是什么,我们需要对java的面向对象的思想有一定的认识
1.1 面向对象
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
1.2 面向对象与面向过程
手洗衣服就是面向洗衣服整个过程,一步一步设计,最后洗完衣服,非常繁琐,少一步可能都会导致这个过程执行不下去,按照该种方式来写代码,将来扩展或者维护起来会比较麻烦。
机洗衣服就是面向四个对象:人、衣服、洗衣粉和海尔洗衣机,用户不需要关注衣服是怎么洗的怎么甩干的,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可,通过对象之间的交互来完成的。
面向对象程序设计关注的是对象,而对象是现实生活中的实体,比如:海尔洗衣机(美的也可以)。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。开发人员可以采用某种面相对象的编程语言来进行描述,比如:Java语言。
Java语言中的类就是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干 啥),描述完成后计算机就可以识别了。
洗衣机类
属性:品牌、型号、重量、颜色等等
功能:洗衣、脱水等
在Java语言中,如何对上述的洗衣机类来进行定义呢?
2 类定义和使用
2.1 类的定义格式
class WashMachine{ //洗衣机类//成员属性/成员变量public String brand; //品牌public String type; //类型public int weight; //重量public String color; //颜色//成员方法public void wash(){ //洗衣服功能System.out.println("洗衣服");}public void dry(){ //脱水功能System.out.println("脱水");}
}
class 为定义类的关键字,WashMachine 为类的名字,{} 中为类的主体。
类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类 具有哪些功能,称为类的成员方法。
【注意】
- 类名注意采用大驼峰定义
- 成员前写法统一为public,后面会详细解释
- 此处写的方法不带 static 关键字. 后面会详细解释
2.2 练习定义一个狗类
public class PetDog{ //多了一个publicpublic String type; //类型public String name; //名字public int age; //年龄public void bark(){System.out.println(name + "汪汪!!");}public void wag(){System.out.println(name + "摇尾巴~~");}
}
【注意】
- 一般一个文件当中只定义一个类
- main方法所在的类一般要使用public修饰
- public修饰的类必须要和文件名相同
3 类的实例化
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
比如宠物狗是一个类,有金毛、哈士奇和拉布拉多等等,年龄不一样,名字不一样,就都是不一样的对象,类只是一个模型一样的东西,用来对一个实体(对象)进行描述,限定了类有哪些成员。一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
以 宠物狗类 为例,再定义一个文件TestDog
public class TestDog{public static void main(String[] args) {PetDog mydog = new PetDog(); //类的实例化mydog.name = "小狗";mydog.type = "哈士奇";mydog.age = 4;mydog.bark();mydog.wag();}
}//输出结果
//小狗汪汪!!
//小狗摇尾巴~~
【注意】
- new 关键字用于创建一个对象的实例。
- 使用 . 来访问对象中的成员变量和方法。
- 同一个类可以创建多个实例化对象。
4 this引用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
【特性】
this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
this只能在"成员方法"中使用
在"成员方法"中,this只能引用当前对象,不能再引用其他对象
结合后面的构造方法一起讲
5 对象的构造与初始化
5.1 构造方法与初始化
构造方法是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次。
//PetDog.java
public class PetDog{public String type;public String name; public int age; //构造方法public PetDog(String type,String name,int age){this.type = type; //当形参和实参名字相同时,this.name = name; //this来告诉编译器这个type、name和agethis.age = age; //是属于哪个对象的}public void bark(){System.out.println(name + "汪汪!!");}public void wag(){System.out.println(name + "摇尾巴~~");}
}//TestDog.java
public class TestDog{public static void main(String[] args) {PetDog mydog = new PetDog("哈士奇","小狗",4); //简化啦mydog.bark();mydog.wag();}
}
//输出结果一样
【特性】
- 名字必须与类名相同
- 没有返回值类型,设置为void也不行
- 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
- 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
- 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。注意:一旦用户定义了构造方法,编译器则不再生成无参的默认构造方法。
- 构造方法中,可以通过this调用其他构造方法来简化代码,this(...)必须是构造方法中第一条语句
public class PetDog{public String type; public String name; public int age;//构造方法(与下面那个是方法的重载(参数列表不一样))public PetDog(){//this调用下面那个构造方法来完成初始化this("金毛","大狗",5);}public PetDog(String type,String name,int age){this.type = type; this.name = name; this.age = age; }public void bark(){System.out.println(name + "汪汪!!");}public void wag(){System.out.println(name + "摇尾巴~~");}
}public class TestDog{public static void main(String[] args) {PetDog mydog = new PetDog("哈士奇","小狗",4);PetDog mydog1 = new PetDog(); //调用无参的那个构造方法mydog.bark();mydog.wag();mydog1.bark();mydog1.wag();}
}//输出结果
//小狗汪汪!!
//小狗摇尾巴~~
//大狗汪汪!!
//大狗摇尾巴~~
5.2 默认初始化
为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:
(1)检测对象对应的类是否加载了,如果没有加载则加载
(2)为对象分配内存空间
(3)处理并发安全问题
比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
(4)初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
数据类型 | 默认值 |
byte | 0 |
char | '\u0000' |
short | 0 |
int | 0 |
long | 0L |
boolean | false |
float | 0.0f |
double | 0.0 |
reference | null |
(5)设置对象头信息(后续介绍)
(6)调用构造方法,给对象中各个成员赋值
所以构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
5.3 就地初始化
在声明成员变量时,就直接给出了初始值。
public class PetDog{public String type = "金毛"; //就地初始化public String name = "大狗";public int age;
}
代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造方法中
完