1 继承
继承的特点:
2 构造方法
2.1 定义
构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法。
2.2 格式
public 类名称(参数类型 参数名称){
方法体
}
public class Day6_gouzaofangfa_student {
//成员变量
private String name;
private int age;
//构造方法也可以进行重载
public Day6_gouzaofangfa_student(){
System.out.println("无参构造方法执行了");
}
public Day6_gouzaofangfa_student(String name,int age){
System.out.println("全参构造方法执行了");
this.name=name;
this.age=age;
}
//Getter and Setter
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
}
public class Day6_gouzaofangfa {
public static void main(String[] args) {
//无参构造
Day6_gouzaofangfa_student stu1=new Day6_gouzaofangfa_student();
System.out.println("------------");
//全参构造
Day6_gouzaofangfa_student stu2=new Day6_gouzaofangfa_student("赵丽颖",20);
System.out.println("姓名是"+stu2.getName()+",年龄是"+stu2.getAge());
//如果需要改变对象当中的成员变量数据内容,仍然需要使用setXxx方法
stu2.setAge(56);
System.out.println("姓名是"+stu2.getName()+",年龄是"+stu2.getAge());
}
}
2.3 作用
1.对象的初始化:
构造方法用于创建对象并初始化对象的状态。当使用 new 关键字实例化对象时,构造方法会被调用,确保对象在创建后具有正确的初始值。它可以初始化对象的实例变量、分配内存等。
2. 属性的赋值:
构造方法可以接受参数,并使用这些参数将对象的属性进行赋值。这样可以在创建对象时,通过构造方法传递参数,将外部数据赋值给对象的属性,实现对象的个性化配置。
3. 实现重载:
可以定义多个构造方法,只要参数的个数、类型或顺序不同即可。这样可以根据不同的需求来选择合适的构造方法进行对象的创建和初始化,实现构造方法的重载。
4. 对象的复制或克隆:
通过拷贝构造方法,可以使用已有对象的属性值创建一个新对象,实现对象的复制或克隆。这在需要复制对象的场景中非常有用,可以避免对象引用的问题。
5. 初始化代码块执行:
在构造方法内部,可以执行各种初始化逻辑和计算,例如设置默认值、进行复杂的计算、打开文件等。这些操作可以帮助确保对象在创建时具有正确的初始状态。
6. 继承和多态:
构造方法在继承和多态的场景中起着重要的作用。子类的构造方法可以使用 super 关键字调用父类的构造方法,以确保父类的初始化代码得到执行,并在此基础上进行子类的初始化工作。
2.4 注意事项
- 构造方法的名称必须和所在类名称完全一样,就连大小写也一样
- 构造方法不要写返回值类型,连void也不写
- 构造方法不能return一个具体返回值
- 如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数,方法体什么事情都不做
- public Student(){}
- 一旦编写了至少一个构造方法,那么编译器将不再赠送
- 构造方法也可以进行重载
- 重载:方法名称相同,参数列表不同
2.5 继承中,父子类构造方法的访问特点
- 子类构造方法当中有一个默认隐含的额“super()“调用,所以一定是先调用父类构造,再执行子类构造。
- 子类构造可以通过super关键字来调用父类重载构造。
- super的父类构造调用,必须是子类构造方法的第一个语句。不能一个子类构造调用多次super构造。
- 子类必须调用父类构造方法,不写则赠送super();写了则用写的指定的super调用,super只能有一个,还必须是第一个。
2.6 super关键字和this关键字的比较
super关键字
- 在子类的成员方法中,访问父类的成员变量
- 在子类的成员方法中,访问父类的成员方法
- 在子类的构造方法中,访问父类的构造方法
this关键字
- 在本类的成员方法中,访问本类的成员变量
- 在本类的成员方法中,访问本类的另一个成员方法
- 在本类的构造方法中,访问本类的另一个构造方法
在第三种用法当中注意:
① this(...)调用也必须是构造方法的第一个语句,唯一一个
② super和this两种构造调用,不能同时使用。
3 抽象
3.1 定义
3.2 格式
抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束
抽象类:抽象方法所在的类,必须是抽象类才行。在class之前写上abstract即可
3.3 步骤
- 不能直接创建new抽象类对象,必须用一个子类来继承抽象父类
- 子类必须覆盖重写抽象父类当中所有的抽象方法
- 覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号。
- 创建子类对象进行使用
注意事项:
关于抽象类的使用,以下为语法上要注意的细节,虽然条目较多,但是若理解了抽象的本质,无需死记硬背。
1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。
2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。
3.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。
如:public abstract class MyAbstract{}
4. 抽象类的子类,必须重写抽象父类当中的所有抽象方法;否则,编译无法通过而报错,除非该子类也是抽象类。
理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象方法,没有意义。