继承:继承是一种根据已有的类创建新类的机制。我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类,新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。此处的一般类被称为父类,依据一般类创建的新类被称作子类。
作用:利用继承有利于实现代码的重复使用,当子类需要时,子类只需要添加 新功能 代码即可。
格式:
class 父类 {
成员变量;
成员方法;
}
class 子类 extends 父类 {
成员变量;
成员方法;
}
特点1:
Java只能单继承,不能够多继承,即一个类只能有一个父类
package java_01_26;
class A{
private int x=10;
protected int y=20;
public int z=30;
void f(){
y=y+x;
System.out.printf("x=%d,y=%d\n",x,y);
}
}
class B extends A{
void g(){
y=y+1;
System.out.printf("y=%d\n",y);
}
}
class Example5_2{
public static void main(String args[]){
B b=new B();
//System.out.println(b.x);//b.x不可访问,因为x是类A的私有成员变量,无法直接访问
System.out.println(b.y);//子类继承父类的成员变量y; y=20
System.out.println(b.z);//子类继承父类的成员变量z; y=30
b.g(); //调用子类自己声明的方法
//y=20,调用g()方法,y=20+1=21
b.f(); //调用从父类继承的方法
//执行完上一行代码后,y=21,x=10,调用f()方法,此时x=10,y=10+21=31
b.g(); //调用子类自己声明的方法
//执行完上一行代码后,y=31,调用g()方法,此时y=31+1=32
}
}
package java_01_26;
class A{
private int x=10;
protected int y=20;
public int z=30;
void f(){
y=y+x;
System.out.printf("x=%d,y=%d\n",x,y);
}
}
class Aa{
private int x=20;
protected int y=30;
public int z=40;
void fun(){
y=y*x;
System.out.printf("x=%d,y=%d\n",x,y);
}
}
class B extends A,Aa{//不能多继承
void g(){
y=y+1;
System.out.printf("y=%d\n",y);
}
}
class Example5_2{
public static void main(String args[]){
B b=new B();
//System.out.println(b.x);//b.x不可访问,因为x是类A的私有成员变量,无法直接访问
System.out.println(b.y);
System.out.println(b.z);
b.g(); //调用子类自己声明的方法
b.f(); //调用从父类继承的方法
b.g(); //调用子类自己声明的方法
}
}
类只能单继承,不能够实现多继承:
特点2:
Java可以有多层继承
package java_01_26;
class A{
private int x=10;
protected int y=20;
public int z=30;
void f(){
y=y+x;
System.out.printf("x=%d,y=%d\n",x,y);
}
}
class B extends A{
void g(){
y=y+1;
System.out.printf("y=%d\n",y);
}
}
class C extends B{
void fun(){
y=y*y;
System.out.printf("y=%d\n",y);
}
}
class Example5_2{
public static void main(String args[]){
C c=new C();
//System.out.println(c.x);//c.x不可访问,因为x是类A的私有成员变量,无法直接访问
System.out.println(c.y);//子类继承父类的成员变量y; y=20
System.out.println(c.z);//子类继承父类的成员变量z; y=30
c.fun(); //调用子类自己声明的方法 fun()
//y=20*20=400
c.g(); //调用子类父类B的方法 g()
//执行完上一行代码后,y=400,调用g()方法,y=400+1=401
c.f(); //调用从父类B继承的方法 f()
//执行完上一行代码后,y=401,x=10,调用f()方法,此时x=10,y=10+401=411
c.g(); //调用从父类B继承的方法 g()
//执行完上一行代码后,y=411,调用g()方法,此时y=411+1=412
}
}
类的继承关系示意图:(注:继承关系箭头为子类指向父类)