java继承详解

1继承的最基本实现

继承是子类在父类已有功能和属性的基础上,子类对父类进行扩充,只需要在子类中定义父类没有的功能或属性,相同的会从父类中继承过来。

package ExtendLearn;

class Person {
    private String name;
    private int age;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age=age;
    }
}
class Student extends Person{
    private String schoolName;
    public String getSchoolName()
    {
        return schoolName;
    }
    public void setSchoolName(String schoolName)
    {
        this.schoolName=schoolName;
    }
}
public class Test{
    public static void main(String[] args)
    {
        Student student=new Student();
        student.setName("qzf");
        student.setAge(19);
        student.setSchoolName("山东科技大学");
        System.out.println("学校:"+student.getSchoolName() +" 姓名:"+student.getName()+"  年龄:"+student.getAge());
    }
}

输出结果在这里插入图片描述
可以看到子类可以使用父类中定义的方法,访问父类中定义的属性。

2继承需要注意的点

1创建子类对象时,优先调用父类的构造,然后调用子类的构造

package ExtendLearn;

class Person {
    private String name;
    private int age;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    protected void setAge(int age)
    {
        this.age=age;
    }
    // person的构造
    public Person()
    {
        System.out.println("Person的构造");
    }
}

class Student extends Person{
    private String schoolName;
    public String getSchoolName()
    {
        return schoolName;
    }
    public void setSchoolName(String schoolName)
    {
        this.schoolName=schoolName;
    }
    //Student的构造
    public Student()
    {
        System.out.println("Student的构造");
    }
}
public class Test{
    public static void main(String[] args)
    {
        Student student=new Student();
        student.setName("qzf");
        student.setAge(19);
        student.setSchoolName("山东科技大学");
        System.out.println("学校:"+student.getSchoolName() +" 姓名:"+student.getName()+"  年龄:"+student.getAge());
    }
}

运行结果:
在这里插入图片描述

2不能进行多继承

package ExtendLearn;

class Person {
    private String name;
    private int age;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    protected void setAge(int age)
    {
        this.age=age;
    }
    // person的构造
    public Person()
    {
        System.out.println("Person的构造");
    }
}
class Class{
    private String Classname;
    public void setClassname(String Classname) {
        this.Classname = Classname;
    }
    public String getClassname()
    {
        return Classname;
    }
}
class Student extends Person,Class{ //在这一行会报错
    private String schoolName;
    public String getSchoolName()
    {
        return schoolName;
    }
    public void setSchoolName(String schoolName)
    {
        this.schoolName=schoolName;
    }
    //Student的构造
    public Student()
    {
        System.out.println("Student的构造");
    }
}
public class Test{
    public static void main(String[] args)
    {
        Student student=new Student();
        student.setName("qzf");
        student.setAge(19);
        student.setSchoolName("山东科技大学");
        System.out.println("学校:"+student.getSchoolName() +" 姓名:"+student.getName()+"  年龄:"+student.getAge());
    }
}

如果多继承,第38行出现报错
在这里插入图片描述
可以采用多层继承完成

package ExtendLearn;

class Person {
    private String name;
    private int age;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    protected void setAge(int age)
    {
        this.age=age;
    }
    // person的构造
    public Person()
    {
        System.out.println("Person的构造");
    }
}
class Class extends Person{
    private String Classname;
    public void setClassname(String Classname) {
        this.Classname = Classname;
    }
    public String getClassname()
    {
        return Classname;
    }
}
class Student extends Class{
    private String schoolName;
    public String getSchoolName()
    {
        return schoolName;
    }
    public void setSchoolName(String schoolName)
    {
        this.schoolName=schoolName;
    }
    //Student的构造
    public Student()
    {
        System.out.println("Student的构造");
    }
}
public class Test{
    public static void main(String[] args)
    {
        Student student=new Student();
        student.setName("qzf");
        student.setAge(19);
        student.setSchoolName("山东科技大学");
        student.setClassname("计科四班");
        System.out.println("学校:"+student.getSchoolName() +" 班级: "+ student.getClassname()+" 姓名:"+student.getName()+"  年龄:"+student.getAge());
    }
}

运行结果:在这里插入图片描述

3在继承的时候子类会继承父类的所有结构

这个继承包括:私有属性、构造方法、所有普通方法。

  • 显示继承 所有非私有操作属于显示继承,可以直接调用。
  • 隐式继承 所有私有的操作属于隐式继承,需要通过其他方式调用、
    例如像私有的方法继承后就不能直接调用
package ExtendLearn;

class Person {
    private String name;
    private int age;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    protected void setAge(int age)
    {
        this.age=age;
    }
    // person的构造
    public Person()
    {
        System.out.println("Person的构造");
    }
}
class Class extends Person{
    private String Classname;
    public void setClassname(String Classname) {
        this.Classname = Classname;
    }
    public String getClassname()
    {
        return Classname;
    }
}
class Student extends Class{
    private String schoolName;
    public String getSchoolName()
    {
        return schoolName;
    }
    public void setSchoolName(String schoolName)
    {
        this.schoolName=schoolName;
    }
    //Student的构造
    public Student()
    {
        System.out.println("Student的构造");
    }
}
public class Test{
    public static void main(String[] args)
    {
        Student student=new Student();
        student.setName("qzf");
        student.setAge(19);
        student.setSchoolName("山东科技大学");
        student.setClassname("计科四班");
        System.out.println("学校:"+student.getSchoolName() +" 班级: "+ student.getClassname()+" 姓名:"+student.getName()+"  年龄:"+student.getAge());
    }
}

在这个例子中:父类private中的属性,例如name,age不能够直接访问,属于隐式继承
public方法属于显示继承

4可以在子类中重写父类的方法

在这里插入图片描述
重写getName,输出的时候输出两个name

package ExtendLearn;

class Person {
    private String name;
    private int age;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    protected void setAge(int age)
    {
        this.age=age;
    }
    // person的构造
    public Person()
    {
        System.out.println("Person的构造");
    }
}
class Class extends Person{
    private String Classname;
    public void setClassname(String Classname) {
        this.Classname = Classname;
    }
    public String getClassname()
    {
        return Classname;
    }
}
class Student extends Class{
    private String schoolName;
    public String getSchoolName()
    {
        return schoolName;
    }
    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }
    //对getName方法的重写
    public String getName()
    {
        return super.getName()+super.getName();
    }
    //Student的构造
    public Student()
    {
        System.out.println("Student的构造");
    }
}
public class Test{
    public static void main(String[] args)
    {
        Student student=new Student();
        student.setName("qzf");
        student.setAge(19);
        student.setSchoolName("山东科技大学");
        student.setClassname("计科四班");
        System.out.println("学校:"+student.getSchoolName() +" 班级: "+ student.getClassname()+" 姓名:"+student.getName()+"  年龄:"+student.getAge());
    }
}

在这里插入图片描述
这里涉及到了super的使用,可以通过super调用父类的方法来重写子类的方法,还可以通过super重写父类的构造函数。
super不能调用private类型。
super在调用构造器的时候会一直向上检索,从父节点开始构造。

5向上转型和向下转型

向上转型
这个貌似不太常用,而且也不太好用,对上面的代码进行修改
System.out.println("学校:"+student.getSchoolName() +" 班级: "+ student.getClassname()+" 姓名:"+((Class)student).getName()+" 年龄:"+student.getAge());
输出:

Person的构造
Student的构造
学校:山东科技大学 班级: 计科四班 姓名:qzfqzf  年龄:19`

依旧没有调用父类的getName()函数;
把Class改为Person也是一样的结果。
在这里插入图片描述

改成这样会爆红,直接运行也不行
在这里插入图片描述
通过查阅资料,找到了一个应用场景,例如这样:

package ExtendLearn;


public class Test{
    public static void main(String[] args) {
        Son d=new Son();
        System.out.println(((Parent)d).tag);
    }
}
class Parent{
    public String tag="parent";
}
class Son extends Parent{
    private String tag="son";
}
package ExtendLearn;


public class Test{
    public static void main(String[] args) {
        Son d=new Son();
        System.out.println(((Parent)d).tag);
    }
}
class Parent{
    public String tag="parent";
}
class Son extends Parent{
    public String tag="son";
}

获得被覆盖的变量的值。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lndksk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值