继承:
1)提高了代码的复用性
2)让类与类之间产生了关系,有了这个关系,才有了多态的特性
3)java只支持单继承,不支持多继承
子类中成员的特点:
class Fu{
int num=4;
}
class Zi extends Fu{
int num=5;
}
class ExtendsDemo{
public static void main(String[] args){
Zi z=new Zi();
System.out.println(z.num+"......"+z.num);
}
}
结果为:5......5
class Fu{
int num=4;
}
class Zi extends Fu{
int num=5;
void show(){
System.out.println(super.num);
}
}
class ExtendsDemo{
public static void main(String[] args){
Zi z=new Zi();
z.show()
}
}
结果为:4
变量
如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量用this,子类要访问父类中的同名变量用super
class Fu{
void show(){
System.out.println("fu show");
}
}
class Zi extends Fu{
void show(){
System.out.println("zi show");
}
}
class ExtendsDemo{
public static void main(String[] args){
Zi z=new Zi();
z.show()
}
}
结果是:zii show
子父类中的函数:
1)当子类出现和父类一模一样的函数时,子类对象调用该函数会运行子函数的内容,这种是函数的重写(覆盖)
2)子类覆盖父类,必须保证子类权限大于等于父类权限
3)静态函数只能覆盖静态
说明:重载只看同名函数的参数列表,重写的子父类方法要一模一样
子父类中的构造函数
在对子类对象初始化时,父类的构造函数也会运行;那是因为子类的构造函数默认第一行有一条隐式的语句super;super()会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super()
class Fu{
Fu(){
System.out.println("fu show");
}
}
class Zi extends Fu{
Zi(){
System.out.println("zi show");
}
Zi(int x){
System.out.println("zi…"+x);
}
}
class ExtendsDemo{
public static void main(String[] args){
Zi z=new Zi();
Zi z=new Zi(4);
}
}
结果为:
fu show
zi show
zi…4
class Fu{
Fu(int x){
System.out.println("fu show");
}
}
class Zi extends Fu{
Zi(){
super(4);
System.out.println("zi show");
}
Zi(int x){
super(3)
System.out.println("zi…"+x);
}
}
class ExtendsDemo{
public static void main(String[] args){
Zi z=new Zi();
Zi z=new Zi(4);
}
}
结果为:
fu show
zi show
fu show
zi…3
为什么子类一定要访问父类中的构造函数