一、继承的概念
继承是面向对象的一个显著特性。继承是从已有的类中派生出的新类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
二、语法格式
class 子类 extends 父类 {}
子类又称为派生类; 父类又被称为超类(Super Class)。
三、例子
class A {
private String name;
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
}
public class B extends A { // B类继承A类
public static void main(String args[])
{
B b=new B();// 实例化的是子类
b.setName("江江");// B类定义
System.out.print(b.getName());
}
}
运行结果:
江江
四、继承的限制
在JAVA中可以多层继承,但不能多重继承。
可以这样继承:
class A {}
class B extends A {}
class C extends B {}
但不能这样继承:
class A {}
class B {}
class C extends A,B {} // 一个子类继承了两个父类
但是 implements可以这样写
class A implements B,C,D,E {}
注意:
1)子类继承的时候,实际上会继承父类的所有操作(属性、方法),但是需要注意的是,对于非私有的属于显式继承(可直接利用对象操作),而所有的私有(private)操作属于隐式继承(需要间接完成)。
2)实例化子类对象时,它会默认先执行父类构造,调用父类构造的方法体执行,然后再实例化子类对象,调用子类的构造方法。而这个时候,对于子类的构造而言,就相当于隐含了一个 super()方法调用父类构造方法。
五、super()
super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
super有三种用法:
- 普通的直接引用。
与this类似,相当于是指向当前父类的对象,直接super.x 来引用父类的成员。
2)子类中的成员变量或方法与父类中的成员变量或方法同名。
例子:
class A {
String name;
void getName() {
name = "A";
}
}
public class C extends A{//C类继承A类
String name;
void getName() {
name = "C";
super.getName(); //调用父类的方法
System.out.println(super.name);
System.out.println(name);
}
public static void main(String[] args) {
C c=new C();// 实例化的是子类
c.getName();
}
}
运行结果:
A
C
3)引用构造函数
调用父类中的某一个构造函数。
注意:super调用父类构造时,一定要放在构造方法的首行上。
例子:
class A {
A() {
System.out.println("父类:无参数构造方法:");
}//构造方法(1)
A(String name) {
System.out.println("父类:有参数的构造方法: "+"name:" + name);
}//构造方法(2)
}
public class B extends A {
B() {
super(); // 调用父类构造方法
System.out.println("子类:调用父类”无参数构造方法“:");
}
B(String name) {
super(name);// 调用父类具有相同形参的构造方法
System.out.println("子类:调用父类”有参数的构造方法“: "+"name " + name);
}
B(String name,String str) {
this(name+str);// 调用具有相同形参的构造方法
System.out.println("子类: this(name)方法调用父类有参数的构造方法"+"name "+name+str);
}
public static void main(String[] args) {
B b = new B(); //无参
b = new B("江江"); //有参
b = new B("江江","This()"); //this(name) 调用具有相同形参的构造方法
}
}
运行结果:
父类:无参数构造方法:
子类:调用父类”无参数构造方法“:
父类:有参数的构造方法: name:江江
子类:调用父类”有参数的构造方法“: name 江江
父类:有参数的构造方法: name:江江This()
子类:调用父类”有参数的构造方法“: name 江江This()
子类: this(name)方法调用父类有参数的构造方法: name 江江This()