欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中类的继承,包含,依赖关系

程序员文章站 2022-03-26 16:44:01
目录Java中类和类有以下几种关系继承Java中类和类有以下几种关系关系含义形式泛化A is - a B继承,实现包含A has - a B组合,聚合,关联依赖A use - a B依赖继承【1】 子类继承父类,通过一个关键字: extends【2】类的对象可以调用父类中的(public protected)属性和方法 ,当做自己的来使用//父类public class Animal { public String...


Java中类和类有以下几种关系


关系 含义 形式
泛化 A is - a B 继承,实现
包含 A has - a B 组合,聚合,关联
依赖 A use - a B 依赖

1.继承


【1】 子类继承父类,通过一个关键字: extends

【2】类的对象可以调用父类中的(public protected)属性和方法 ,当做自己的来使用

//父类
public class Animal {
    public String name;
    
    public void eat(){
        System.out.println("动物的吃饭方法");
    }

    public void sleep(){
        System.out.println("动物的睡觉方法");
    }
}
//子类继承父类
public class Person extends Animal {

}
public class Test {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "Lisi";
        p.eat();            // 动物的吃饭方法
        p.sleep();          // 动物的睡觉方法
    }
}

【3】子类可以添加自己独有的属性和方法的

【4】子类从父类中继承过来的方法不能满足子类需要,可以在子类中重写(覆盖)父类的方法,更多指的是内容

public class Person extends Animal {
    public void eat(){           //子类中eat方法的重写
        System.out.println("人类的吃饭方法,讲究色香味俱全");
    }
    
    public void study(){         //子类独有的方法
        System.out.println("good good study,day day up");
    }
}
public class Test {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "Lisi";
        p.eat();        // 人类的吃饭方法,讲究色香味俱全
        p.study();      // good good study,day day up
    }
}

【5】每一个类都有继承类,如果不写extends关键字,默认继承Object,如果写了extends则继承后面那个父类。可以理解为Object是任何一个引用类型的父类(直接或间接的继承Object) ,但Object类没有父类。

【6】Java中继承是单个存在的(单继承) 每一个类只能有一个继承类 (在extends关键字后面只能写一个类),但可以通过传递的方式实现多继承的效果 ,后续还会有多实现

// 去掉继承关系后
public class Person {

}

Java中类的继承,包含,依赖关系
注:作者使用的IDE是《IntelliJ IDEA Educational Edition 2020.3 x64》

  • Object类中的方法
  • 注:按住shift键 + ctrl键 再点击上面的函数名,就可以点进去查看Object函数源码
Object类中的方法 作用
hashCode() 将对象在内存中的地址经过计算得到一个int整数
equals() 用来比较两个对象的内容 Object默认效果是== ,==可以比较基本类型(比较值) 可以比较引用类型(比较地址),equals方法时Object类中继承过来的方法 ,默认效果比较地址 ,如果想要改变其规则 可以进行方法重写
toString() 打印输出时将对象变成String字符串
getClass() 获取对象对应类的类映射(反射)
wait() 线程进入挂起等待状态 存在方法重载
notify() 线程唤醒
notifyAll() 线程唤醒
notifyAll() 唤醒所有线程
finalize() 权限修饰符是protected ,在对象被GC回收的时候 默认调用执行的方法
clone() 权限修饰符是protected 为了克隆对象

【7】继承在内存中的存储形式

public class Animal {
    public Animal(){
        System.out.println("动物无参构造函数");
    }

    public void eat(){
        System.out.println("动物的吃饭方法");
    }
}
public class Person extends Animal{
    public Person(){
        System.out.println("人类的构造方法");
    }

    public void eat(){
        System.out.println("人类的吃饭方法,讲究色香味俱全");
    }
}
public class Test {
    public static void main(String[] args) {
        Person p = new Person();
        p.eat();
    }
}
/*****运行结果*****/
动物无参构造函数
人类的构造方法
人类的吃饭方法,讲究色香味俱全

Java中类的继承,包含,依赖关系
【8】关于this和super的使用

  • this和super都是指代词 ,代替的是对象,都能调用一般属性 和 一般方法,可以放置在类成员的任意位置(属性, 方法, 构造,块)
  • this代替的是当前执行方法时的那个对象 ,不一定是当前类的
  • super代替的是当前执行方法时的对象的父类对象 , 空间内部的那个
public class Animal {
    public String name;

    public Animal(){
        System.out.println("父类参构造函数");
    }

    public void eat(){
        System.out.println("父类的吃饭方法");
    }
}

public class Person extends Animal{
    public Person(){
        System.out.println("子类的构造方法");
    }

    public void eat(){
        System.out.println("子类的吃饭方法");
    }

    public void study(){
       super.eat();     //调用study方法的对象是Person p,super指代Person的父类
       this.eat();      //this指代调用study方法的对象,即Person

        System.out.println("人类的学习方法");
    }
}
public class Test {
    public static void main(String[] args) {
        Person p = new Person();
        p.study();
    }
}
/*****运行结果*****/
父类参构造函数
子类的构造方法
父类的吃饭方法
子类的吃饭方法
人类的学习方法
  • 注意:调用一般方法的时候可以来回互相调用, 执行可能产生问题(*Error)。
  • 可以调用构造方法(放在构造方法的第一行),this和super在构造方法中调用另一个类的构造方法不能同时出现在第一行
  • 构造方法之间不能来回互相调用(编译就不好用)。

2.包含


【1】包含关系(组合 聚合 关联) 从亲密程度来讲不太一样

包含的形式 类比 表现
组合 人和大脑 人和心脏的关系 整体和部分的关系, 不可分割 ,要出现都出现 , 要消亡都消亡
聚合 汽车和车* 电脑和主板 整体和部分的关系 , 创建时有可能是分开的
关联 人有汽车 人有电脑 整体和部分的关系 ,可以分割 ,后来形成在一起

【2】从Java程序来描述这样的关系 通过一个类的对象当做另一个类的属性来存储
【3】类的个数变多啦—>需要管理类—>包package(可以理解为是一个文件夹)

  • 在我们类的第一行会出现package关键字
  • 如果package和import同时出现,先写package后写import,package只能有一个 ,import可以有多个

【4】以汽车和*为例子来解释包含(这里是聚合)的关系

  • 建立工程 —> 右键src —> new —> package —> 输入包名
package contain;

public class Wheel {
    // 属性
    public String brand;  //品牌
    public String color;  //颜色
    public int size;      //尺寸

    // 构造方法
    public Wheel(){}
    public Wheel(String brand,String color,int size){
        this.brand = brand;
        this.color = color;
        this.size = size;
    }

    // 方法
    public void turn(){
        System.out.println("*可以旋转");
    }
}

package contain;

public class Car {
    // 属性
    public String brand;    //汽车品牌
    public String color;    //汽车颜色
    public String type;     //汽车型号
    public Wheel wheel;     // 汽车里有* -----> 包含关系

    // 构造方法
    public Car(){}
    public Car(String brand,String color,String type,Wheel wheel){
        this.brand = brand;
        this.color = color;
        this.type = type;
        this.wheel = wheel;

    }
    // 方法
    public void showCar(){
        System.out.println("这是一辆"+brand+"牌"+type+"型号"+color+"的小汽车");
        System.out.println("车上搭载着"+wheel.brand+"牌的"+wheel.size+"尺寸"+wheel.color+"颜色的车*");
        wheel.turn();//方法一定是对象调用的  车*的方法肯定是车*对象调用   可以放置在任何地方
    }
}

import contain.Car;
import contain.Wheel;
public class Test {
    public static void main(String[] args) {
        Car car = new Car("宝马","Z4","宝石蓝色",new Wheel("米其林","酷黑",400));
        car.showCar();//展示汽车
    }
}
/******运行结果*****/
这是一辆宝马牌宝石蓝色型号Z4的小汽车
车上搭载着米其林牌的400尺寸酷黑颜色的车*
*可以旋转

3.依赖


【1】依赖关系:不是整体和部分的关系 ,某一件事情产生了关系 ,临时组合在一起 ,这件事情一旦做完关系即解散。
【2】 Java程序体现的形式为:一个类的方法中使用到了另一个类的对象

  • 可以在方法中传递参数
  • 可以在方法中自己创建

【3】下面以农夫养猪,屠夫杀猪来演示类的依赖关系

package rely;

public class Pig {//描述猪

    //属性
    private String name;//名字
    private int weight = 20;//体重

    //构造方法
    public Pig(){}
    public Pig(String name){
        this.name=name;
    }

    //方法
    //描述一个方法  表示小猪被杀啦
    public void beKilled(){
        System.out.println(this.name+"被杀啦,好惨呀");
    }

    //描述一个方法  让猪长肉
    //    每一个月涨到前一个月的两倍
    public void growUp(int month){
        for(int i=1;i<=month;i++){
            this.weight*=2;
        }
    }

    //描述一个方法  猪告知他的体重
    public int getWeight(){
        return this.weight;
    }
    public String getName(){
        return this.name;
    }
}

package rely;

public class Butcher {//描述屠夫

    //属性  名字 有刀

    //方法
    //描述一个屠夫杀猪的方法   需要提供条件 一头猪
     //依赖--->在屠夫的方法中使用到了猪的对象
    public void killPig(Pig pig){
        System.out.println("屠夫执行了杀猪方法");
        String pigName = pig.getName();
        int pigWeight = pig.getWeight();
        System.out.println(pigName+"的体重为:"+pigWeight);
        pig.beKilled();
    }
}

import relay.Butcher;
import relay.Pig;
import relay.Farmer;

public class Test {
    public static void main(String[] args) {
        //创建农夫对象
        Farmer farmer = new Farmer();
        //农夫做一件事情--->养猪
        Pig pig = farmer.feedPig(5,"小花");
        //创建屠夫对象
        Butcher butcher = new Butcher();
        //屠夫做事--->杀猪
        butcher.killPig(pig);
    }
}
/*******运行结果********/
屠夫执行了杀猪方法
小花的体重为640
小花被杀啦,好惨呀
设计类的关系遵循的原则:高内聚低耦合
耦合度:     继承(实现) > 包含 > 依赖

本文地址:https://blog.csdn.net/qq_45544223/article/details/113944887