四.类和对象
你需要掌握类的定义以及对象的实例化,掌握类中的成员变量和成员方法的使用,掌握对象的整个初始化过程,掌握封装特性,掌握代码块,掌握内部类等等。
面向对象
面向对象(OP)是解决问题的一种思想,主要依靠对象之间的交互完成一件事。
类和类的实例化
学会定义一个类:
- 类目大驼峰
- 成员前写法统一为public(目前)
- 写的方法不带static关键字(目前)
class Person {
public String name;
public int age;
public void eat(){System.out.println("eat!");}
public void sleep(){System.out.println("slaap!");}
public static void main(String[] args) {}
}
public class a {
public static void main(String[] args) {
}
}
由类拿到对象的过程叫做实例化:
class Person {
public String name;
public int age;
public void eat(){System.out.println("eat!");}
public void sleep(){System.out.println("slaap!");}
}
public class a {
public static void main(String[] args) {
Person person1 = new Person();
Person[] person2 = new Person[3]; //这里也可以是数组
person1.age=12;
person1.name="beauty";
person1.eat();
System.out.println("age = "+person1.age+" name = "+person1.name);
person2[0].age=16; //数组的相应用法近似
}
}
当一个引用赋值为null时,代表这个引用不能指向任意对象。引用不能指向引用。一个引用只能指向一个对象,否则指向最后一个对象。
this引用
this的出现会避免很多情况下出现的问题,例如在写set函数时形参名与成员变量名相同,或者在成员函数在真正执行时函数体中没有关于任何对象的说明,不知道要执行的时哪个对象等
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
class Date {
public int year;
public int month;
public int day;
public void setDay(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(this.year + "/" + this.month + "/" + this.day);
}
}
public class a {
public static void main(String[] args) {
Date d = new Date();
d.setDay(2020,9,15);
d.printDate(); //如果没有this,打印出来的便是0/0/0
}
}
this引用的特性
- this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
- this只能在"成员方法"中使用
- this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法,对象的引用传递给该成员方法,this负责来接收
- this不能调用静态的成员变量和成员方法
- this.data:访问当前对象的成员变量
- this.func():访问当前对象的成员方法
- this():调用当前对象的其他构造方法
构造方法
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
方法重载:方法名相同,方法参数不同,包括参数的类型和个数都不同,叫做方法的重载!!!
特性:
- 名字必须与类名相同
- 没有返回值类型,设置为void也不行
- 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
- 构造方法可以重载
- 如果没有定义任何构造方法,编译器会生成一份默认的无参的构造方法
- 一旦用户定义了,编译器就不在生成默认的构造方法
- 构造方法中,可以通过this调用其他构造方法来简化代码
- 使用this简化时,不能形成环——循环调用
this还能除了上面的访问构造方法之外,还可以访问成员方法
class Person{
public String name;
public Person(){}
public String getName() {return name;}
public void setName(String name) {
this.name = name;
this.function(); //看这里
}
public void function(){
System.out.println(name+" 你看看我 ");
}
}
public class 实例化 {
public static void main(String[] args) {
Person zhangSan = new Person();
zhangSan.setName("zhangSan");
zhangSan.function();
}
}
关于构造方法
默认初始化
Date d = new Date(2021,6,9);
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:
- 检测对象对应的类是否加载了,如果没有加载则加载(涉及双亲委派模型等)
- 为对象分配内存空间
- 处理并发安全问题,如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
- 初始化所分配的空间 : 对象空间被申请好之后,对象中包含的成员已经设置好了初始值。除了基本数据类型外,还有reference(默认值为null)
- 设置对象头信息
- 调用构造方法,给对象中各个成员赋值
就地初始化
在成员变量定义的时候就赋值。
成员变量和局部变量
成员变量:定义在方法外部,在类的内部的变量
局部变量:定义在方法内部
Java里面没有全局变量