继承问题引出
Java的第二大特性就是继承,所以我们来看看什么是继承
继承就是在原有的基础增加新的功能,而继承的方式就是由子类继承父类,简单来说就是儿子继承了爸爸的遗产,儿子自己本身也有一些财产和爸爸的遗产加在一起就变多了。
接下来声明两个类来继续分析
person(人类)
class Person{
private String name; //姓名
private int age; //年龄
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return this.age;
}
public void setAge(int age){
this.age = age;
}
//吃饭
public void show(){
System.out.println(this.name+"正在吃饭");
}
}
teacher(老师类)
class Teacher{
private String name; //姓名
private int age; //年龄
private String occupation; //职业 比如,数学老师,英语老师
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return this.age;
}
public void setAge(int age){
this.age = age;
}
public String getOccupation(){
return this.occupation;
}
public void setOccupation(String occupation){
this.occupation= occupation;
}
//吃饭
public void show(){
System.out.println(this.name+"正在吃饭");
}
//教书
public void teach(){
System.out.println(this.occupation+"要在下午第一节课去教书");
}
}
上面我创建了两个类,大家可以发现人类和老师类都是有名字和年龄这两个属性的,所以我们可以用老师类去继承人类,因为不管是什么职业只要是人都会有名字和年龄,老师相对于人描述呃范围就比较小,所以属性和方法也比较多,相当于是从人分支出来的。
因为老师类有和人类有一样的属性和方法所以我们可以继承,这样就不用每个类都写一样的属性了,由一个类拥有就行了。
继承的实现
java中是使用extends关键字来实现继承的
语法:
class 子类 extends 父类
public class Person {
private String name; //姓名
private int age; //年龄
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return this.age;
}
public void setAge(int age){
this.age = age;
}
//吃饭
public void show(){
System.out.println(this.name+"正在吃饭");
}
}
public class Teacher extends Person {
}
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.setAge(23);
teacher.setName("张三");
teacher.show();
}
}
输出结果:张三正在吃饭
继承后子类拥有父类的属性和方法,当然子类也可以进行扩展添加其他方法和属性。
public class Teacher extends Person {
private String occupation; //职业 比如,数学老师,英语老师
public String getOccupation(){
return this.occupation;
}
public void setOccupation(String occupation){
this.occupation= occupation;
}
//教书
public void teach(){
System.out.println(this.occupation+"要在下午第一节课去教书");
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.setAge(23);
teacher.setName("张三");
teacher.show();
teacher.setOccupation("数学老师");
teacher.teach();
}
}
输出结果:
张三正在吃饭
数学老师要在下午第一节课去教书
这样是不是感觉很方便,如果你要创建的职业太多而且大部分有相同的方法和属性只是小部分不一样,这样我们就可以把相同的属性和方法单独放到一个类中在由其他职业的类来继承,这样就可以减少很多代码,也不会造成冲突。
子类对象实例化流程
直接上代码
public class Person {
public Person() {
System.out.println("#####父类无参构造");
}
}
public class Teacher extends Person {
public Teacher(){
//super();
System.out.println("#####子类无参构造");
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
}
}
输出结果
#####父类无参构造
#####子类无参构造
子类初始化的时候会先调用父类的无参构造,然后在调用子类的构造方法
也就是在子类的构造方法里面默认加上了super关键字
继承定义的限制
- 在java中不予许多继承只能单继承,可以多层继承
- 在实例化的时候先调用父类构造方法,再调用子类构造方法