zoukankan      html  css  js  c++  java
  • 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("教师 在睡觉");

  • 相关阅读:
    看代码所学1
    金额,重量,成绩不使用浮点数来表示,而使用整形
    安全风控的CAP原理和BASE思想
    Git操作
    项目上线规范以及一些词汇
    水滴筹面试
    Sping框架中的注解详解
    Restful技术
    @crossorigin注解跨域
    解决Ubuntu14.04下vi编辑器不能使用方向键和退格键问题
  • 原文地址:https://www.cnblogs.com/xiaoxiao1016/p/8004765.html
Copyright © 2011-2022 走看看