- 继承介绍
- 继承原理
- 继承使用细节
- 继承练习
- super关键字
- super使用细节
- this和super的比较
为什么需要继承? 比如有一个小场景,有两个类,一个是研究生类,另一个是小学生类。这两个类中有很多属性和方法是相同的,这样的话代码太冗余。怎么办?
这时候就用到了继承,用它来实现代码的复用性的问题。
- 继承的基本介绍 继承可以解决代码复用。当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的变量和方法。所有的子类不需要再重新定义这些属性和方法,只需要通过extends关键字来声明继承父类即可。
- 继承的基本语法 class 子类 extends 父类{}
注:
- 子类会自动拥有父类定义的属性和方法。
- 父类又叫超类、基类。
- 子类又叫派生类。
-
子类继承了所有的属性和方法,但是私有属性不能在子类中直接访问,要通过public方法来访问。
-
子类必须调用父类的构造器,完成父类的初始化。原因就是在子类的构造器中有一句隐藏的代码:super();,它会默认去调用父类的无参构造器。
-
当创建子类时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器。如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作(super(参数,[参数]…);),否则,编译不通过。
这里有个小注意点: 类中,默认有一个隐式无参构造器,但是如果一旦在类中又写了有参构造器,那么这个隐式无参构造器就消失了,就不存在了。这时候如果需要用到无参构造器,就需要自己显示得写一个出来。
-
如果希望指定去调用父类的某个构造器,则显示得调用一下。
-
super在使用时,需要放在构造器的第一行。
-
super()和this()都只能放在构造器的第一行,因此这两个方法不能共存在一个构造器。
-
java所有类都是Object类的子类。
-
父类构造器的调用不限于直接父类!将一直往上追溯到Object类(顶级父类)。
-
子类最多只能继承一个父类(指直接继承),即java中是单继承机制。
那么如果想让A类既继承B类,又继承C类,该怎么做? 可以让B继承C类,然后A继承B类,这样就达到了目的。
-
不能滥用继承,子类和父类之间必须满足is-a的逻辑关系。(意识就是子类和父类之间必须要有一些联系,比如有很多的相同属性或方法可以共用,那就直接继承。不然虽然也extends了,但是没有意义,违背了使用继承的初衷。)
编写Computer类,包含CPU、内存、硬盘等属性,getDetails方法用于返回Computer的详细信息。 编写PC子类,继承Computer类,添加特有属性:brand品牌。 编写NotePad子类,继承Computer类,添加特有属性:color。 编写Test类,在main方法中创建PC和NotePad对象,分别给对象中特有属性赋值,以及从Computer类继承的属性赋值,并使用方法打印输出信息。
package com.javaextend;
public class Test {
public static void main(String[] args) {
PC pc = new PC("Inter", 16, 2, "hp");
Notepad notepad = new Notepad("AMD", 32, 1, "black");
pc.Info();
notepad.Info();
}
}
class Computer{
String CPU;
int ROM;
int HandDisk;
public Computer(String CPU, int ROM, int handDisk) {
this.CPU = CPU;
this.ROM = ROM;
this.HandDisk = handDisk;
}
public String getDetails(){
return("CPU " + CPU + " ROM " + ROM + " G" + " HandDisk " + HandDisk + " T");
}
}
class PC extends Computer{
private String brand;
public PC(String CPU, int ROM, int handDisk, String brand) {
super(CPU, ROM, handDisk);
this.brand = brand;
}
public void Info(){
System.out.println(getDetails() + " Brand " + this.brand);
}
}
class Notepad extends Computer{
private String color;
public Notepad(String CPU, int ROM, int handDisk, String color) {
super(CPU, ROM, handDisk);
this.color = color;
}
public void Info(){
System.out.println(getDetails() + " color " + this.color);
}
}
//CPU Inter ROM 16 G HandDisk 2 T Brand hp
//CPU AMD ROM 32 G HandDisk 1 T color black
六、super关键字
-
基本介绍 super代表父类的引用,用于访问父类的属性、方法、构造器。
-
基本语法
- 访问父类的属性和方法,但不能访问父类的private属性和private方法:super.属性名;、super.方法名(参数列表);。
- 访问父类的构造器:super(参数列表);,只能放在构造器的第一句,并且只能出现一句。
-
super的好处 当子类中有和父类重名的属性或方法时,为了访问父类的成员,必须通过super关键字。如果没有重名,使用super、this、直接访问的效果是一样的。
注:
super();只能在构造器中使用,但是super.xxxx表示调用父类的属性或方法,这个可以在成员方法中使用。
七、super使用细节super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类中都有同名的成员,使用super访问遵循,就近原则。
八、this和super的比较