0
点赞
收藏
分享

微信扫一扫

Java系列(13)——类的继承

两岁时就很帅 2022-03-30 阅读 144


本系列博客汇总在这里:Java系列_汇总


目录

  • ​​一、简介​​
  • ​​二、继承语法​​
  • ​​三、继承的特点​​
  • ​​四、类的单继承,多继承(java不支持),多级继承​​
  • ​​五、接口的多继承​​
  • ​​六、继承的内存结构​​

一、简介

  继承:描述事物的时候,我们如果发现几个类有重复的属性和方法,我们就可以采用采用继承的方式来设计。

二、继承语法

  • 使用 extends 关键字来继承
  • class 子类  extends 父类
    {
    子类属性
    子类方法
    }

三、继承的特点

  1. 子类只能继承父类中的非 private 的属性,如果要继承就得提供公共的 set() 和 get () 方法,私有的方法和属性是子类无法继承下来的。
  2. 子类可以使用 extends 关键字继承父类的属性和方法以外,子类还可以有自己特有的属性和方法。
  3. 父类更通用,子类更具体。

四、类的单继承,多继承(java不支持),多级继承

  1. 单继承
  2. class A extends B                       
    {
    }
  3. 多继承(java不支持)
  4. class A extends B,C
    {
    }
  5. 多级继承
  6. class B extends A
    {
    }
    class C extends B
    {
    }
    //A称为超类
  7. 示例
  8. /*
    父类
    */
    class Teacher
    {
    private String name;
    private int age;

    //-------get()和set()方法,提供给外界访问和修改内部私有属性值-------
    public void setName(String name)
    {
    this.name = name;
    }

    public void setAge(int age)
    {
    this.age= age;
    }

    public String getName()
    {
    return this.name;
    }

    public int getAge()
    {
    return this.age;
    }
    //--------------------------------------------------------------------

    //父类方法
    public void sleep()
    {
    System.out.println("老师在睡觉");
    }
    }
    /*
    子类,继承Teacher类
    */
    class PHPTeacher extends Teacher
    {
    //子类独有方法
    public void teachPHP()
    {
    System.out.println(this.getName()+"老师在教php 年龄:" +this.getAge());//this是可以不写的,谁调用this就是谁
    }
    }
    /*
    子类,继承Teacher类
    */
    class JavaTeacher extends Teacher
    {
    //子类独有方法
    public void teachJava()
    {
    System.out.println(getName()+"老师在教java 年龄:" +getAge());
    }
    }
    /*
    主类
    */
    class Welcome
    {
    public static void main (String[] args)
    {
    JavaTeacher jt = new JavaTeacher();
    jt.setName ("张三");
    jt.setAge(9);
    jt.sleep();
    jt.teachJava();

    PHPTeacher pt = new PHPTeacher();
    pt.setName ("李四");
    pt.setAge(8);
    pt.sleep();
    pt.teachPHP();
    }
    }
  9. Java系列(13)——类的继承_php

五、接口的多继承

  • 示例代码
  • interface A
    {
    public void method();
    }
    interface B
    {
    public void method();
    }
    interface C extends A,B
    {
    }
    class Welcome
    {
    public static void main(String[] args)
    {
    }
    }
  • Java系列(13)——类的继承_子类_02
    从上面可以看出,接口可以多重继承。

六、继承的内存结构

Java系列(13)——类的继承_类的继承_03

方法区的 main() 方法先进栈,往下走 new 就会在堆中产生一个对象,栈中依然是存地址,此地址指向堆中的相应对象的地址,接下来因该是给属性赋值了,发现自己并没有给属性赋值的功能,就会到父类中去找,然后就会在 this 当中又产生一个实例,叫 super;于是在 super 就可以找到 name 和 age 了,然后就可以进行赋值了。之后 teachJava{}; 这个方法从方法区进栈,由于在 teachJava{}; 方法中调用的 name 和 age 是省略了他们之前的 this 的,那么谁调用 this,this.name 和 this.age 就是谁的,显然这个方法是 jt 调用的,jt 指向 0x999 这个地址,那么 teachJava{}; 方法中的 name 和 age 也指向 0x999 这个地址,进而进行了赋值等操作;之后的 teachPHP{}; 方法也是一样的。

如有错误,欢迎指正!



举报

相关推荐

0 条评论