继承类(成员变量成员方法访问特点)
概念:
继承是指在已存在的类的基础上扩展产生新的类。已存在的类称为基类(或父类、基类、超类),新产生的类称为子类(或派生类)。
注解: 就相当于一位师父会九阳真经,长虹贯日;其大徒弟,二徒弟在师父不断教导下也会九阳真经与长虹贯日。注意此处继承与子承父业不完全一样
意义:
继承是面向对象程序设计的三大特征(封装、继承和多态)之一,不具有继承功能的语言不能称之为面向对象程序设计语言(如VB)。其中解决的主要问题就是:共性抽取。
特点:
- 子类可以拥有父类的“内容”
- 子类可以拥有自己专有的“内容”
注解:类比一下学校中,对于学校领导,老师,员工,他们都存在姓名与工号(这些就是可以继承的内容),但是他们每个人所在学校的行为却不一样(这就是他们自己专有的内容。
使用方法:
package cn.kobe.day01.demo01;
/*
在继承关系中:“子类就是一个父类”。也就是说,子类可以被当作父类看待。
例如:父类是员工,子类是讲师,那么“讲师就是一个员工”。
关系:is-a (Speaker is a Employee.)
定义父类的格式:(一个普通的类定义)
public class 父类名称{
}
定义子类的格式:
public class 子类名称 extends 父类名称{
//...
}
*/
public class DemoExtend {
}
访问方式:
1.子类父类没有重名
直接访问,访问谁就直接调用谁。
package cn.kobe.day01.demo01;
public class DemoNum_Main {
public static void main(String[] args) {
Father father = new Father();
System.out.println(father.num01);
Sun sun = new Sun();
System.out.println(sun.num01);
System.out.println(sun.num02);
}
}
Father类
package cn.kobe.day01.demo01;
public class Father {
int num01 = 10;
}
Sun类
package cn.kobe.day01.demo01;
public class Sun extends Father {
int num02 = 20;
}
结果
10
10
20
2.子类父类存在重名
在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
- 直接通过子类对象访问成员变量:等号左边是谁就直接访问谁,没有则向上找;
- 间接通过成员方法访问成员变量:该方法属于谁就优先用谁,没有就想上找。
1.重名成员变量一个在父类,一个在子类
Main
package cn.kobe.day01.demo01;
public class DemoNum_Main {
public static void main(String[] args) {
Father father = new Father();
System.out.println(father.num01);
Sun sun = new Sun();
System.out.println(sun.num01);
System.out.println(sun.num02);
System.out.println("==================");
//存在重名
//等号左边是谁就直接访问谁,没有则向上找
System.out.println(sun.num);
// System.out.println(sun.abc); //找不到则报错
System.out.println("==================");
//这个方法是子类的,优先使用子类的,没有再向上找
sun.methodSun();//200
//这个方法是在父类当中定义的
sun.methodFather();//100
}
}
Father
package cn.kobe.day01.demo01;
public class Father {
int num01 = 10;
int num = 100;
public void methodFather(){
//使用本类当中的,不会向下找子类
System.out.println(num);
}
}
Sun
package cn.kobe.day01.demo01;
public class Sun extends Father {
int num02 = 20;
int num = 200;
public void methodSun(){
//因为本类有num,所以这里用的是本类的
System.out.println(num);
}
}
结果
10
10
20
==================
200
==================
200
100
2.重名成员变量在三处
- 局部变量 :直接写成员变量名
- 本类的成员变量 :this.成员变量名
- 父类的成员变量 :super.成员变量名
Main
package cn.kobe.day01.demo02;
/*局部变量 直接写成员变量名
本类的成员变量 this.成员变量名
父类的成员变量 super.成员变量名*/
public class DemoNumFiled {
public static void main(String[] args) {
Sun sun = new Sun();
sun.method();
}
}
Father
package cn.kobe.day01.demo02;
public class Father {
//父类的成员变量 :super.成员变量名
int num = 100;
}
Sun
package cn.kobe.day01.demo02;
public class Sun extends Father{
// 本类的成员变量 :this.成员变量名
int num = 200;
public void method(){
// 局部变量 :直接写成员变量名
int num = 300;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
注意:
在父类的继承关系当中,创建子类对象,访问成员方法的规则:
创建的对象是谁就优先用谁,没有则向上找。无论是成员方法还是成员变量,如果没有,都是向上找,绝对不会向下找子类