【effective Java读书笔记】类和接口(一)

来源:互联网 发布:mac lion dmg 编辑:程序博客网 时间:2024/06/10 19:30

前言:

这一章节算是基础章节。

正文:

第13条:使类和成员的可访问性最小化

一》理论,可跳过:

一、首先提到一个信息隐藏/封装的概念。

二、对类和接口:访问级别

private:包级私有。私有的特点,包独有的,以后可对该级别的进行修改删除替换都不会影响。

public::共有的。那么永远需要对外支持这个类或者接口。

三、对成员有四种访问级别:

private:类内部可以访问

包级私有:对于包内,相当于public。对于包外,相当于private。

protected:继承类/子类可以访问,内部类也可以访问。

public:任何地方都可以访问。

二》代码举例:

举例一:一个子类方法覆盖父类方法的例子

父类如下:

public class Father {public Father() {say();sing();}private void say(){System.out.println("Father");}protected void sing(){System.out.println("Father sing");}}

子类如下:

public class Son extends Father{public Son() {say();sing();}private void say(){System.out.println("Son");}protected void sing(){super.sing();System.out.println("Son sing");}}

单元测试:

public class Test {@org.junit.Testpublic void test() {Father father = new Father();System.out.println("-------------");Son son = new Son();}}

执行结果:

Father

Father sing

-------------

Father

Father sing

Son sing

Son

Father sing

Son sing

父类的执行结果显而易见,就是构造方法的两个显示。分割线后,子类的显示值得好好一提:还记得我有一篇文章写过类加载的顺序:父类静态,子类静态,父类非静态代码块,父类构造方法,子类非静态代码块,子类构造方法。

然后此处,先父类构造方法,然后子类构造方法。父类构造方法:

Father

Father sing

Son sing

父类构造方法先被调用,但是打印了一个Son sing。此处有蹊跷啊!原因是什么呢?因为先调用父类的构造方法无可厚非,调用自身的Say()方法也没有争议,因为它是private,而调用sing()方法的时候,实际上调用的是子类的sing()方法。因为子类sing方法覆盖父类sing方法(此处应该用@Override注释)。可查看该文章看具体的覆盖和重载方法的区别。

这里有一个点:方法选择,覆盖是在运行时选择。重载是在编译时选择。

子类构造方法:

Son

Father sing

Son sing

先调用了一次Son sing,此处无可争议。

总结:

结果分析完,然后分一下今天的课题,private方法,看似say()方法子类覆盖了父类的方法,实际上父类的方法是一个单独的方法,与子类同名方法半点关系没有。因此做到了非常友好的隔离。但是因为sing()方法,父类是protected,子类继承了之后覆盖了,导致后续分析相当复杂,可能因此付出昂贵的代价。


举例二:public或者protected的,或者包级私有的引用型对象。

public class FoodBean {public List<String> strs = new ArrayList<>();}

对外公开后,外部能改变对象的内容。外部用strs引用改变strs的内容,造成安全性差。此处可以参考保护性拷贝的章节。


第14条:在共有类中使用访问方法而非公有域

举例(反例代码):

public class Point {public double x;public double y;}

我对此处的理解,这么使用无可厚非。道理上也说的过去。但是如果说扩展性上来讲,却是一点都没有。

但是只是现代开发基本上都基于MVC模式或者他的变种。比如我设置x,y的时候,不是通过double值设置,而是通过字符串转义,那么这个代码就不那么友好了。所以有个好的封装性set,get代码很有必要。比如set方法中可以通过接受String然后转义成double值。虽然这个比喻可能不恰当,但是却是一个实际的例子。