• 2017.12.1T19_B2_4.2


    package com.xdf.bean;

    /**
     * Student  is  a  Person
     * Teacher  is  a  Person
     *
     * 子类和父类满足 is  a的关系!
     *   学生是人类
     *   老师是人类
     *   司机是人类
     *
     * 继承使用的关键字是extends!
     *
     * 请问:
     *   一个人有几个亲生父亲?
     *   一个类只能有一个父类!
     *    Student》》》Person》》》Object
     *   
     *    单根性!  单根继承                  多实现 
     *          extends     implements
     *  
     *  
     *
     * 01.把Student和Teacher类中公共的代码 提取到Person类中
     * 02.让Student和Teacher类继承Person类
     *
     * 继承的注意事项:
     *  01.无论我们子类中是否调用super(),默认都会先去执行父类的无参构造!
     *     除非子类中显示的调用了父类的带参构造!
     *  02.父类中私有的属性或者方法,子类不能继承  
     *  03.父类的构造方法也不能继承
     * 
     *  重写的注意事项:
     *  01.有继承关系
     *  02.不在一个类,子类重写父类的方法
     *  03.方法名一致,参数列表一致
     *  04.重写方法的访问权限修饰符不能严于父类
     *  05.父类中的静态方法不允许被重写,但是子类中可以创建同名的静态方法
     *  06.父类的私有方法 不允许被重写
     *  07.如果父类的方法有返回值,我们子类重写的时候,可以返回这个值本身,也可以返回值的子类型!
     */
    public class Person { // 人类

     private int id; // 编号
     private String name; // 姓名
     private int age; // 年龄

     private void showInfo() {
      System.out.println("父类的私有方法");
     }

     public static void testStatic() {
      System.out.println("父类的静态方法");
     }

     /**
      * 父类中睡觉的方法
      */
     public void sleep() {
      System.out.println("人类在睡觉");
     }

     public void sleep(String name) {
      System.out.println(name + "在睡觉");
     }

     /**例子:
      * 我要去买个动物?
      *  小猫
      *  小狗
      *
      * 书写一个带有返回值的方法
      */
     public Person getPerson() {
      return new Person(); // 返回一个人类
     }

     public int getId() {
      return id;
     }

     public void setId(int id) {
      this.id = id;
     }

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

     public Person(int id, String name, int age) {
      System.out.println("Person类中的****带参构造");
      this.id = id;
      this.name = name;
      this.age = age;
     }

     public Person() {
      super(); // Person已经没有父类了 所以调用Object
      System.out.println("Person类中的****无参构造");
     }

     @Override
     public String toString() {
      return "[id=" + id + ", name=" + name + ", age=" + age + "]";

    *************************************************************************

    package com.xdf.bean;

    public class PersonDemo {

     /**
      * 创建Student对象
      Student stu = new Student();
      stu.setId(1);
      stu.setAge(60);
      stu.setName("小黑");
      System.out.println(stu); // 为什么输出 属性的值 而不是内存地址
      System.out.println("**********************************");
      // 创建Teacher对象
      Teacher teacher = new Teacher();
      teacher.setId(2);
      teacher.setAge(18);
      teacher.setName("小白");
      System.out.println(teacher);
      System.out.println("****************验证类的实例化顺序*******************");
      Student stu1 = new Student();
      System.out.println("****************验证带参构造*******************");
      Student stu2 = new Student(1, "小黑", 50);
      System.out.println(stu2);
      */
     public static void main(String[] args) {
      // 验证子类可以继承的内容
      Student stu = new Student();
      // stu.showInfo(); 父类中私有的方法
      stu.sleep();
      Teacher teacher = new Teacher();
      teacher.sleep();
      /**
       * 问题 :
       * 无论是哪个子类调用这个sleep方法 都会执行一样的内容 ? 这样合理吗?
       *
       * 方法的重写:
       *    父类中只是定义了一个方法,具体内容 让子类去书写!

    ********************************************************************

    package com.xdf.bean;

    /**
     * super关键字
     * 01.只能出现在子类的方法中
     * 02.如果是调用父类的构造方法 只能位于子类构造的第一句
     * 03. super.属性  调用父类的属性
     *     super.方法   调用父类的方法
     *
     */
    public class Student extends Person { // 学生类

     public Student(int id, String name, int age) {
      // super(id, name, age); // 调用父类的 带参构造方法
      System.out.println("Student类中的****带参构造");
     }

     public Student() {
      // super(); 无论我们有没有显示的去调用 父类的 无参构造方法, 都会执行
      System.out.println("Student类中的****无参构造");
     }

     /**
      * 重写父类的方法
      */
     @Override
     public void sleep() {
      System.out.println("学生 在睡觉");
     }

     /**
      * 重写父类的静态方法
      * shift+alt +s ===> override ==》
      * 发现没有父类的静态方法
      */
     public static void testStatic() {
      System.out.println("子类的静态方法,和父类没关系! 但是可以同名");
     }

     /**
      * 重写带有返回值的方法
      */
     @Override
     public Person getPerson() {
      // return new Student();
      return new Teacher();
     }

    ***************************************************************

    package com.xdf.bean;

    public class Teacher extends Person { // 教师类

     public Teacher(int id, String name, int age) {
      super(id, name, age); // 调用父类的 带参构造方法
     }

     public Teacher() {
      super();// 调用父类的 无参构造方法
     }

     /**
      * 重写父类的方法
      */
     @Override
     public void sleep() {
      System.out.println("教师 在睡觉");

  • 相关阅读:
    Mysql登录错误:ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded
    Docker配置LNMP环境
    Docker安装mysqli扩展和gd扩展
    Docker常用命令
    Ubuntu常用命令
    单例模式的优缺点和使用场景
    ABP 多租户数据共享
    ABP Core 后台Angular+Ng-Zorro 图片上传
    ERROR Error: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as 'standalone' in ngModelOptions.
    AbpCore 执行迁移文件生成数据库报错 Could not find root folder of the web project!
  • 原文地址:https://www.cnblogs.com/xiaoxiao1016/p/8004765.html
Copyright © 2020-2023  润新知