文章目录
- 一、继承概述
- 二、内存运行原理 ★
- 三、继承的特点
- 四、继承后:成员变量和方法的访问特点
- 五、继承后:方法重写
- 六、继承后:子类构造器的特点
- 七、继承后:子类构造器访问父类有参构造器
- 八、this、super 总结
一、继承概述
Java 允许一个类通过 extends 关键字与另一个类建立父子关系,这就是继承。
格式: 子类 extends 父类
特点: 子类继承父类后,就可以得到父类的属性和行为。
优点: 提高代码的复用性,多个子类的相同代码可以放在父类中,增强了类的扩展性。
设计规范: 子类共用属性和行为放在父类,子类独有属性和行为放在子类自己那里。
二、内存运行原理 ★
public class People{
private String name;
private int age;
/**
* 共同行为
*/
public void queryCourse(){
System.out.println(name + "查看课表信息!!");
}
// getter + setter
}
public class Student extends People{
private String className;
/**
* 独有行为
*/
public void writeInfo(){
System.out.println(getName()+" 写作业!!");
}
// getter + setter
}
public class Test{
public static void main(string[] args){
Student s = new Student();
s.setName("翠花"); // 父类的
s.setAge(22); // 父类的
s.setclassName("Java就业999期");// 子类的
s.queryCourse(); // 父类的
s.writeInfo(); // 子类的
}
}
学生对象内存图如下:
三、继承的特点
-
子类可以继承父类的属性和行为,但是 子类不能继承父类的构造器。
-
子类可以继承父类私有成员吗?
有争议,我认为可以,只是不能直接访问。可通过访问父类的方法,间接访问父类私有成员。 -
子类可以直接用子类名访问父类静态成员。那么子类继承了父类静态成员吗?
我认为没有继承,只能可以共享的去访问父类静态成员,共享并非继承。 -
Java是单继承模式:一个类只能继承一个直接父类。反证法如下:
-
Java 不支持多继承,但是支持多层继承。
-
Java 中所有的类都是 Object 类的子类。
四、继承后:成员变量和方法的访问特点
采用:就近原则
this.子类自己的成员变量; super.父类成员变量/父类成员方法(父类成员是public)
public class Animal{
public String name = "动物的名字";
public void run(){
System.out.println("动物可以跑~~");
}
}
public class Dog extends Animal{
public String name = "狗的名字";
public void run(){
System.out.println("狗可以跑~~");
}
public void showName(){
String name = "临时的名字";
System.out.println(name); // 访问局部变量name
System.out.println(this.name); // 访问子类name。如果没有同名临时变量,name就是子类 name,不用加 this
System.out.println(super.name); // 访问父类name
super.run(); // 访问父类
run(); // 访问子类
}
}
public class Test {
public static void main(String[] args) {
// 目标:理解继承后成员的访问特点:就近原则
Dog dog = new Dog();
dog.run(); // 狗可以跑~~
dog.showName();
}
}
五、继承后:方法重写
六、继承后:子类构造器的特点
七、继承后:子类构造器访问父类有参构造器
八、this、super 总结
注意:
子类通过 this(…)
去调用本类的其他构造器,本类其他构造器会通过 super
去手动调用父类的构造器,最终还是会调用父类构造器。
super(…)
必须放在第一行,this(…)
也必须在第一行,因此二者不能共存一个构造器中。
文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)