6.4 继承
继承的本质就是对类再次进行抽象,对类分类,从而实现个好的建模。继承是类和类之间的一种关系,除此之外,类之间还有依赖、组合、聚合等关系。
关键词是extands,java中的继承都是单继承,没有多继承。
继承关系的两个类,一个是子类,即派生类,一个是父类,子类继承父类。
子类和父类之间,具有“is a ”的关系,例如人和学生,那么两个类之间有“学生是人”的关系。
//父类
public class Person {
public void say(){
System.out.println("hahaha");
}
}
public class Student extends Person{
String name ;
int age;
public void study(){
System.out.println(this.name+"在学习");
}
}
子类可以继承父类所有public修饰的方法和属性。注意几点:
-
java中所有的类都是object类的子类。
-
单继承既是一个子类对应的只能是一个父类,但一个父类能对于很多子类。
-
super只能出现在子类中。
-
super不能调用父类private修饰的方法和属性。
-
调用构造方法时,super不能和this同时调用构造方法。
-
super调用构造方法时,会默认先调用父类的构造方法。此时,**this()**也可以使用
-
super调用父类构造器时,必须在子类构造器的第一行。
//父类
public class Person {
protected String name = "desmond";
public Person(){
System.out.println("1");
}
public void say(){
System.out.println("hahaha");
}
public void print(){
System.out.println("Person");
}
}
public class Teacher extends Person{
private String name = "alex";
public Teacher(){
this("name");
System.out.println(this.name);
}
public Teacher(String name) {
this.name = name;
}
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
然后是方法的重写:
重写与重载是不同的,重写只是针对方法的重写,与属性无关。
public class Pet {//父类
public void test(){
System.out.println("Pet");
}
}
public class Dog extends Pet{//子类
public void test(){
System.out.println("dog");
}
}
public class App {//app
public static void main(String[] args) {
Dog dog = new Dog();
dog.test();
Pet pet = new Dog();
pet.test();
}
}
注意几点:
- 重写不能重写静态方法。静态方法跟随所属的类。
- 子类与父类中重名的方法必须都是非静态的。
- 只能由父类重写转换为子类,不能把子类重写转换成父类
- 重写方法名必须相同,参数列表必须相同。
- 修饰符范围只能扩大不能缩小。public>protected>default>private
- 抛出异常的范围只能缩小不能扩大。
- 重写就是重写父类的方法体。
重写的意义就是父类的方法子类不一定需要或者满足,需要重写方法!