Java类与类之间关系总结

类和类之间的关系

  • a is-a b 泛化(继承 实现)
  • a has-a b 包含(组合 聚合 关联)
  • a use-a b 依赖 (need-a)

4种权限修饰符:public protected 默认不写 private (它们的权限由大到小)

继承关系

  1. 子类继承父类用关键字 extends
  2. 子类的对象可以调用父类中的(public protected)属性和方法,当做自己的来使用
    2.1 构造方法严格意义上说 不算做子类继承过来
    只是单纯的在子类调动构造 方法时默认调用父类的构造方法
    2.2程序块严格意义上说 不算做子类继承过来
    程序块子类不能直接调用 子类执行构造方法之前 默认调用了父类的构造方法 父类构造方法执行之前自动执行父类的程序块
  3. 子类可以添加自己独有的属性或方法
  4. 可能子类从父类继承过来的方法不能满足子类需要,可以在子类中重写父类的方法
  5. 每一个类都有继承类,如果不写extends关键字,则默认继承Object类
    所以Object类非常重要!可以理解为它是任何一个引用类型的父类(直接或间接继承Object) Object类没有父类
  6. java中继承是单个存在的(单继承,多实现)每一个类只能有一个继承类(在extends关键字后面只能写一个类) c++是有多继承的
    java语言采用单继承是为了让类变得更加安全,简单。 但是java可以通过传递的方式实现多继承的效果
  7. 继承在内存中的存储形式
    在这里插入图片描述
  8. 关于this和super的使用 this和super都是指代词 代替的是对象
    this(代替的是当前调用方法或属性时的那个对象 不一定是当前类的对象)
    super(代替的是当前执行方法时的对象的父类对象)
    它们都能调用一般属性和一般方法 可以放在类成员的任意位置(属性 方法 构造 块)
    注意调用一般方法的时候可以来回调用(写法可以 编译好用,执行可能会产生问题StackOverflowError)
    可以调用构造方法(放在构造方法的第一行)
    调用构造方法的时候不能来回调用(编译就不好用)
    this和super在构造方法中调用另一个类的构造方法时不能同时出现在第一行

Object类中的方法:

  • *hashCode() 将对象在内存中的地址经过计算得到一个int整数
public native int hashCode();
  • *equals() 用来比较两个对象的内容 Object默认效果是==
public boolean equals(Object obj){
	return (this==obj);
}

总结:==可以比较基本类型(比较的是值),也可以比较引用类型(比较的是地址)
equals()方法是Object类中继承过来的方法,默认比较的是地址,如果想要改变其规则,可以进行方法重写

  • *toString() 打印输出时将对象变成String字符串
public String toString(){
	return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
  • getClass() 获取对象对应类的类映射(反射机制)
  • wait() 线程进入挂起等待状态 它存在方法重载
  • notify() 线程唤醒
  • notifyAll() 唤醒所有
  • finalize() 权限修饰符是protected 在对象被GC回收的时候 默认调用执行的方法 相当于析构函数

构造函数:创建对象
析构函数:回收对象

笔试题经常考:final finally finalize的区别 它们名字上看起来类似 实际上没有任何关联

protected void finalize(){
}
  • clone() 权限修饰符是protected 为了克隆对象

这9个方法要求:记忆 方法名 方法参数 方法返回值 方法是否存在重载 常用的几个方法需要知道它的源代码如何实现

如果方法的特征符包含native而且又没有方法体:注意它不是抽象方法,它是做事情的。在java当中看不到底层源码了。
它调用了c++语言给我们写的核心的机制。
所以以后见到native:对不起,java语言到头了,native是调用了c++语言写的程序。

方法重写和方法重载的区别:

\ 方法重写override 方法重载overload
产生两个继承关系的类 一个类中的一组方法
子类重写父类的方法
权限 子类可以大于等于父类 没有要求
特征 final static abstract 没有要求
父类方法是final 子类不能重写
父类方法是static 子类不存在重写
父类方法是abstract 子类必须重写 (否则子类就是抽象类)
返回值 子类可以小于等于父类 没有要求
方法名字 子类与父类一致 一个类中的好多方法名必须一致
参数列表 子类与父类一致 每一个方法的参数必须不一致(个数 类型 顺序)
异常 运行时? 编译时? 没有要求
如果父类方法抛出运行时异常
子类可以不予理会
如果父类方法抛出编译时异常
子类抛出异常的个数以及类型都小于等于父类
方法体 子类的方法内容与父类不一致 每一个重载的方法 执行过程不一致

a has-a b 包含(组合 聚合 关联)

这三个关系从亲密程度来讲不太一样 关系越来越松弛
组合---->人和大脑 人和心脏的关系(整体和部分的关系 不可分割 整体要出现都出现 要消亡都消亡 )
聚合---->汽车和车轮子 电脑和主板(整体和部分的关系 创建时有可能是分开的 所以聚合没有组合关系紧密)
关联---->人有汽车 人有电脑(整体和部分的关系 可以分割 后来形成在一起的)
从java程序来描述这样的关系: 通过一个类的对象当做另一个类的属性来存储

a use-a b 依赖 (need-a)(最常见)

不是整体和部分的关系 某一件事情产生了关系 临时组合在一起 这件事情一旦做完关系即解散
屠夫杀猪 一个类(屠夫) 可以做一件事:杀猪 需要条件:一头猪(只是做杀猪这件事的时候需要猪,做其他事情不需要 强调临时性)
从java程序来描述这样的关系: 一个类的方法中使用到了另一个类的对象
设计类的关系遵循的原则:高内聚低耦合
耦合度:泛化>包含>依赖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章