前言
继承是面向对象语法的三大特征之一。继承可以降低代码编写的冗余度,提高编程的效率。通过继承,子类获得了父类的成员变量和方法。一个子类如何继承父类的字段和方法,如何修改从父类继承过来的子类的方法呢。
- 什么是继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。比如:简单举个例子
//父类
class A{
//父类的成员变量
public int a1=10;
public int a2=20;
//父类的成员方法
public void show(){
System.out.println("父类的成员方法");
}
}
//子类继承父类
class B extends A{
//子类的成员变量
public int a3=30;
public int a4=40;
//子类的成员方法
public void func(){
System.out.println("子类的成员方法");
}
}
public class test {
public static void main(String[] args) {
B b= new B();
System.out.println("a1="+b.a1);
System.out.println("a2="+b.a2);
//a3,a4,show都是B继承A下来的
System.out.println("a3="+b.a3);
System.out.println("a4="+b.a4);
b.show();
}
}
我从这代码可以看出子类B把父类A的成员变量和成员方法继承了下来,这就是继承
-
继承的语法
在java里如果要表示类之间的继承,需要借助extends关键字,格式如下:
修饰符 class 子类 extends 父类{
//..........................
}
-
不同名和同名的情况
再举个例子还是上面那个代码改一下:
//父类
class A{
//父类的成员变量
public int a1=10;
public int a2=20;
//父类的成员方法
public void show(){
System.out.println("父类的成员方法");
}
}
//子类继承父类
class B extends A{
//子类的成员变量
public int a2=30;
public int a4=40;
//子类的成员方法
public void show(int i){
System.out.println("子类的成员方法");
System.out.println(i);
}
public void func(){
System.out.println("子类的成员方法");
}
}
public class test {
public static void main(String[] args) {
B b= new B();
//a1调用是父类的成员变量
System.out.println("a1="+b.a1);
//a2调用是自己的成员变量
System.out.println("a2="+b.a2);
//a4调用是自己的成员变量
System.out.println("a4="+b.a4);
//调用是父类的成员方法
b.show();
//调用是子类的成员方法
b.func();
b.show(10);
}
}
总结
在子类通过访问成员变量时:
1. 如果访问的成员变量子类中有,优先访问自己的成员变量
2. 如果访问的成员变量子类中无,则访问子类继承父类的成员变量,如果父类也无定义,则编缉报错
3 如果访问的成员变量同名,则优先访问自己的
在子类通过访问成员方法时:
1. 如果访问的成员方法子类中有,优先访问自己的成员方法
2 .如果访问的成员方法子类中无,则访问子类继承父类的成员方法,如果父类也无定义,则编缉报错
3. 如果访问的成员方法同名时,父类和子类同名方法的参数列表不同(重载),根据调用方法传递的参数选择合适的方法访问,如果没有则报错
-
super关键字
那问题来了如果在子类和父类同名的情况下,那如何访问父类相同的成员呢?
从上面代码可以看出直接访问是做不过到的,所以java里提供了super关键字,该关键字的作用就是在子类方法访问父类的成员的,也很简单.比如:
class A{
public int a=10;
public int b=20;
}
class B extends A{
public int a=10;
public int b=20;
public void show(){
//对于同名直接访问都是子类的
a=100;//等价this.a
System.out.println(a);
b=200; //等价this.b
System.out.println(b);
//同名情况访问父类要借助super关键字
System.out.println(super.a);
System.out.println(super.b);
}
}
public class test {
public static void main(String[] args) {
B b= new B();
b.show();
}
所以在子类方法中,要想访问父类的成员时,就要借助super关键字可以了
而访问同名的方法(重载),通过调用方法传递的参数选择合适的方法访问就行
注意事项
1. 只能在非静态的方法中使用
2. 要子类方法中,访问父类的成员变量和方法