为什么子类不能访问基类的private成员(为什么要使用get,set方法)?为什么要这样设计?
来源:互联网 发布:java微服务框架有哪些 编辑:程序博客网 时间:2024/06/05 04:49
为什么子类不能访问基类的private成员?为什么要这样设计?
stringclassjavaapieclipseobject
看到很多朋友提问“为什么子类不能访问基类的private成员”?随后看到很多朋友回答“这是规范”“这是封装的特性”类似这样的回答。我觉得大家都是对的。但是有时候您需要关注提问的重点在于why?为什么Java要这样设计private?或者是Object Oriented为啥要这样设计这样的机制?
- 封装性:首先,private成员具有良好的封装性(encapsulation)。这个性质对于良好的设计来说是个重要的要素。因为良好的封装性会减小耦合的。服务代码可以定义public函数给客户代码。这样一来客户代码可以和服务代码并行开发。更重要的是,如果修改服务代码的内部实现也不需要改动客户代码。
- 子类也是客户代码:对于客户代码的理解最直接的就是调用这个类的代码,这个很好理解。更深入的理解就可以把客户代码延伸到这个类的子类。从这一点来说子类就是基类的客户代码。你定义了一个class,在里面写了些通用的方法,甚至申明了abstract方法要求别人来继承。这个时候基类里面的protect成员就是对外的API,因为这些方法对子类来说是可见的,你不能随意改动。这个时候如果这个成员是public或者protected就可能造成麻烦。对于API来说你不能随意改动。你能设想JDK里面的有些类的API改动的情况吗?至少我会抓狂的:)
- 访问权限扩大原则:延伸话题来说,还有就是Java对override的时候访问权限的限制。大家都知道Java的访问权限从小到大是:private-> default-> protected-> public。如果要override一个基类里面的方法,那么子类的这个方法的权限不能比被override的函数权限小。这样就导致一个隐性的问题:如果你的基类有public方法,那么它的子类里面都有这个方法的public属性。你不能把基类的这个方法private化。换句话说一旦定义了public函数,它的子类都要维护这个public方法。所以就算是方法也要小心地把它设为public。
当然如果这个基类到最终的子类都是你维护,或者这个类本身就是个非public的类,那么原则可以放宽。
顺便说一下,Eclipse有自动生成标准get/set函数的功能,所以生成get/set是很容易的事情,不要为了方便把成员都变成public。
譬如写了个基类Base,然后有人继承了Base:
- public class Base {
- public String[] data;
- }
- class Sub extends Base{
- public void show(){
- System.out.println(Arrays.toString(this.getData()));
- }
- }
可是有一天你发觉用ArrayList更好,你就把Base改成:
- public class Base {
- //public String[] data;
- public ArrayList data;
- }
然后所有Base的子类都无法编译,直接调用到子类data域的类也无法编译。这就是噩梦,客户端程序员会用眼光追杀你:)
回过头来想,如果当初Base的data域是private,由get/set来访问,那么你可以轻松的修改Base, 子类无需改动:
- public class Base {
- //private String[] data;
- private ArrayList<String> data;
- public String[] getData() {
- return (String[]) data.toArray();
- }
- public void setData(String[] data) {
- this.data = new ArrayList<String>(Arrays.asList(data));
- }
- }
0 0
- 为什么子类不能访问基类的private成员(为什么要使用get,set方法)?为什么要这样设计?
- 为什么子类不能访问基类的private成员?为什么要这样设计?
- 为什么子类不能访问基类的private成员?为什么要这样设计?
- 为什么子类不能访问基类的private成员?为什么要这样设计? .
- 为什么子类不能访问基类的private成员?为什么要这样设计?
- JAVA中为什么要采用get,set方法的形式来对成员变量进行访问
- 为什么要使用Get和Set访问器
- 为什么Java成员类里面要写set、get等方法而不是直接public?
- 为什么要写get和set方法
- 为什么类和接口不能使用private和protected?接口的方法不能使用private、protected、default
- 子类为什么不能重写父类的静态方法
- 子类为什么不能重写父类的静态方法
- 子类为什么不能重写父类的静态方法
- 子类为什么不能重写父类的静态方法
- 子类为什么不能重写父类的静态方法
- WPF/Silverlight为什么要使用Canvas.SetLeft()这样的方法?
- WPF/Silverlight为什么要使用Canvas.SetLeft()这样的方法?
- 为什么子类中不能访问另一个包中父类中的protected方法?
- localtime函数与localtime_r函数区别
- php配置php-fpm启动参数及配置详解
- hdu 3584 Cube
- string常用类的学习
- visualstudio 2013连接mysql数据库
- 为什么子类不能访问基类的private成员(为什么要使用get,set方法)?为什么要这样设计?
- dubbo+zookeeper+spring的demo
- poj 1651 Multiplication Puzzle
- 使用Eclipse的maven构建一个web项目
- PHP生成条形码barcode
- spring mvc拦截器和<mvc:annotation-driven />的详解
- springMVC 学习(什么是依赖注入)
- Cocos2d-x 环境搭建和项目创建
- 代理的简单使用