一、类与类的关系
对于类与类之间的关系可以分为以下几类:
一、依赖
描述:
对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返 回值建立的对于其他对象的调用关系。
另外,依赖表示类之间的是 一种“临时、短暂”关系,这种关系是不需要保存的。
示例:
public class A{
public D method(B b){
C c = new C();
return D;
}
}
public class B{
....
}
public class C{
....
}
public class D{
...
}
关系图:
二、关联
描述:
对象之间一种引用关系,这种关系通常使用类的属性表达。比如客户类与订单类之间的关系,丈夫类与妻子类。关联可以有方向,即导航。一般不作说明的时候,导航是双向的,不需要在线上标出箭头。
关联表示类之间的“持久”关系,这种关系一般表示一种重要的业务之间的关系,需要保存 的,或者说需要“持久化”的,或者说需要保存到数据库中的。
示例:
public class Husband{
...
private Wife wife;
...
}
public class Wife{
...
private Husband husband;
....
}
关系图:
三、聚合( 关联的一种 )
描述:
表示 has-a 的关系。与关联关系一样,聚合关系也是通过实例变 量来实现这样关系的。
关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的 区分两者的区别。 如汽车类与引挚类,轮胎类之间的关系就是整体与个体的关系。
示例:
class Car{
private Engine engine;//引擎
private Tyre[] tyres;//轮胎
...
}
关联和聚集(聚合)的区别:
关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系,而 不是聚合关系,因为人不是由自行车组成的。
聚合关系涉及的两个对象处于不平等的层次上,一个代表整体,一个代表部分。比如电脑和 它的显示器、键盘、主板以及内存就是聚集关系,因为主板是电脑的组成部分。
关系图:
四、组合
描述:
表示 contains-a 的关系,是一种强烈的包含关系。组合类负责被组合类的生命周期。 也使用属性表达组合关系,是关联关系的一种,是比聚合关系强的关系。
对象 A 包含对象 B,对象 B 离开对象 A 没有实际意义。是一种更强的关联关系。人包含手, 手离开人的躯体就失去了它应有的作用。
示例:
public class Window{
private Menu menu;//菜单
private Slider slider;//滑动条
private Panel panel;//工作区
.....
}
关系图:
五、继承
描述:
表示is - a 的关系,用于类与类的继承关系,类与接口的实现关系。
场景:动物与人、植物与树
示例:
public class Animal{
。。。
}
public class People extends Animal{
....
}
关系图:
二、继承
一、简介
在多个类中存在相同的的属性和行为时,将重复的属性和行为单独作为一个类,
这个类称之为父类(也称之为基类),继承该类的类称之为子类(派生类)。
二、格式与特点
格式:
使用extends关键字来实现继承关系
修饰符 class subClassName extends superClassName{
...
}
特点:
-
所有的类都有一个基类Object。
-
Java只支持单根继承与多层继承(A继承B、B继承C),而不支持多重继承。
-
子类继承了父类的全部方法和属性(不包括构造方法)。但对于private修饰的属性和方法,仍然获取了私有的结构,但由于封装性,无法直接对其访问。
-
在继承以后,子类仍然可以进行新方法和数据字段的扩展。
-
继承是用来为“是一种”关系(is a)来建模的,但并不是所有is a的关系都该用继承来建模。
三、方法重写
一、重写
形式上表现为:
重写类与被重写类的方法名相同,参数列表相同,方法的返回值可以不同(但必须是被重写方法返回值的子类)。
示例:
public class Animal{
。。。
public void printMessage(String message){
}
。。。
}
public class People extends Animal{
。。。
@Override //用来标注重写方法
public void printMessage(String message){
}
。。。
}
注意:
private、static、final修饰的方法不能够被重写。
二、重写与重载的区别
发生范围:
重载即可以发生在同一个类中,也可以发生在因继承而相关的不同类中;重写只能发生在因为继承而相关的不同 类中。
返回值类型:
重载可修改;重写的返回值类型可以不同,但必须是被重写方法返回值类型的子类。
抛异常:
重载可修改;重写可减少或删除,一定不能抛出新的或者更广的异常(不能是父类异常)。
修饰符范围:
重载可修改;重写一定不能做更严格的限制(被重写方法为protected的,则重写方法可以声明为public的)
从编译和运行的角度来看:
对于重载的方法而言,由于参数列表不同,因此在编译期,方法的调用就已经确定。
而对于重写的方法,由于多态性,方法的调用需要在运行期才能确定。
四、super关键字
一、super关键字
介绍:
表示父类内存空间的标识(即父类的引用)。
使用:
构造方法:
super(参数列表) //调用父类的无参构造方法即为super()
属性:
super.属性名 //权限要够,为private的属性是无法直接获取的。
方法:
super.方法名 //权限要够,为private的属性是无法调用的。
特点:
-
可以调用父类中的属性和方法,和构造器。
-
当子类和父类有重名方法时,可以通过super关键字来表明调用的时父类中的方法,super的追述不仅限于直接父类。
-
只能写在构造器内的第一行。
-
默认的会调用父类中的无参构造方法。
-
当父类中没有空参的构造器时,必须通过this(参数列表)或super(参数列表)的形式显式的调用本类或父类指定的构造器,且只能二选一。
如果构造器中既无显式的调用本类或父类中的构造器,同时父类中又无无参的构造器,则编译出错。
-
与this类似,在静态上下文中也不能使用super。
示例:
public class People extends Animal{
private String userName;
public People(){
this()
}
public People(String userName,String name, int age){
super(name,age); //调用父类构造方法赋值。
this.userName = userName;
}
public void peopleMessagePrint(){
super.printMessage();//调用父类方法
}
//静态上下文
public static void method(){
String s = super.toString();//报错
}
}
public class Animal{
private String name;
private int age;
public Animal(){
}
public Animal(String name, int age){
this.name = name;
this.age = age;
}
....
public void printMessage(){
....
}
}
二、super与this的区别
含义上:
this表示当前对象的,super表示父类对象。
用法上:
区别点 | this | super |
---|---|---|
属性访问 | 访问本类中的属性,没有则从父类中查找 | 访问父类的属性 |
方法 | 访问本类中的方法,没有则从父类中查找 | 访问父类的方法 |
构造器 | 调用本类的构造器,且必须放在第一行 | 调用父类的构造器,且必须放在构造器的第一行 |
参考资料:
尚硅谷资料、《Java语言程序设计》