(二) 面向对象 - 继承

一、类与类的关系

 
对于类与类之间的关系可以分为以下几类:

 

一、依赖

 
描述:

对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返 回值建立的对于其他对象的调用关系。

 
另外,依赖表示类之间的是 一种“临时、短暂”关系,这种关系是不需要保存的。

 
示例:

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{
	...
}

 
特点:

  1. 所有的类都有一个基类Object。

  2. Java只支持单根继承与多层继承(A继承B、B继承C),而不支持多重继承。

  3. 子类继承了父类的全部方法和属性(不包括构造方法)。但对于private修饰的属性和方法,仍然获取了私有的结构,但由于封装性,无法直接对其访问。

  4. 在继承以后,子类仍然可以进行新方法和数据字段的扩展。

  5. 继承是用来为“是一种”关系(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的属性是无法调用的。

    

 
特点:

  1. 可以调用父类中的属性和方法,和构造器。

  2. 当子类和父类有重名方法时,可以通过super关键字来表明调用的时父类中的方法,super的追述不仅限于直接父类。

  3. 只能写在构造器内的第一行。

  4. 默认的会调用父类中的无参构造方法。

  5. 当父类中没有空参的构造器时,必须通过this(参数列表)或super(参数列表)的形式显式的调用本类或父类指定的构造器,且只能二选一。

    如果构造器中既无显式的调用本类或父类中的构造器,同时父类中又无无参的构造器,则编译出错。

  6. 与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表示父类对象。

 
用法上:

区别点thissuper
属性访问访问本类中的属性,没有则从父类中查找访问父类的属性
方法访问本类中的方法,没有则从父类中查找访问父类的方法
构造器调用本类的构造器,且必须放在第一行调用父类的构造器,且必须放在构造器的第一行

 
 
参考资料:
尚硅谷资料、《Java语言程序设计》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值