Java继承

1.1 类与类之间的关系

A:继承(extends)

* 让类与类之间产生关系,子父类关系

* 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

特点:子类具有父类的所有属性和方法,并拥有自己的独有的属性和行为。

B:继承案例演示:

* 动物类,猫类,狗类

* 定义两个属性(颜色,腿的个数)两个功能(吃饭,睡觉)

代码:

 

public class Demo1_extends {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
dog.sleep();
}
}

/**
* 1.创建动物类,也就是父类
* 2.属性:动物的颜色,腿的的个数
* 3. 方法:吃饭,睡觉
*/
class Animal{
String color;
int leg;

public void eat(){
System.out.println("正在吃");
}

public void sleep(){
System.out.println("睡觉");
}
}


class Cat extends Animal{

}

class Dog extends Animal {

}

1.2继承的类型

Java不支持多继承,但是支持多重继承

 

 

继承的特性:

  1.子类拥有父类非private的成员属性、成员方法(不继承父类的构造方法)。

   2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

   3.子类可以用自己的方式实现父类的方法。

  4.Java 的继承是单继承,但是可以多重继承。

  5.提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密, 代码独立性越差)。

1.2继承的好处与弊端

* A:继承的好处

* a:提高了代码的复用性

* b:提高了代码的维护性

* c:让类与类之间产生了关系,是多态的前提

* B:继承的弊端

  * 类的耦合性增强了。

  * 开发的原则:高内聚,低耦合。

  * 耦合:类与类的关系

  * 内聚:就是自己完成某件事情的能力

1.3 Java中类的继承特点

* A:Java中类的继承特点

* a:Java只支持单继承,不支持多继承。(一个儿子只能有一个爹)

* 有些语言是支持多继承,格式:extends 类1,类2,...

* b:Java支持多层继承(继承体系)

* B:案例演示

* Java中类的继承特点

* 如果想用这个体系的所有功能用最底层的类创建对象

* 如果想看这个体系的共性功能,看最顶层的类

代码:


public class Demo2_extends {
public static void main(String[] args) {
Demo3 demo3 = new Demo3();
demo3.print();
demo3.method();
demo3.show();
System.out.println("----------------------");

Demo1 demo1 = new Demo1();
demo1.show();

}
}
class Demo1 {
public void show(){
System.out.println("Demo1");
}
}

class Demo2 extends Demo1{
public void method(){
System.out.println("Demo2");
}
}

class Demo3 extends Demo2{ // 包含了最多功能
public void print(){
System.out.println("Demo3");
}
}

1.4 Java中继承的注意事项

* A:继承的注意事项

* a:子类只能继承父类所有非私有的成员(成员方法和成员变量)

* b:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。

* c:不要为了部分功能而去继承

* 项目经理 姓名 工号 工资 奖金

* 程序员 姓名 工号 工资

* B:什么时候使用继承

* 继承其实体现的是一种关系:"is a"。

Person

Student

Teacher

水果

苹果

香蕉

橘子

 

采用假设法。

如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。

代码:
public class Demo3_extends {
public static void main(String[] args) {

Programmer p = new Programmer();
p.setEno("1001");
p.setName("程序员");
p.setSalary(10000);
System.out.println(p.getEno() +"...." + p.getName() + "...." + p.getSalary());
System.out.println("++++++++++++");
ProjectManager pro = new ProjectManager();
pro.setEno("0001");
pro.setName("项目经理");
pro.setSalary(20000);
pro.setBonus(5000);
System.out.println(pro.getEno() +"...." + pro.getName() + "...." +
pro.getSalary() + "...." + pro.getBonus());

}
}
class Person{
private String name; // 员工的姓名
private String eno; // 员工的编号
private double salary; // 员工的工资

// 无参数的构造方法
public Person(){

}
// 有参数的构造方法
public Person(String name, String eno, double salary){
this.name = name;
this.eno = eno;
this.salary = salary;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getEno() {
return eno;
}

public void setEno(String eno) {
this.eno = eno;
}

public double getSalary() {
return salary;
}

public void setSalary(double salary) {
this.salary = salary;
}
}

class Programmer extends Person{

}

class ProjectManager extends Person{
private double bonus;

public double getBonus() {
return bonus;
}

public void setBonus(double bonus) {
this.bonus = bonus;
}
}

1.5继承中成员变量的关系

* A:案例演示

* a:不同名的变量

* b:同名的变量

子父类出现同名的变量只是在讲课中举例子用,在开发中是不会出现这种情况的
子类继承父类就是为了使用父类的成员,那么如果定义了同名的成员变量没有意义了

2.1 继承中构造方法的关系

* A:案例演示
    * 子类中所有的构造方法默认都会访问父类中空参数的构造方法
* B:为什么呢?
    * 因为子类会继承父类中的数据,可能还会使用父类的数据。
    * 所以,子类初始化之前,一定要先完成父类数据的初始化。
    * 其实:
   * 每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。

代码:
public class Demo5_Extends {
public static void main(String[] args) {
/**
* 1. 创建对象时,构造方法会自动执行
* 2. 创建的是子类的对象,但是父类的构造方法先执行了。
*/
Son2 son2 = new Son2();
}
}

class Father2 {
String name;
public Father2() {
System.out.println("Father 的构造方法");
}
}
class Son2 extends Father2 {
public Son2() {
System.out.println("Son 的构造方法");
}
}

2.2继承中构造方法的注意事项

* A:案例演示

* 父类没有无参构造方法,子类怎么办?

* super解决

* this解决

* B:注意事项

* super(…)或者this(….)必须出现在构造方法的第一条语句上

代码:
public class Demo6_Extends {
public static void main(String[] args) {
/**
* 1. 创建一个子类的对象
* 2. 调用子类的无参数的构造方法
* 3. 调用super("张三"7)方法执行父类中有参数的构造方法
* 4. 执行子类中的无参数的构造方法
*/
SonOne s1 = new SonOne();
System.out.println(s1.getName() + "..." + s1.getAge());
System.out.println("--------------------");
/**
* 1. 调用子类的有参数的构造方法
* 2. 调用super("李四"28)方法执行父类中有参数的构造方法
* 3. 执行子类中有参数的构造方法
*/
SonOne s2 = new SonOne("李四",28);
System.out.println(s2.getName() + "..." + s2.getAge());
}
}

class FatherOne{
private String name; // 姓名
private int age; // 年龄
/*
// 无参数的构造方法
public FatherOne() {
System.out.println("FatherOne: 空参构造方法");

}*/

// 有参数的构造方法
public FatherOne(String name, int age){
this.name = name;
this.age = age;
System.out.println("FatherOne: 有参数的构造方法");
}

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

class SonOne extends FatherOne{
public SonOne() { //空参构造
super("张三", 7); //无论写没写super() 方法,这一句话都会执行
System.out.println("Son 空参构造");
}
public SonOne(String name,int age) { //有参构造
super(name,age);
System.out.println("Son 有参构造");
}

}

 

public class Demo6_Extends {
    public static void main(String[] args) {
        /**
         * 1. 创建一个子类的对象
         * 2. 调用子类的无参数的构造方法
         * 3. 调用super("张三" 7)方法执行父类中有参数的构造方法
         * 4. 执行子类中的无参数的构造方法
         */
        SonOne s1 = new SonOne();
        System.out.println(s1.getName() + "..." + s1.getAge());
        System.out.println("--------------------");
        /**
         * 1. 调用子类的有参数的构造方法
         * 2. 调用super("李四" 28)方法执行父类中有参数的构造方法
         * 3. 执行子类中有参数的构造方法
         */
        SonOne s2 = new SonOne("李四",28);
        System.out.println(s2.getName() + "..." + s2.getAge());
    }
}

class FatherOne{
    private String name;  // 姓名
    private int age;      // 年龄
    /*
    // 无参数的构造方法
    public FatherOne() {
        System.out.println("FatherOne: 空参构造方法");

    }*/

    // 有参数的构造方法
    public FatherOne(String name, int age){
        this.name = name;
        this.age = age;
        System.out.println("FatherOne: 有参数的构造方法");
    }

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

class SonOne extends FatherOne{
    public SonOne() {                 //空参构造
        super("张三", 7);   //无论写没写super() 方法,这一句话都会执行
        System.out.println("Son 空参构造");
    }
    public SonOne(String name,int age) {   //有参构造
        super(name,age);
        System.out.println("Son 有参构造");
    }

}

posted @ 2021-07-09 14:35  蔡地像徐坤  阅读(60)  评论(0编辑  收藏  举报