使用super访问被子类覆盖的父类成员
super可以改变父类非私有成员的可见性
super.父类成员变量名
super.父类成员方法名(参数值)
e.g:
class A
{void f(){System.out.println("AA");}
void g(){System.out.println("BB");}
}
class B extends A
{void f(){System.out.println("CC");}
void g(){super.g();System.out.println("DD");}
}
class D
{public static void main(String args[])
{B b=new B();
b.f();//CC
b.g();//BB DD
}}
e.g:class A
{int x=2;}
class B extends class A
{int x=3;
void f(){System.out.println(x+","+this.x+","+super.x);}
}
class D
{public static void main(String args[])
{B b=new B();
b.f();//3,3,2
}}
使用super调用父类的构造方法
super调用语句必须是子类构造方法中的第一条可执行语句
即先调用执行父类构造方法初始化从父类继承来的成员
再执行本类构造方法初始化自定义新成员
格式:super(参数值);
e.g:
class A
{int x=2;A(int k){x=k;}
}
class B extends A
{int y=3;B(int m,int n){super.(m);y=n;}
void f(){System.out.println(x+","+y);}
}
class D
{public static void main(String args[])
{B b=new B();//b.x=4,b.y=5
b.f();//4,5
}}
e.g:classs A
{A(){System.out.println("AA");}}
class B extends A
{B(){System.out.println("BB");}}
class D extends B
{D(){System.out.println("DD");}}
class E extends B
{E(){System.out.println("EE");}}
class M
{public static void main(String args[])
{D d=new D();//AA BB DD
E e=new E();//AA BB EE
}}
e.g:
class A{int x=0;A(int y){x=y;}}
class B extends A
{//B(){super();}非法
B(int m,int n){super(m+n);}
B(){super(2);}
void f(){System.out.println(x);}
}
class D
{public static void main(String args[])
{B b=new B();//b.x=2
b.f();//2
B c=new B(3,4);//b.x=7
c.f();//7
}}
6-3 类的多态
方法重载和同名覆盖
同一个类的成员方法间重载:
要求方法形式参数的个数,类型,顺序不完全相同
不同类型之间的常用方法重载:
系统根据调用类对象名进行区分
子类和父类的成员方法之间也可以重载
同名覆盖只发生在有继承关系的类之间
e.g:class A
{void f(){System.out.println("AA");}
void f(int x){System.out.println("AA"+x);}
}
class B extends A{void f(){System.out.println("BB");}}
class D
{public static void main(String args[])
{A a=new A();
a.f();//AA
a.f(2);//AA2
B b=new B();
b.f();//BB
b.f(3);//AA3
}}
赋值相容原理:
在需要父类对象的任何地方,都可以使用其子类对象替代它
赋值相容性不可逆
是多态的基础;