1.为什么需要继承?
看两个简单的程序
package com.Extends;
public class 继承01 {
public static void main(String[] args) {
}
}
class pupil {
public String name;
public int age;
private double score;
public void setScore(double score) {
this.score=score;
}
public void testing() {
System.out.print("小学生"+name+"正在考数学");
}
public void showinfo() {
System.out.print("小学生"+name+"年龄"+age+"成绩为"+score);
}
}
这是一个模拟小学生考试的一个类,其中小学生有对应的名字,年龄,分数和方法。
package com.Extends;
public class 继承02 {
public static void main(String[] args) {
}
}
//模拟大学生考试
class graduate{
public String name;
public int age;
private double score;
public void setScore(double score) {
this.score=score;
}
public void testing() {
System.out.print("大学生"+name+"正在考数学");
}
public void showinfo() {
System.out.print("大学生"+name+"年龄"+age+"成绩为"+score);
}
}
这是模拟大学生考试考试的一个类,其中也含有姓名,年龄,分数等属性和方法,可以看出这两个小学生类和大学生类的属性和方法大致上是一样的,这个时候我们就不需要再一个一个敲代码合作和复制了,我们就可以使用继承(extend)来完成相应的工作。
2.继承的基本介绍和示意图
继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来声明继承父类即可。画出继承的示意图如下:
3.继承的基本语法
class 子类 extends 父类 {
}
1.子类会自动拥有父类的属性和方法;
2.父类又叫超类,基类;
3.子类又叫派生类。
4.使用继承后的代码如下
创建一个父类Studen
package com.Extends.improve;
public class student {
//父类,是pupil和gradua的父类
public static void main(String[] args) {
}
}
class Student{
//共有属性
public String name;
public int age;
private double score;
//共有方法
public void setScore(double score) {
this.score=score;
}
public void showinfo() {
System.out.print("大学生"+name+"年龄"+age+"成绩为"+score);
}
}
创建子类pupil和Graduate继承父类Studen
package com.Extends.improve;
public class pupil extends Student{
//让pupil继承stduent
public void testing() {
System.out.print("小学生正在考数学");
}
}
package com.Extends.improve;
public class Graduate extends Student{
public void testing() {
System.out.print("大学生"+name+"正在考数学");
}
}
创建一个测试类并运行
package com.Extends.improve;
public class text {
public static void main(String[] args) {
pupil p = new pupil();
p.age=10;
p.name="黎明";
p.setScore(82);
p.showinfo();
p.testing();
System.out.print("=================");
Graduate G= new Graduate();
G.age=22;
G.name="小王";
G.testing();
G.setScore(88);
G.showinfo();
}
}
5.继承给编程带来的便利
- 代码的复用性提高了;
- 代码的扩展性和维护性提高了.
6. 继承的深入讨论/细节问题
1.子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问子类必须调用父类的构造器, 完成父类的初始化 。
2.当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
3.如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)
4.super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
5.super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
6.java 所有类都是 Object 类的子类, Object 是所有类的基类.
7.父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)
8.子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。
9.不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系
7.JVM中继承的内存分布