`

面向对象的访问控制基于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吧 毕竟对象是概念化的没有办法控制的吧

相关推荐

    面向对象编程基础_python面向对象_python教程_

    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作这些数据的方法封装在一起。在Python中,面向对象编程是其核心特性之一,使得Python成为了一种非常适合...

    js 面向对象实例

    面向对象编程在JavaScript中的实现主要基于以下三个概念:构造函数、原型和实例化。构造函数是一个特殊类型的函数,用于创建和初始化一个新对象。当你定义一个构造函数时,实际上是在定义一个对象类型。例如: ```...

    C++面向对象实验代码实验2

    在本实验中,我们将深入探讨C++的面向对象特性,这是C++编程语言的核心概念,也是现代软件开发的重要工具。面向对象编程(Object-Oriented Programming, OOP)以其封装、继承和多态三大特性,使得代码更加模块化,...

    python面向对象练习题.pdf

    ### Python面向对象编程知识点解析 #### 一、面向对象三大特性及作用 **1. 封装** 封装是面向对象编程中的一个重要概念,它通过隐藏类的内部细节并对外提供公共接口来保护数据的安全性和完整性。封装使得类的使用...

    python面向对象

    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作这些数据的方法封装在一起。在Python中,面向对象编程是其核心特性之一,允许开发者创建复杂、可维护的...

    Javascript面向对象编程.

    4. **类(Class)**:ES6引入了类语法糖,使得JavaScript的面向对象更加符合传统面向对象语言的写法,但实际上,这些“类”仍然基于原型实现。 ```javascript class Person { constructor(name) { this.name = ...

    广州大学 面向对象A卷考题

    面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它基于“对象”的概念,通过封装、继承和多态等核心特性,实现了代码的复用和模块化,极大地提高了软件开发的效率和可维护性。...

    面向对象软件构造(内含57个参考文献)

    面向对象软件构造是软件开发领域中的一个重要概念,它基于面向对象编程(Object-Oriented Programming,简称OOP)的理念,通过模拟现实世界中的实体和它们之间的关系来构建复杂的软件系统。这种方法使得代码更加模块...

    Java-面向对象设计-类和对象.docx

    类的设计是面向对象程序设计的重点,而不是对象的设计。一个类按同种方法产生出来的多个对象,其初始状态都是一样的,但是修改其中一个对象的时候,其他的对象是不会受到影响的。 类的声明和定义在使用类之前,必须...

    VB.NET面向对象CLASS的实现.rar

    在VB.NET编程中,面向对象(Object-Oriented Programming,OOP)是一种强大的设计和开发方法,它基于类(CLASS)的概念,使代码更易于维护、重用和扩展。本资料包“VB.NET面向对象CLASS的实现”深入探讨了如何在VB...

    《面向对象的程序设计》期末试卷(A)答案.pdf

    综上所述,面向对象程序设计的核心在于创建具有封装性、继承性和多态性的对象,而这些特性通过类与对象、属性、方法和继承等概念来实现。掌握这些基础知识对于编程人员来说至关重要,不仅有助于编写结构清晰、易于...

    视频教程-C#面向对象基础01

    1. **面向对象编程(Object-Oriented Programming, OOP)**:面向对象编程是一种程序设计范式,它基于“对象”的概念,通过封装、继承和多态等机制,使代码更易于理解和维护。C#是支持面向对象编程的语言之一,具有...

    面向对象程序设计与C++语言

    面向对象程序设计是一种编程范式,它基于“对象”的概念,将数据结构和操作这些数据的方法结合在一起。C++语言是实现面向对象编程的主要工具之一,由Bjarne Stroustrup于1983年在C语言的基础上扩展而来,旨在提供更...

    Python 面向对象(进阶篇).pdf

    Python面向对象编程是一种基于类和对象概念的编程范式,它支持封装、继承和多态等面向对象的特性。在面向对象编程中,类可以看作是对象的蓝图或模板,而对象则是根据类创建的实例。类中可以定义字段(数据成员)、...

    面向对象程序设计c++

    面向对象程序设计是现代软件开发中的核心概念,它基于实体的抽象、封装、继承和多态等原则。C++是一种支持面向对象编程的强大的编程语言,它的类是实现面向对象特性的重要工具。在这个主题中,我们将深入理解C++中的...

    【传智播客.Net培训—C#面向对象基础】01面向对象简介1

    【标题】"【传智播客.Net培训—C#面向对象基础】01面向对象简介1"所涉及的知识点主要集中在C#编程语言的基础部分,特别是面向对象编程(Object-Oriented Programming,简称OOP)的基本概念。面向对象是现代软件开发...

    JAVA面向对象程序设计(期末考试试题及答案).pdf

    Java面向对象程序设计是编程领域中的核心概念,它基于面向对象的编程思想,将现实世界中的实体抽象为类,通过类来创建对象,实现代码的复用和模块化。在这个期末考试试题中,我们看到了一系列关于Java编程的问题,...

    面向对象与c++

    面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它基于“对象”的概念,强调数据和操作数据的方法结合在一起。C++是实现面向对象编程的主流语言之一,以其强大的功能和灵活性著称。...

    delphi面向对象

    Delphi是一种强大的面向对象的编程环境,以其高效的编译器和直观的集成开发环境(IDE)而闻名。在深入探讨Delphi的面向对象特性之前,我们先来了解一下面向对象编程的基本概念。 面向对象编程(Object-Oriented ...

Global site tag (gtag.js) - Google Analytics