目录
1.继承
1.1 为什么使用继承
多个类之间有相同的属性和方法时,可以将这些属性和方法抽取出来封装在一个新的类中,并使这些类继承这个新的类,以减少代码的冗余性。
1.2 继承的语法结构
关键字 extends
在定义子类时语法为 public class A extends B{},其中A是子类,B是父类
一个类只能继承一次也就是说一个子类只能属于一个父类,子类可以继承父类的属性和方法,构造方法无法被继承。
public class B {
String name;
public void show(){
System.out.print("我是B");
}
}
public class A extends B{
public A(){
name = "A";//可以直接使用属性
}
public void print(){
show();//可以直接调用show方法
System.out.println("我是子类"+name);
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
a.print();
}
}
1.3 super
super是对父类的引用,只能在子类中使用,使用的方法与this类似,可以调用父类的属性,方法以及构造方法,使用条件可以参考this的使用条件。
1.3.1 对父类属性调用
使用super引用父类属性时可以使用super.父类属性名,但必须要使用这个调用。
1.3.2 对父类方法的调用
使用super引用父类方法时,需要放在子类的方法中才能使用。
1.3.3 对父类构造方法的调用
使用super引用父类构造方法时,与this一样,要放在第一行。
1.4 访问修饰符
“√”表示允许访问的权限
1.4.1 本类
在本类当中可以访问所有属性和方法。
1.4.2 同包不同类
同包不同类的情况下,可以访问除private修饰符以外的其他类的属性和方法。
1.4.3 不同包,子类
不同包的子类,可以访问父类的protected和public修饰符的属性和方法。
1.4.4 不同包,非子类
不同包,无继承关系时,只能访问public修饰符下的属性和方法。
1.5 继承的初始化顺序
在调用一个子类创建对象时,会按照以上顺序进行该子类对象的初始化,先父后子,先属性后构造方法。注意,每个子类的构造器中都默认存在super(),而每个类都默认存在一个无内容的无参构造器,因此当子类无自定义的构造器或存在自定义构造器但未调用父类自定义构造器时会产生报错,内容是提示父类不存在默认的构造器,我们需要手动创建一个父类的无参构造器。
2.重写
2.1 重写定义
当子类中具有与父类中相同的方法(属性也可以重写,但一般不会使用)时,可以理解为该方法在子类中被重写了,在执行子类的该方法时,会执行子类当中重写的方法,而不会执行父类的同名方法。
2.2 重写规则
(1)构造方法无法继承,因此也无法重写构造方法
(2)需要在子类方法中
(3)方法名相同(不同的话就是子类独特的方法);参数列表相同(不同的话类似于方法重载)
(4)返回值类型相同或者是其子类(对象)
错误示例
(5)访问权限不能严于父类
错误示例
2.3 重写与重载的区别
3.抽象
3.1 抽象的定义
父类是对子类相同部分的抽象和概括,因此父类实际上一般情况下不具有其本身的对象实例,因此我们不应该使用父类创建其对象实例,而将其作为一个抽象的概念对子类进行限定,所以有时要将父类定义为抽象类。
3.2 抽象类
关键字为abstract,抽象类无法实例化。
3.3 抽象方法
3.3.1 抽象方法的定义
抽象方法是在抽象类中定义的方法,意味着该类的每个子类都需要对该方法进行重写,抽象方法同样使用关键字abstract定义,并且不能具有方法体,使用";"结束语句。
正确示例
错误示例
3.3.2 抽象方法在子类中的重写
当父类具有抽象方法时,子类必须对该方法进行定义,否则会报错
除非子类也是抽象类
4. final
4.1 final修饰类
final修饰类,表示该类已经是最终类,不能再被继承。
4.2 final修饰方法
final修饰方法,表示该方法无法被子类重写
4.3 final修饰属性
final修饰属性,表示该属性为常量,在初始化后无法再被修改