`
wupuyuan
  • 浏览: 75872 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

面向对象的访问控制基于class而不是对象

阅读更多

        最近遇到个很有意思的问题,原来一直没太注意。这个问题是面向对象的访问控制是基于class还是对象。先写个例子。现在有个一类A如下:

class A {
    private String str;

    public A(String str) {
        this.str = str;
    }

    public void print(A a) {
        a.private_method();
    }

    private void private_method() {
        System.out.println(str);
    }
}

         在方法里调用如下:

    public static void main(String[] args) {
        A a1 = new A("a1");
        A a2 = new A("a2");
        a2.print(a1);
        a1.print(a2);
    }

       这么做编译通过,并且顺利执行。这就出现了一个很有意思的现象,实例a1和a2都能调用对方的private_method()方法。无论是Java还是C++,都是这样的情况。

    从程序的实现角度来说,调用方法和类属性的本质,是通过“特征”在对象所加载的堆区寻找合适的方法和属性。而“特征”则是由class模板定义的,所以无论根据同一个class模板new出多少个新对象,所包含的“特征”都是相同的。这就是访问控制是根据class来而不是Object来的。参考了JDK的文档,的确也是这么说的。

    针对刚刚的例子略做修改就更容易理解了:

class A {
    private String str;

    public A(String str) {
        this.str = str;
    }

    public static void print(A a) {
        a.private_method();
    }

    private void private_method() {
        System.out.println(str);
    }
}

     调用如下:

    public static void main(String[] args) {
        A a1 = new A("a1");
        A a2 = new A("a2");
        A.print(a1);
        A.print(a2);
    }

     这样就可以很清楚的知道,访问权限的控制是基于class的了。

分享到:
评论
5 楼 wupuyuan 2015-02-25  
矢风快乐 写道
不同意楼主的看法。
class A {
    private String str;

    public A(String str) {
        this.str = str;
    }

    public void print() {
        this.private_method();
    }

    private void private_method() {
        System.out.println(str);
    }
}

这样就不会发生上面的事情了!

这里的关键就是static的用法。去掉了自然就只能基于对象了。
4 楼 矢风快乐 2015-02-25  
不同意楼主的看法。
class A {
    private String str;

    public A(String str) {
        this.str = str;
    }

    public void print() {
        this.private_method();
    }

    private void private_method() {
        System.out.println(str);
    }
}

这样就不会发生上面的事情了!
3 楼 wupuyuan 2013-08-20  
notCharming 写道
感觉这两个例子并没说明了——面向对象的访问控制基于class而不是对象

比如第一个:
public static void main(String[] args) { 
    A a1 = new A("a1"); 
    A a2 = new A("a2"); 
    a2.print(a1); 
    a1.print(a2); 
}

a2.print(a1);  传入的参数为对象a1,public void print(A a)方法也只是包含了a1这个对象调用自身private方法。权限控制不还是在对象这一层面?或者还是我的理解不对?


这么解释下:
A a1 = new A("a1");  此时在内存块1中创建了对象a1。
A a2 = new A("a2");  此时在内存块2中创建了对象a2。
但是a1和a2的class模板都是同一个class A位于方法区。
所以,a2.print(a1)和a1.print(a2),通过本对象地址方位目标对象。但是权限控制是在方法去的class A。这么说清楚点么?
2 楼 notCharming 2013-08-19  
感觉这两个例子并没说明了——面向对象的访问控制基于class而不是对象

比如第一个:
public static void main(String[] args) { 
    A a1 = new A("a1"); 
    A a2 = new A("a2"); 
    a2.print(a1); 
    a1.print(a2); 
}

a2.print(a1);  传入的参数为对象a1,public void print(A a)方法也只是包含了a1这个对象调用自身private方法。权限控制不还是在对象这一层面?或者还是我的理解不对?
1 楼 高某某 2013-04-20  
虽然class不都是对象可 对象不都是抽象后用class表示的么。。这问题。唉。。只能答class吧 毕竟对象是概念化的没有办法控制的吧

相关推荐

    面向对象程序设计与实践-Java抽象类和接口[33页].pptx

    访问权限 返回值数据类型 成员方法名(形式参数列表){ …方法实现 } } 面向对象程序设计与实践-Java抽象类和接口[33页]全文共33页,当前为第7页。 抽象类的特点 5-1关联知识 (1)抽象类中可以有抽象方法,也可以有...

    【文献综述】基于JAVA的俄罗斯方块游戏设计与实现.pdf

    2.JAVA 特性 2.1 面向对象 Java 的特点之一就是面向对象[2],是程序设计方法的一种。 "面向对象程序设计语言" 的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。代码和数据的 实际集合体叫做...

    JavaScript基础和实例代码

    4.1 面向对象编程与基于对象编程 4.1.1 什么是对象 4.1.2 面向对象编程 4.1.3 面向对象编程:继承 4.1.4 面向对象编程:封装 4.1.5 面向对象编程:多态 4.1.6 基于对象编程 4.2 JavaScript对象的生成 4.2.1 HTML文档...

    源文件程序天下JAVASCRIPT实例自学手册

    4.1 面向对象编程与基于对象编程 4.1.1 什么是对象 4.1.2 面向对象编程 4.1.3 面向对象编程:继承 4.1.4 面向对象编程:封装 4.1.5 面向对象编程:多态 4.1.6 基于对象编程 4.2 JavaScript对象的生成 4.2.1 HTML文档...

    第十三课 class类1

    第十三课 class 类学习目录类基本介绍与用法类继承类成员访问修饰符一.类基本介绍与用法以前我们学习过 es5 中构造函数来构建基于面向对象的组件,主要是因为

    PHP笔记之:基于面向对象设计的详解

    public 表示全局,类内部外部子类都可以访问;复制代码 代码如下:<?php class Test{ public $name=’Janking’, $sex=’male’, $age=23; function __construct(){ echo $this->age.' ’.$this->name.'...

    超级有影响力霸气的Java面试题大全文档

    面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性:  多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化...

    程序设计教程 陈家骏等编著

    第12章 实例--面向对象的Windows应用程序框架 337 12.1 Windows应用程序的基本结构 337 12.1.1 应用程序的用户界面 337 12.1.2 消息驱动的程序结构 339 12.2 MFC类库(Microsoft Foundation Class library) 341 ...

    基于java的校园二手交易系统毕业设计.zip

    在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...

    基于java web技术的毕业设计商城项目。.zip

    在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在...

    毕业设计基于Cesium时空数据可视化后台Java SSM框架.zip

    在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在...

    毕业设计---基于java的软件资源库的实现(后端).zip

    在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在...

    基于Java Web的智能二维码门禁管理系统(本科毕业论文+毕业设计).zip

    在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在...

    计算机毕业设计,课程设计,基于java电影院订票选座系统,带论文.zip

    在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在...

    毕业设计项目,基于Java语言,Tomcat9.0,MySQL8.0考研机构信息管理系统.zip

    在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在...

    基于Vue的电影在线预订与管理系统-后台java代码(ssm)(毕业设计).zip

    在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在...

    二十三种设计模式【PDF版】

    设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须找到相关的对象,以适当的粒度将它们归 类,再定义类的接口和继承层次,建立对象之间的基本关系。你的设计应该对手头的问题有针对性,同时...

    java 面试题 总结

    面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多...

    Java的六大问题你都懂了吗

    其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:所以,使用instanceof在绝大多数情况下并不是...

Global site tag (gtag.js) - Google Analytics