类再生(合成、继承、final)
类再生
有两种方法达到代码复用的效果:合成、继承。
合成的语法
合成就是形成对象,把复用的代码置入对象句柄。
在类内字段使用基本数据会初始化为零,但对象句柄会初始化为null。在下面的程序中若没有new该对象,s初始化为null。
class WaterSource {
private String s;
WaterSource() {
System.out.println("WaterSource()");
s = new String("Constructed");
}
public String toString() { return s; }
}
如希望句柄得到自己定义的初始化,可在下面地方进行:
- 在对象定义的时候。这意味着它们在构建器调用之前肯定能得到初始化。
- 在那个类的构建器中。
- 紧靠在要求实际使用那个对象之前。这样做可减少不必要的开销——假如对象并不需要创建的话。
继承的语法
含有自变量的构造器
如果构造器中含有自变量,必须明确编写对基础类的调用代码。
class Game {
Game(int i) {
System.out.println("Game constructor");
}
}
class BoardGame extends Game {
BoardGame(int i) {
super(i);
System.out.println("BoardGame constructor");
}
}
捕获基本构造器的违例
编译器会防止衍生类构建器捕获来自基础类的任何违例事件。显然,这有时会为我们造成不便。
public class A {
public A() throws Exception{
throw new Exception("基类报错信息。。。");
}
public A(String s){
System.out.println("A s:" + s);
}
}
class B extends A{
public B() throws Exception {
super();
}
public B(String s){
super(s);
System.out.println("s : " + s);
}
public static void main(String[] args) {
try{
B b = new B("111");
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上面的程序中,若导出类B没有明确调用A的某个构造器,则会默认调用基类A的默认构造方法;如果B的带参构造器中public B(String s)
没有显示调用 super(s);
,则会调用A的默认构造器,这时A的默认构造器抛出异常,B的默认构造器里不能捕获基类A构造器中抛出的异常,需直接抛出,像这样public B(String s) throws Exception{
,如果上面程序中B的带参构造器调用的是基类A的默认构造器,那B的带参构造器也需要抛出异常。
protected
protected本身是私有的,但是可由这个类的子类或同包内的任何东西访问。
累积开发
继承的一个好处是它支持“累积开发”,允许我们引入新的代码,同时不会为现有代码造成错误。我们可保持现有代码原封不动(另外有人也许仍在使用它),不会为其引入自己的编程错误。一旦出现错误,就知道它肯定是由于自己的新代码造成的。
请注意,继承是对一种特殊关系的表达,意味着“这个新类属于那个旧类的一种类型”。
上溯造型(向上转型)
向上转型是安全的,因为衍生类的方法要比基类的多,向上转型只是丢掉了衍生类中的方法,保留基类的方法。但是其表现的行为还是衍生类的行为,这就是行为的正确性。
合成与继承的结合
确保正确的清除
有些类必须写一个特别的方法,明确的做清理的工作,比如io操作,有close方法。
一般在try中使用,在finally中执行清理。像这样:
CADSystem x = new CADSystem(47);
try {
// Code and exception handling...
} finally {
x.cleanup();
}
不能指望知道垃圾收集何时开始。除了内存的回收外,其他任何东西最好不要依赖垃圾收集器进行回收,需要制作自己的清理方法。也不要依赖finalize()
理解java中的
finalize()
- finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。
- finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性
- 不建议用finalize方法完成“非内存资源”的清理工作,但建议用于:① 清理本地对象(通过JNI创建的对象);② 作为确保某些非内存资源(如Socket、文件等)释放的一个补充:在finalize方法中显式调用其他资源释放方法。
如何理解合成和继承?
比如汽车和车辆的关系,汽车并不“包含”车辆;相反,它“属于”车辆的一种类别。而轮子,车门,车灯等可以组合成一辆汽车。“属于”关系是用继承来表达的,而“包含”关系是用合成来表达的。
final关键字
意思是:声明“这个东西(数据、方法、类)不会变”。
final数据
final若作用于基本数据类型代表“常数”,主要应用于两方面:
编译期常数,它永远不会变
在运行期初始化一个值,我们不希望它发生变化
在编译期的常数,程序可将常数值“封装”到计算过程中,可在编译期执行,从而节省运行时的开销。
若final作用于对象句柄,则句柄值初始化到一个具体的对象。而且永远不能将句柄指向另一个对象。
类再生(合成、继承、final)的更多相关文章
- 重新开始学习javase_类再生(类的合成和继承)
一.合成在新类里简单地创建原有类的对象.我们把这种方法叫作“合成” 为进行合成,我们只需在新类里简单地置入对象句柄即可.举个例子来说,假定需要在一个对象里容纳几个 String对象.两种基本数据类型以 ...
- Action类为何要继承ActionSupport
Action类为何要继承ActionSupport 理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承com.open ...
- php面向对象之抽像类、接口、final、类常量
一.抽像类(abstract) 在我们实际开发过程中,有些类并不需要被实例化,如前面学习到的一些父类,主要是让子类来继承,这样可以提高代码复用性语法结构: 代码如下 复制代码 ab ...
- 构造方法为private与类修饰符为final
构造方法为private的:在这个类外1:不能继承这个类2:不能用new来产生这个类的实例 在这个类内:1:可以继承这个类2:可以用new来产生这个类的实例 类修饰符为final的:在这个类外1:不能 ...
- OOP2(虚函数/抽象基类/访问控制与继承)
通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当 ...
- UML类图关系(继承、泛化、实现、依赖、关联、聚合、组合)
继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者 ...
- 类,接口,final
继承extends 子类实例化过程: 子类中所有的构造方法默认都会访问父类中空参的构造方法 因为每一个子类的构造方法的提议行都有一条默认的语句super(); this super final修饰类, ...
- Java自学-接口与继承 final
Java的修饰符final final修饰类,方法,基本类型变量,引用的时候分别有不同的意思. 示例 1 : final修饰类 当Hero被修饰成final的时候,表示Hero不能够被继承 其子类会出 ...
- 面试官:你说你懂动态代理,那你知道为什么JDK中的代理类都要继承Proxy吗?
之前我已经写过了关于动态代理的两篇文章,本来以为这块应该没啥问题,没想到今天又被难住了- 太难了!!! 之前文章的链接: 动态代理学习(一)自己动手模拟JDK动态代理. 动态代理学习(二)JDK动态代 ...
随机推荐
- NBU磁带库报错代码
Linux驱动报错"Sense Key"和"ASC and ASCQ"含义 1.Sense Keys Definitions 0x0 No sense 0x1 ...
- dapi 基于Django的轻量级测试平台三 接口关联
QQ群: GitHub:https://github.com/yjlch1016/dapi 一.接口关联思路: 在接口测试中, 很多场景下, 上一个接口的出参要作为下一个接口的入参, 即上一个接口的响 ...
- go实现tcp 服务器
我们将使用 TCP 协议和协程范式编写一个简单的客户端-服务器应用,一个(web)服务器应用需要响应众多客户端的并发请求:Go 会为每一个客户端产生一个协程用来处理请求.我们需要使用 net 包中网络 ...
- zzulioj - 2617 体检
题目链接: http://acm.zzuli.edu.cn/problem.php?id=2617 题目描述: VX玩了这么多游戏以后,感觉自己身体素质和智商都有所下降,所以决定去医院体检一下.已知V ...
- three.js 设置透明度
原文:https://www.cnblogs.com/amy2011/p/6148736.html 材质: 材质就像物体的皮肤,决定了几何体的外表,例如是否像草地/金属,是否透明,是否显示线框等 Th ...
- ESA2GJK1DH1K升级篇: 移植远程更新程序到STM32F103RET6型号的单片机,基于(GPRS模块AT指令TCP透传方式)
前言 上节实现远程更新是更新的STM32F103C8T6的单片机 GPRS网络(Air202/SIM800)升级STM32: 测试STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定 ...
- 5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(配置MQTT的SSL证书,验证安全通信)
4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(为域名申请SSl证书) 前面的准备工作终于完了 复制这两个证书 放到云端MQTT的这个位置,其实放哪里都可以 ...
- 解析XML数据
在 Java 程序中读取 XML 文件的过程称为解析 XML 解析 XML 文件的方式 1) DOM 解析 (java 官方提供) 2) SAX 解析(java 官方提供) 3) JDOM 解析(第三 ...
- [转帖]Mysql各版本介绍及下载
Mysql各版本介绍及下载 http://blog.itpub.net/12679300/viewspace-1251661/ 原创 MySQL 作者:wzq609 时间:2014-08-15 10: ...
- JAVA WEB项目目录结构以及web应用部署的根目录,编译路径和项目根目录的区别
本文链接:https://blog.csdn.net/l00149133/article/details/78984083 web应用部署的根目录,编译路径和项目的根目录有什么区别? 直接上例子: 你 ...