`

public,private,protected访问权限在Java,C++中的解析

阅读更多

Java中:

Java中的访问权限有public,private,protected和默认的包访问权限,如果类中的属性方法没有显示的指明访问权限,则具有包访问权限,我喜欢称它为packeged权限,很多人也称它为friendly访问权限,而packaged和friendly这两个关键字在实际中都是不存在的。

详细解释,我引别人的一篇博客,说明:

java访问权限修饰符public  protected  friendly private用法总结 

     首先声明:java中,friendly这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是friendly。

 

java作用域public ,private ,protected 及不写时的区别    
在说明这四个关键字之前,我想就class之间的关系做一个简单的定义,对于继承自己的class,base class可以认为他们都是自己的子女,而对于和自己一个目录下的classes,认为都是自己的朋友。



1、publicpublic表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用



2、privateprivate表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。



3、protectedprotected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private

作用域       当前类    同一package   子孙类     其他package

public        √       √             √           √

protected     √       √             √           ×

friendly      √       √             ×           ×

private       √       ×             ×
           ×

 


    为了条理清晰,分三种不同情况来总结。


   一 访问权限修饰符修饰成员变量和方法
   public:表明该成员变量和方法是共有的,能在任何情况下被访问。
  
   protected:必须在同一包中才能被访问。(说的比较简单,看个例子就明白了)   
       eg:class A
          {
            protected int weight ;
            protected int f( int a,int b   )  
            {
              // 方法体
            }
           }     
       假设B与A在同一个包中,则
           class B
          {
            void g()
            {
              A a=new A();
              A.weight=100;//合法
              A.f(3,4);    //合法
             }
           }
   特别说明:什么是在同一个包中?
   答:用package打包在一起的class ,叫在同一个包中。(不明白,举个例子)
       eg:在JDK的src\java\io中,你会看到许多java类,第一句源代码都是package java.io;
       没有使用package打包的,在同一目录下的类也会被视做同一个包。
  
   friendly:在这种情况下中,同protected。区别在第二和第三种情况中。
       eg: class A
          {
            int weight ;
            int f( int a,int b   )  
            {
              // 方法体
            }
           }     
       假设B与A在同一个包中,则
           class B
          {
            void g()
            {
              A a=new A();
              A.weight=100;//合法
              A.f(3,4);    //合法
             }
           }
    private: 只能在本类中访问。
             eg:    class   Test
                    { 
                       private int money;
                       Test()
                       {
                          money=2000;
                       }
                       private int getMoney()
                       {
                         return money;
                        }
                     public  static  void main(String args[])
                     {
                         Test te=new  Test();
                         te.money=3000;             //合法
                         int m=te.getMoney();       //合法
                         System.out.println("money="+m);
                      }
                     }
                  
   PS: 实际上,把重要的数据修饰为private,然后写一个public的函数访问它,正好体现了OOP的封装特性,是OOP安全性的体现。
   

二  访问权限修饰符修饰类
   1,不能用protected和private修饰类。
   2,用friendly修饰的类叫友好类,在另外一个类中使用友好类创建对象时,要保证它们在同一包中。
  

三   访问权限修饰符与继承
   这里的访问修饰符指的是修饰成员变量和方法。可以分为两种情况:
   1,子类与父类在同一包中
    此时只有声明为private的变量与方法不能被继承(访问)。
   eg:
     class Father
     {
       private int money ;
       int weight=100;
      
      }
     class Son extends Father
     {
       viod f()
       {
         money=10000;//   非法
         weight=100; //   合法
        }
      }
    2,子类与父类不在同一包中
    此时private与friendly均不能被继承(访问), protected与public可以。
     eg:
       Father.java

      package com.aaa
      public class Father
     {
       int height ;
       protected  int money=120;
       public int weight;
       protected int getMoney()
       {
         return money;
       }
       void setMoney(int newMoney)
       {
         money=newMoney;
       }
      }
    
      Son.java
      package com.bbb
      import com.aaa.Father;
      public class Son extends Father
      {
         void f()
         {
           money=10000;//合法
           //height=170;//非法,height为friendly修饰的变量
           System.out.println(money);//输出结果是10000
           //setMoney(300);          //非法
           int number=getMoney();    //合法
           System.out.println(number);//输出结果是10000
          }
           public  static  void main(String args[])
          {
            Son sss=new Son();
            sss.f();
           }
       }
  所以,访问权限修饰符权限从高到低排列是public  ,protected  ,friendly, private。

 

C++中

由于不存在包的概念,因此,protected与java中的protected有所不同,Java中的protected不但,子对象可以访问,而且包里的其它地方,也可以显示的通过子对象调用,如

package pack1

public class A{

     protected int a;

}

package pack1

public class B{

     public static void main(String[] args){

          System.out.println(a);

     }

}

上述代码是没有问题的,但如果B与A不在同一个包中,则不能访问。因此,在Java中,protected在可见性在与packaged权限类似,而只是在继承性上,没有对包划界,packaged权限不允许子象访问其它包内父对象的包访问权限的属性。

在C++里,protected属性有严格的定义,即只具有垂直的访问权限,只有其自身与其后代可以访问,限一个类的protected属性,只有其内部与子对象内部可以访问,而在其它地方是不可见的,为了说明这个问题,见以下代码:

class A{
protected:
 int a;
protected:
 void print(){
  cout<<"A protected method"<<endl;
 }
};
class B:public A{
protected:
 void test(){
  cout<<"test A"<<endl;
 }
};
int main(){
 B b;
 b.test();
 //b.print();
}

上述代码是无法编译的,因为b.test()在main里是不可见的,main无法访问b的protected方法,即使方法是通过子对象来调用的,如果把B中的protected方法改为public,则代码可以,编译成功,编译成功后,在B中可以房问父类的protected属性.

下表列出了C++三种继承对属性的访问情况:

           public属性         protected属性          private属性

public继承                public              protected               不可见

protected继承          protected         protected               不可见

private继承      private            private                   不可见

分享到:
评论

相关推荐

    C++ 类访问控制public、private、protected探讨.docx

    在C++中,有三种访问控制修饰符:public、private 和 protected。 1. **Public** 访问控制: 公共成员(public members)可以被类的任何对象、类的成员函数以及类的外部代码自由地访问。在上述代码示例中,`disp` ...

    C++ 类访问控制public、private、protected探讨.pdf

    C++ 类访问控制机制是面向对象编程中的核心概念,它主要涉及到`public`、`private`和`protected`这三个访问修饰符。它们的作用是限制类的成员(数据成员和成员函数)在不同作用域内的可访问性,从而实现数据封装和...

    概述C++中的 public protected private friend关键字的用法

    一个C++类中的变量如果如下关键字作为修饰符. 1. public: 程序的任何...下面在看下c++ public private protected关键字 1、当在类的内部使用这三个关键字,表示访问权限:  public: 可以被任意访问。  protected:

    面向对象修饰符public private protest super final abstract理解

    `protected`的访问级别介于`public`和`private`之间,它允许同一包中的类或子类访问被`protected`修饰的成员。例如: ```java class A { protected int x = 123; public int getX() { return x; } } class B ...

    C++中的三种继承public,protected,private详细解析

    C++是一种面向对象的编程语言,它提供了三种不同的继承方式:public、protected和private,每种方式对基类成员在子类中的访问权限有不同的影响。理解这些继承方式及其组合结果对于编写可维护和安全的代码至关重要。 ...

    C++类访问控制public、private、protected探讨[归类].pdf

    在C++中,存在三种访问修饰符:`public`、`private`和`protected`,它们决定了类的成员在不同上下文中的可见性和可操作性。 1. `public`:公共成员。公共成员函数和数据成员可以被类的任何对象、子类以及外部代码...

    C++封装例程(class,struct,public,protected,private,friend)

    C++封装(class,struct,public,protected,private,friend)的博客例程。 https://blog.csdn.net/flysnow010/article/details/136907034

    Java访问修饰符

    native 方法访问修饰符表示定义的方法在类中没有实现,而大多数情况下该方法的实现是用 C、C++ 编写的。 synchronized 方法访问修饰符 synchronized 方法访问修饰符表示多线程的支持,当一个此方法被调用时,没有...

    浅析Java中的访问权限控制Java开发Java经验技巧共

    本文将深入探讨Java中的访问权限控制,以及其在实际开发中的应用和重要性。 首先,Java提供了四种不同的访问级别,分别是:public、protected、默认(包级私有)和private。这些访问修饰符用于定义类、接口、方法和...

    银行员工权限管理系统C++

    C++中的访问修饰符(public、private、protected)能有效实现数据封装,确保只有具备相应权限的角色才能访问或修改特定信息。例如,员工的敏感信息如工资、职位等可设置为私有,只允许内部访问;而公共信息如姓名、...

    Ruby中的public、private、protected区别小结

    Ruby中,却不行:你只能在你本对象的实例中访问本对象的private方法。 因为Ruby的原则是“private意为你不能指定方法接收者”,接收者只能是self,且self必须省略! 所以Ruby中子类可以访问父类的privat

    C++Protected介绍

    在C++中,`protected`是一个访问修饰符,它用于控制类的成员(变量和函数)的访问权限。本章将深入探讨`protected`关键字及其在面向对象编程中的作用。 `protected`成员与`private`成员类似,都限制了对它们的直接...

    作业1:Java、C++和Python的OO特性调研报告1

    - Java 和 C++使用访问修饰符(public, protected, private)来控制成员的访问权限,实现信息隐藏。 - Python 依赖于命名约定和名称修饰来实现封装,没有明确的访问控制,但可以通过封装类的内部实现来隐藏细节。 5...

    C++类访问权限.doc

    - 如果一个类被private继承,那么父类的所有public和protected成员在子类中都会变成private,这意味着子类无法像处理public或protected成员那样访问这些成员,除非它们是友元。 4. 友元(Friendship): - 友元...

    面向对象编程C++和Java比较教程

    C++通过访问修饰符(public, private, protected)来控制成员的可见性,而Java则有类似的机制。 2. 继承:C++支持单继承和多重继承,一个类可以继承自一个基类,也可以同时继承多个基类,这增加了灵活性但也可能导致...

    子类的四种访问权限

    在C++中,类的成员访问权限通常分为三种:`public`(公有)、`protected`(受保护)和`private`(私有)。然而,当涉及到类的继承时,实际上存在第四种访问权限的概念——即所谓的“superprivate”(超私有),虽然...

    Java类protected继承链访问控制机制研究.pdf

    在C++中,类的访问修饰符主要有`private`(私有)、`protected`(保护)和`public`(公共)。`private`成员只能在类内部访问,`protected`成员可以被类本身和其子类访问,而`public`成员则在任何地方都可以访问。C++...

Global site tag (gtag.js) - Google Analytics