继承是多态的前提,如果没有继承就没有多态
在面向对象程序设计中,继承表示两个类之间的一种从属关系。
子类不仅仅可以从父类继承成员变量和成员方法,还可以重新定义它们,以及扩充新的内容。
一个父类可以同时拥有多个子类。一个类只能有一个父类。
在讲师类和助教类中都姓名和工号,重复几次,我们就要重复的编写代码。所以在程序当中继承主要就是解决的问题就是:共性抽取(解决重复代码)。所以我们就来定义一个员工类,这样讲师和主教都是属于员工类,我们就可以继承员工类。
继承关系的特点:(1)子类可以拥有父类的“内容”
(2)子类还可以拥有自己的专属内容
例如:我们定义一个父类
package com.smxy.koi.jicheng;
public class Empoloyee {
public void method(){
System.out.println("方法执行!!");
}
}
接下来定义一个子类(Teacher)
选择Browse
这个时候我们的子类就已经继承了我们的父类了(如下图所示)
我们的Teacher里面不写任何方法,然后在我们的测试类中调用Teacher
package com.smxy.koi.jicheng;
public class Teacher extends Empoloyee {
}
package com.smxy.koi.jicheng;
public class Test {
public static void main(String[] args) {
//创建一个子类对象
Teacher teacher=new Teacher();
//Teacher类当中虽然说什么都没有写,但是它会继承父类的method方法
teacher.method();
}
}
父类和子类发生了继承关系,如果使用了成员变量会有怎样的规则
首先创建一个父类
package com.smxy.koi.jicheng;
public class Fu {
int numFu=10;
}
然后在创建一个子类
package com.smxy.koi.jicheng;
public class Zi extends Fu{
int numZi=20;
}
这个时候父类就有一个值,但是子类就有两个值(例如如下)
当我们创建一个父的对象然后调用的时候就会发现只能调用一个
但是调用子类的时候就会发现是有两个可以调用,其中一个是父类的,另外一个是子类的
package com.smxy.koi.jicheng;
public class Test {
public static void main(String[] args) {
Fu fu=new Fu();//父类对象
System.out.println(fu.numFu);//只能使用父类东西,没有任何子类内容
Zi zi=new Zi();
System.out.println(zi.numFu);//10
System.out.println(zi.numZi);//20
}
}
子类可以拥有父类继承下来的东西
当父类和子类重名的时候
我们在子类中定义一个int num=200;
然后在父类中定义一个int num=100;
这样子类和父类就重名了
在父子类的继承关系中,如果成员变量重名,则创建子类对象时,访问有两种方式
- 直接通过子类对象访问成员变量
等号左边是谁,就优先用谁,没有则向上找
所以最后就是我们子类的200.
2.间接通过成员方法访问成员变量
在父类中创建一个方法
在子类中创建一个方法
我们在调用方法的时候,注意方法在哪优先哪里
区分子类方法重名三种
创建一个父类
package com.smxy.koi.jicheng;
public class Fu {
int num=10;
}
创建一个子类
package com.smxy.koi.jicheng;
public class Zi extends Fu{
int num=20;
public void methodZu(){
int num=30;
System.out.println(num);
}
}
这样我们通篇就有三个num
变量有三种
* 局部变量; 直接写成员变量
* 本类的成员变量; this.成员变量
* 父类的成员变量; super.成员变量
我们在子类的merhod方法中就拥有了三个num
package com.smxy.koi.jicheng;
public class Zi extends Fu{
int num=20;
public void method(){
int num=30;
System.out.println(num);//30;局部变量
System.out.println(this.num);//20;本类的成员变量
System.out.println(super.num);//10;父类的成员变量
}
}
我们在测试类中运行
package com.smxy.koi.jicheng;
/**
* 变量有三种
* 局部变量; 直接写成员变量
* 本类的成员变量; this.成员变量
* 父类的成员变量; super.成员变量
*
*
*/
public class Test {
public static void main(String[] args) {
Zi zi=new Zi();
zi.method();
}
}
这样无论是子类的怒骂,还是父类的num都可以被运行出来
当父类和子类中的方法一样
在父子类的继承关系中,创建子类对象,访问成员方法的规则,创建的对象是谁,就优先用谁,如果没有则向上找
注意:无论是成员方法还是成员变量,如果没有都是向上找父类,绝对不会向下找子类