【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值。虽然这个比喻可能不恰当,但是却是一个实际的例子。
- 【effective Java读书笔记】类和接口(一)
- Effective Java读书笔记(一):类、接口、对象
- Effective Java读书笔记、感悟——3.类和接口(一)
- Effective Java读书笔记(4 类和接口)
- Effective Java读书笔记(第4章-类和接口)
- 【读书笔记】《Effective Java》(3)-- 类和接口
- 【effective Java读书笔记】类和接口(二)
- Effective Java 读书笔记(三):类和接口
- Effective Java读书笔记——第四章 类和接口
- Effective Java 读书笔记(一)
- Effective Java读书笔记(一)
- Effective Java读书笔记(一)
- Effective Java读书笔记-接口优于抽象类
- 《Effective Java》读书笔记(一)之创建和销毁对象
- Effective Java 读书笔记(一):创建和销毁对象
- Effective Java读书笔记一
- effective java读书笔记一
- 《Effective Java》读书笔记一
- webstorm工具使用的快捷键
- C 关于链表的一些操作
- Android 增量更新
- 一个简单的Makefile教程
- Python编程_Lesson008_Python特性
- 【effective Java读书笔记】类和接口(一)
- TensorFlow RNN 教程和代码
- Couldn't deal with it,bug!!!
- 【bzoj1260】[CQOI2007]涂色paint
- Spring整合Mybatis
- 二叉树的镜像
- 16. 排序--简单排序
- Spring
- IDEA Error:java: Compilation failed: internal java compiler error