赞
踩
关系 | 含义 | 形式 |
---|---|---|
泛化 | A is - a B | 继承,实现 |
包含 | A has - a B | 组合,聚合,关联 |
依赖 | A use - a B | 依赖 |
【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 {
}
注:作者使用的IDE是《IntelliJ IDEA Educational Edition 2020.3 x64》
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();
}
}
/*****运行结果*****/
动物无参构造函数
人类的构造方法
人类的吃饭方法,讲究色香味俱全
【8】关于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();
}
}
/*****运行结果*****/
父类参构造函数
子类的构造方法
父类的吃饭方法
子类的吃饭方法
人类的学习方法
【1】包含关系(组合 聚合 关联) 从亲密程度来讲不太一样
包含的形式 | 类比 | 表现 |
---|---|---|
组合 | 人和大脑 人和心脏的关系 | 整体和部分的关系, 不可分割 ,要出现都出现 , 要消亡都消亡 |
聚合 | 汽车和车轮子 电脑和主板 | 整体和部分的关系 , 创建时有可能是分开的 |
关联 | 人有汽车 人有电脑 | 整体和部分的关系 ,可以分割 ,后来形成在一起 |
【2】从Java程序来描述这样的关系 通过一个类的对象当做另一个类的属性来存储
【3】类的个数变多啦—>需要管理类—>包package(可以理解为是一个文件夹)
【4】以汽车和轮子为例子来解释包含(这里是聚合)的关系
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尺寸酷黑颜色的车轮子
轮子可以旋转
【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 小花被杀啦,好惨呀
设计类的关系遵循的原则:高内聚低耦合
耦合度: 继承(实现) > 包含 > 依赖
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。