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("教师 在睡觉");

原文地址:https://www.cnblogs.com/xiaoxiao1016/p/8004765.html