zoukankan      html  css  js  c++  java
  • javaSE笔记-继承

    继承的含义

    子类继承父类的属性和行为,使得子类对象可以直接具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。

    继承的好处

    ①提高代码的复用性

    ②使类与类之间产生了关系

    继承的格式

    class 子类 extends 父类

    注:java是单继承的,一个类只能继承一个直接父类

    案例

    Human.java

     1 //定义一个Human父类
     2 public class Human {
     3     String name; //姓名
     4     int age; //年龄
     5 
     6     //吃饭方法
     7     public void eat() {
     8         System.out.println("人在吃饭");
     9     }
    10     
    11     //睡觉方法
    12     public void sleep() {
    13         System.out.println("人在睡觉");
    14     }
    15 }

    Student.java

    1 //Student类
    2 public class Student extends Human {
    3 
    4 }

    Testcher.java

    1 //教师类
    2 public class Teacher extends Human {
    3     double salary; //薪水
    4 
    5     //教书方法
    6     public void teach() {
    7         System.out.println("老师在教java");
    8     }
    9 }

     HeadTeacher.java

    1 //班主任类
    2 public class HeadTeacher extends Human {
    3     double salary; //薪水
    4 
    5     //管理方法
    6     public void manage() {
    7         System.out.println("班主任在管理班级");
    8     }
    9 }

    Test.java

     1 //测试类
     2 public class Test {
     3     public static void main(String[] args) {
     4         //创建Student对象
     5         Student s = new Student();
     6         //继承了Human类,拥有了Human这个父类的非私有成员变量
     7         s.name = "张三";
     8         s.age = 18;
     9         System.out.println("姓名:" + s.name + ",年龄:" +  s.age);
    10 
    11         //拥有父类的非私有成员方法
    12         s.eat();
    13         s.sleep();
    14 
    15         System.out.println("--------------");
    16 
    17         //创建Teacher对象
    18         Teacher t = new Teacher();
    19         //父类的属性
    20         t.name = "李四";
    21         t.age = 20;
    22         t.salary = 6666; //Teacher类自己的属性
    23         System.out.println("姓名:" + t.name + ",年龄:" +  t.age + ",薪水:" + t.salary);
    24 
    25         //父类的方法
    26         t.eat();
    27         t.sleep();
    28         //自己的方法
    29         t.teach();
    30 
    31         System.out.println("--------------");
    32 
    33         //创建HeadTeacher对象
    34         HeadTeacher ht = new HeadTeacher();
    35         //父类的属性
    36         ht.name = "王五";
    37         ht.age = 22;
    38         ht.salary = 8888; //HeadTeacher类自己的属性
    39         System.out.println("姓名:" + ht.name + ",年龄:" +  ht.age + ",薪水:" + ht.salary);
    40 
    41         //父类的方法
    42         ht.eat();
    43         ht.sleep();
    44         //自己的方法
    45         ht.manage();
    46     }
    47 }

    运行结果

     

    小结:

    1、继承实际上是子类相同的属性和行为可以定义在父类中,子类特有的属性和行为由自己定义,这样就实现了相同属性和行为的重复利用,从而提高了代码复用。

     2、子类继承父类,就可以直接得到父类的成员变量和方法。

    子类不能继承的内容

    ①子类不能继承父类的构造器,因为子类有自己的构造器。

    ②子类不能继承父类的私有成员(成员变量,方法),但可以通过方法访问父类的私有成员。在内存的角度子类可以看到父类的私有成员。

    继承后的特点——成员变量

    成员变量不重名:如果子类父类中出现不重名的成员变量,这时的访问是没有影响的。

    成员变量重名:子父类中出现了同名的成员变量时,子类会优先访问自己对象中的成员变量。如果此时想访问父类成员变量如何解决呢?我们可以使用super关键字。

    super访问父类成员变量:super代表的是父类对象的引用,this代表的是当前对象的引用。

    继承后的特点——成员方法

    成员方法不重名:如果子类父类中出现不重名的成员方法,这时的调用是没有影响的。对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。

    成员方法重名:如果子类父类中出现重名的成员方法,则创建子类对象调用该方法的时候,子类对象会优先调用自己的方法。

    方法重写

    子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。

    使用场景和案例

    子类继承了父类的方法,但是子类觉得父类的这方法不足以满足自己的需求,子类重新写了一个与父类同名的方法,以便覆盖父类的该方 法。

     @Override重写注解

    这个注解标记的方法,就说明这个方法必须是重写父类的方法,否则编译阶段报错。

    注意事项

    ①方法重写是发生在子父类之间的关系。

    ②子类方法覆盖父类方法,必须要保证权限大于等于父类权限。

    ③ 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。

    继承后的特点——构造器

    子类是无法继承父类构造方法的。

    子类的构造方法中默认有一个`super()` ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。

    子类所有构造器的第一行都会先调用父类的无参构造器,再执行自己。

    案例演示

    小结:

    1、子类构造器执行的时候,都会在第一行默认先调用父类无参数构造器一次。

    2、子类构造器的第一行都隐含了一个super()去调用父类无参数构造器,super()可以省略不写

    super(...)和this(...)

    可以借助与super(...)去调用父类构造器,以便初始化继承自父类对象的name和age.

    super和this的用法格式

    super(...)

    super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。

    super(..)是根据参数去确定调用父类哪个构造器的。

    this(...)

    默认是去找本类中的其他构造器,根据参数来确定具体调用哪一个构造器。

    为了借用其他构造器的功能。

    小结:

    1、super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。

    2、super(..)和this(...)是根据参数去确定调用父类哪个构造器的。

    3、super(..)可以调用父类构造器初始化继承自父类的成员变量的数据。

    4、this(..)可以调用本类中的其他构造器。

    继承的特点

    Java只支持单继承,不支持多继承。

    一个类可以有多个子类。

    可以多层继承。

  • 相关阅读:
    Java——数组
    Java——控制循环结构
    脏检查
    Session跟SessionFactory的线程安全与非安全
    脏检查and刷新机构
    oracle函数
    多线程下单列模式
    多线程
    线程同步
    文件上传功能的实现
  • 原文地址:https://www.cnblogs.com/love-xiaowu/p/12686974.html
Copyright © 2011-2022 走看看