Java基础 Day09(继承)

继承:类与类的关系,继承的设计原理是为了简化代码的书写,提高代码的复用性。

一、如何使用继承

  在定义类时使用extends关键字 跟父类名。

public class Student extends Person{
}

二、继承的特点

  1、没有父类的类称为根类,Java中根类是Object
       2、继承的上层:父类        继承的下层:子类
       3、继承的内容,所有的成员变量(私有的不能直接访问)和方法(除了构造方法)
       4、Java中的继承为单继承!!! 你的亲生父亲只有一个!
       一个类可以有多个子类,但是一个类有一个父类!
       5、继承是单向的,不能相互继承
       6、继承有传递性 Person Student CollegeStuden只能是
       大学生继承学生,学生继承人类,那么大学生就具有学生和人类的所有属性和方法
       7、子类如果不满意父类的方法实现,可以重写。

    7.1>重写的关键字:@Override

    7.2>重写的方法必须与父类的一致,参数数量、类型、顺序,方法名、返回值所有信息都一致!

    7.3>只有父类的实现,在重写方法中只有super

    7.4>既有子类实现又有父类实现,先写super再写子类内部实现.

    7.5>子类构造方法执行时,优先调用父类的无参构造方法

    7.6>父类中如果存在有参的构造方法,子类在定义有参构造方法时,优先执行父类中的有参构造方法,来初始化公共的属性
      然后再初始化自身独有的属性,从而完成所有属性的初始化.

父类中 name age
子类继承 id 
public Student(String name, int age, int id) {
    super(name, age);
    this.setId(id);
}

    7.7>构造方法的作用是创建对象
      有参构造方法:创建对象的同时为对象属性进行赋值

父类内部
public void sayHi() {
    System.out.println("你好");
}
子类继承之后
@Override
public void sayHi() {
    System.out.println("Hello");
}

    7.8>如果子类没有重写父类中的方法,那么子类调用继承方法时,走的是父类中的实现

  8、只有子类的实现,在重写方法中没有super

//创建一个父类水果类
public class Fruit {
    private String color;
    private String variety;//种类
    private double weight;
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getVariety() {
        return variety;
    }
    public void setVariety(String variety) {
        this.variety = variety;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
    public Fruit() {
        System.out.println("Fruit类的构造方法执行了");
    }
    public Fruit(String color, String variety, double weight) {
        super();
        this.color = color;
        this.variety = variety;
        this.weight = weight;
    }
//创建一个子类Apple子类
public class Apple extends Fruit{

    private double price;
    private String smell;//味道
    /*
         无参构造方法一定要提供
         当子类执行无参构造方法时,首先会去调用父类中的
         无参构造方法,当父类中提供了有参构造时无参构造
         就不会默认提供,而如果没有手动的书写无参构造,
         子类一旦继承就会报错!!
     */    
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public String getSmell() {
        return smell;
    }
    public void setSmell(String smell) {
        this.smell = smell;
    }
    public Apple() {
        super();
        System.err.println("Apple的构造方法执行了!");
    }
    /*public Apple(String color, String variety, double weight) {
        super(color, variety, weight);
        // TODO Auto-generated constructor stub
    }*/
    public Apple(String color, String variety, double weight, double price, String smell) {
        super(color, variety, weight);
        this.price = price;
        this.smell = smell;
    }
//测试类
public class InitialApple {
    public static void main(String[] args) {
        Apple apple = new Apple();
        Apple apple1 = new Apple("红色", "苹果", 1.1, 9.0, "甜");
        System.out.println(apple1);
    }

三、final关键字

    1、final修饰类,则该类不允许被继承
         2、final修饰方法,则该方法不允许被覆盖(重写)
         3、final修饰属性(成员变量)则该属性不会隐式的初始化
         (类的初始化属性必须有值)
         或者在构造方法内部进行初始化(但是两者选择其中一种为其给初值)
         4、final如果用来修饰变量,则该变量只能赋值一次,即变为常量。

posted @ 2019-04-01 20:27  滑稽大王  阅读(177)  评论(0编辑  收藏  举报