继承
Java的面向对象有三大特性:封装性,继承性,多态性,继承是多态的前提,没有继承就没有多态。
继承就是将几个类共有的属性,抽象成一个类,在定义新的类时,可以直接继承调用共有的变量或方法。省去重复定义相同代码的麻烦
继承关系的特点是:
- 子类可以拥有负类的“内容”
- 子类还可以拥有自己专有的内容
父类叫做基类或超类,子类叫做派生类,每一个类都可以看作父类。
继承定义格式
public class 子类名称 extends 父类名称{
//
}
示例代码:
- 建立父类
public class ExampleFather {
public void method(String son) {
System.out.println("这是父类的方法,被" + son + "继承了");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
- 建立第一个子类:
public class ExampleSonFirst extends ExampleFather {
public void methodSonFirst() {
System.out.println("SonFirst类自己的方法");
}
public static void main(String[] args) {
}
}
- 建立第二个子类
public class ExampleSonSecond extends ExampleFather{
public void methodSonSecond() {
System.out.println("这是SonSecond类自己的方法");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
- 建立调试类,并定义子类的对象
public class TestExample {
public static void main(String[] args) {
ExampleSonFirst sonfirst = new ExampleSonFirst();
sonfirst.method("SonFirst");
sonfirst.methodSonFirst();
ExampleSonSecond sonsecond = new ExampleSonSecond();
sonsecond.method("SonSecond");
sonsecond.methodSonSecond();
}
}
输出结果如下:
父类和子类成员重名时访问规则
成员变量重名
在父子类的继承关系中,如果成员变量重名,则创建子类对象时,访问有两种方式:
直接通过子类对象访问成员变量: 等号左边是谁,就优先用谁,没有则往上找
间接通过成员方法访问成员变量: 该方法属于谁,就优先用谁,没有则向上找
代码示例:
建立如下父子类
public class Fu {
int numFu = 100;
int num = 2000;
public void methodFu() {
System.out.println(num);
}
}
public class Zi extends Fu{
int numZi=300;
int num=1000;
public void methodZi() {
System.out.println(num);
}
}
调试类定义对象,调用变量方法代码如下:
public class TestFuZi {
public static void main(String[] args) {
Fu fu = new Fu();
System.out.println(fu.numFu);
System.out.println("=================");
Zi zi = new Zi();
System.out.println(zi.numZi);
System.out.println(zi.numFu);
System.out.println("=================");
System.out.println(zi.num);
System.out.println("=================");
zi.methodZi();
zi.methodFu();
fu.methodFu();
}
}
输出结果:
成员方法重名
在父子类的继承关系当中,创建子类对象,访问成员方法的规则:
创建的对象是谁,就优先用谁,如果没有则向上找
注意: 无论是成员方法还是成员变量,如果没有都是向上找父类,绝不会向下找子类的
继承中方法的覆盖重写
重写(override):
在继承关系中,方法的名称一样,参数列表也一样。
覆盖重写的特点: 创建的是子类对象,就优先用子类的方法
** @override ** :写在方法前面,用来检测是不是有效的正确覆盖重写。 这是可选的,但是建议只要是重写方法都写上,检测重写方法是否正确。
子类方法的返回值必须小于等于父类方法的返回值范围
java.lang.Object 类是所有类的公共最高父类
super关键字
在子类中用super关键字直接访问父类的方法。在父类和子类有重名方法时,可以使用。
继承中构造方法的访问特点
继承关系中,父子类构造方法的访问特点:
- 子类构造方法当中有一个 默认隐含的"super"调用,所以一定是先调用的父类构造,后执行的子类构造。
- 可以通过super关键字来子类构造调用父类重载构造。
子类必须调用父类构造方法,不写则赠送super(),写了则用写的指定的super调用,super只能写一个。
————————————————————————————————