java继承详解

java继承详解,第1张

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";
}

获得被覆盖的变量的值。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/735562.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存