继承
继承关系中的特点:
1、子类可以拥有父类的内容。
2、子类还可以拥有自己的专有内容。
继承解决的问题:共性抽取
在继承的关系中,“子类就是一个父类”,也就是说,子类可以被当做其他类的父类来看待
继承的格式(一个普通类的定义):
父类A
public class A{
}
子类B继承A
public class B extends A{
}
继承中成员变量的访问特点
1、直接通过子类对象访问成员变量:
在new 对象时等号左边时谁,就优先用谁,没有则向上找。
Demo:
父类:
public class A{
int num = 10;
}
子类:
public class B extends A{
int num = 20;
int numB = 100;
}
实现类:
public static void main(String[] args){
//创建一个父类对象
A a = new A();
//父类对象a调用A中变量 可以
System.out.println(a.num) //打印结果 10
//父类对象a调用B中变量 不可以
/*
System.out.println(a.numB) //错误父类不能查找子类中的变量
*/
//创建一个子类对象
B b = new B();
System.out.println(b.num) //打印结果 20
System.out.println(b.numB) //100
}
2、间接通过成员方法来访问成员变量:
该方法属于谁,则优先用谁,没有则向上找。
Demo:
父类A:
public class A{
//A中的成员方法
public void methodA(){
System.out.println("A的成员方法");
}
public void method(){
System.out.println("A中的method成员方法");
}
}
子类B:
public class B extends A{
//B中的成员方法
public void methodB(){
System.out.println("B的成员方法");
}
public void method(){
System.out.println("B中的method成员方法");
}
}
实现类:
public static void main(String[] args){
//创建一个父类对象
A a = new A();
//创建一个子类对象
B b = new B();
//a调用本类成员方法 可以
a.methodA();
//a调用子类成员方法 不可以
a.methodB()
//子类可以调用负类的成员方法
b.methodA(); //可以调用父类的成员方法,先在子类中查找,没找到时,再在父类中查找
b.methodB(); //可以调用本类的成员方法
//当子类和父类中有一个名字相同的方法时,调用时看用谁的对象来调用,用谁的对象就用谁的成员方法
b.method(); //运行B的method方法
a.method(); //运行A的method方法
}
区分子类方法中重名的三种变量:
关键字:
this :访问本类中的成员变量
super:访问父类中的成员变量
继承中成员方法的访问特点
在父子类的继承关系中,创建子类对象,访问成员方法的规则:
创建的对象是谁的,就优先用谁的成员方法,如果没有就向上找。
注意事项:
无论是成员变量还是成员方法,如果都没有都是向上找父类,绝不会向下找子类。
继承中方法的覆盖重写(override)
**概念:**在继承关系中,方法的名称一样,参数列表也一样
注意区分重载(overload): 方法的名称一样,参数列表不一样
特点:创建的是谁的对象,就优先用谁的方法。
注意事项
1、必须保证父子类之间方法名称的相同,参数列表相同。
【@Overeide***】写在方法前面用来检测*是不是有效的正确覆盖重写(可以不写)。
2、子类方法返回值类型必须**【小于等于】**父类方法的返回值类型。
3、子类方法的权限修饰符必须【大于等于】父类方法的权限修饰符。
public > protected > (不写留空) > private
继承中构造方法的访问特点:
1、子类的构造方法中会默认隐含一个"***super()***"调用来执行父类的构造方法,而且位于子类构造方法的第一句。
Demo:
父类
public class Fu(){
public Fu(){
System.out.println("父类方法执行了!");
}
}
子类
public calss Zi extends Fu(){
public Zi(){
//super(); 这句话为编译器默认赠送的,可以写也可以不写
System.out.println("子类方法执行了!");
}
}
实现类
public static void main(String[] args){
Zi zi = new Zi();
//运行时先调用子类构造方法,在子类中发现super()时,跳转到父类的构造方法中执行父类的构造方法
}
运行结果:
父类方法执行了!
子类方法执行了!
2、子类可以通过**super关键字来调用父类重载构造。
***super(参数列表)***,参数列表不同会引起重载构造,和一般方法重载一样。
3、***super***的父类构造调用,必须是子类构造的第一个语句。this在调用本类方法时,也必须是方法里面的第一个语句,不能一个子类构造中调用多次***super***构造。