Java进阶之路_重温《java编程思想》篇(三)

第六章 访问控制权限

        前一段时间在公司checkout代码,进行了Maven Update之后,发现报错了,点开报错的地方,发现是调用公司内部的一个jar包有错误,然而这个里面的代码是很久都没有改的,后来检查之后才知道原来是那个jar包更新了,本来是两个参数,现在变成了一个参数,然而我们这边代码并没有做相应修改。

         这个例子就是一个更新类库不合理的一个例子,因为它影响了客户代码。

 为了使得类库开发者在修改类库的时候不影响客户端程序,需要用到控制访问权限来达到目的。仅仅将自己需要给别人调用的方法暴露出来,其他方法都不能暴露出来,并且,暴露出来的方法不能够再进行修改。

第七章 复用类

在继承的时候,导出类在进行编译的时候,会先编译父类,有多少层继承关系一次网上推,生成其父类的class文件,然后再编译自身,并生成class文件。在进行类引用的时候,编译的时候也会将引用的类编译成class文件。

 代码如下:

class Art {
	Art(){
		System.out.println("Art constructor.");		
	}
}
class Drawing extends Art {
	Drawing() {
		System.out.println("Drawing constructor.");	
	}
}
	
public class Cartoon extends Drawing {
	public Cartoon() {
		System.out.println("Cartoon constructor.");	
	}
	public static void main(String[] args) {
		B b;
		Cartoon x = new Cartoon();
	}
}

使用Javac编译Cartoon.java文件,编译结果如下图:

Java进阶之路_重温《java编程思想》篇(三)_第1张图片


在继承中,如果父类的构造函数是带参数的,那么在子类构造方法中必须显式的调用其父类的构造方法,并传入相应的参数,使用super,并且该调用必须现在子类构造方法的最前面,否则编译不通过。


关于代理:

组合和继承都能够达到代码复用的目的。组合是将一个成员对象置于所要构造的类中;而继承则是在新类中暴露了该成员对象的所有方法。而代理则是中庸的处理了这些问题,将需要暴露出的方法暴露给代理类,让代理类去置于需要构造的类中。                                                                                               继承其实使用的比较少,一般都是用的组合。到底使用 组合还是继承,一个最清晰的判断办法就是问一问自己是否需要从新类向基类进行向上转型。如果是必要的,则继承是必要的,但如果不需要,则应当好好考虑自己是否需要继承。      


final:

使用final修饰对象的引用的时候,一旦被赋值一个对象之后就不能将其他对象赋值(这里可以不进行初始化,但必须在域的定义中或者构造方法中进行初始化,也就是在使用它前,必须得初始化),也就是引用不能够改变,但是被引用的对象本身可以被改变。

示例代码:

final Amphibian f = new Frog();
f.setName("hehe");

final方法:

使用final方法的原因有两个。第一个原因是把方法锁定,不允许继承他的任何类修改它,这是出于设计的考虑。想要确保在继承中使用方法行为保持不变,并且不会被覆盖。

过去建议使用final方法的第二个原因是效率,在Java早期视线中,编译器将所有final方法的调用转为内嵌调用。当编译器发现一个final方法调用命令时,他会根据自己的谨慎判断,跳过插入程序代码这种正常法师而执行方法调用机制(将参数压入栈,跳至方法代码处并执行,然后跳出并清理栈中的参数,处理返回值),并且以方法体重的实际代码值的副本来代替方法进行调用。消除了方法调用的开销。

在最近的Java版本中,虚拟机(特别是Hotspot技术)可以探测到这些情况,并优化去掉这些效率反而降低的额外的内嵌开销,因此不再需要使用final方法来进行优化了。

                                              

你可能感兴趣的:(重温《java编程思想》)