java权限修饰符详解及其与C++差异

35 篇文章 2 订阅

java权限修饰符详解及其与C++差异

java权限修饰符与c++差距挺大,在这里做个详细对比

一、java

java权限修饰符有四个:public、protected、默认什么也不加、private

1.类的权限修饰符(两个)

      public:公共,哪里都可以使用

      什么也不加:只能在本包中使用此类(使用此类的意思就是创建此类的对象)

2.类内成员(方法,成员变量,域)的权限修饰符(四个)

     public:在哪里都可以访问,但要看类的权限修饰符是什么,如果类的权限修饰符限定是本包内使用,包外不得创建类的对象,所以此成员肯定也不能被访问

     protected:在本包内可以被访问,且在包外继承此成员所在类的类内可以被访问,例子如下所示

                 包1:public class A{protected void fuc(){}}             包2:class B extends A{//此类内可以访问fuc函数}

     什么都不加:在本包内可以被访问,包外什么情况下都不能被访问

     private:只能在本类中使用,类外创建成员所在类的对象,这个对象都不可以调用此函数


二、C++

C++就只有三个权限修饰符,public、protected、private;在什么都不加的时候类内默认是private,结构体中默认是public

C++的权限修饰符有两种,一种是针对成员变量的,一种是针对继承的,类本身不需要权限修饰符

1.类内成员的权限修饰符

    private:类内和友元访问,跟java一样

   protected:类内和派生类中的成员函数访问

   public :都可以

参考如下代码:

#include<iostream>
#include<assert.h>
using namespace std;
class A{
public:
  int a;
  A(){
    a1 = 1;
    a2 = 2;
    a3 = 3;
    a = 4;
  }
  void fun(){
    cout << a << endl;    //正确
    cout << a1 << endl;   //正确
    cout << a2 << endl;   //正确,类内访问
    cout << a3 << endl;   //正确,类内访问
  }
public:
  int a1;
protected:
  int a2;
private:
  int a3;
};
int main(){
  A itema;
  itema.a = 10;    //正确
  itema.a1 = 20;    //正确
  itema.a2 = 30;    //错误,类外不能访问protected成员
  itema.a3 = 40;    //错误,类外不能访问private成员
  system("pause");
  return 0;
}

2.继承时的修饰符

先记住:不管是否继承,上面的规则永远适用!

有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。

1.public继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:public, protected, private

2.protected继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:protected, protected, private

3.private继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:private, private, private

但无论哪种继承方式,上面两点都没有改变:

1.private成员只能被本类成员(类内)和友元访问,不能被派生类访问

2.protected成员可以被派生类访问

再来看看以下代码:

1.public继承

代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<iostream>
#include<assert.h>
using  namespace  std;
 
class  A{
public :
   int  a;
   A(){
     a1 = 1;
     a2 = 2;
     a3 = 3;
     a = 4;
   }
   void  fun(){
     cout << a << endl;     //正确
     cout << a1 << endl;    //正确
     cout << a2 << endl;    //正确
     cout << a3 << endl;    //正确
   }
public :
   int  a1;
protected :
   int  a2;
private :
   int  a3;
};
class  B :  public  A{
public :
   int  a;
   B( int  i){
     A();
     a = i;
   }
   void  fun(){
     cout << a << endl;        //正确,public成员
     cout << a1 << endl;        //正确,基类的public成员,在派生类中仍是public成员。
     cout << a2 << endl;        //正确,基类的protected成员,在派生类中仍是protected可以被派生类访问。
     cout << a3 << endl;        //错误,基类的private成员不能被派生类访问。
   }
};
int  main(){
   B b(10);
   cout << b.a << endl;
   cout << b.a1 << endl;    //正确
   cout << b.a2 << endl;    //错误,类外不能访问protected成员
   cout << b.a3 << endl;    //错误,类外不能访问private成员
   system ( "pause" );
   return  0;
}

2.protected继承:

代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<iostream>
#include<assert.h>
using  namespace  std;
class  A{
public :
   int  a;
   A(){
     a1 = 1;
     a2 = 2;
     a3 = 3;
     a = 4;
   }
   void  fun(){
     cout << a << endl;     //正确
     cout << a1 << endl;    //正确
     cout << a2 << endl;    //正确
     cout << a3 << endl;    //正确
   }
public :
   int  a1;
protected :
   int  a2;
private :
   int  a3;
};
class  B :  protected  A{
public :
   int  a;
   B( int  i){
     A();
     a = i;
   }
   void  fun(){
     cout << a << endl;        //正确,public成员。
     cout << a1 << endl;        //正确,基类的public成员,在派生类中变成了protected,可以被派生类访问。
     cout << a2 << endl;        //正确,基类的protected成员,在派生类中还是protected,可以被派生类访问。
     cout << a3 << endl;        //错误,基类的private成员不能被派生类访问。
   }
};
int  main(){
   B b(10);
   cout << b.a << endl;        //正确。public成员
   cout << b.a1 << endl;       //错误,protected成员不能在类外访问。
   cout << b.a2 << endl;       //错误,protected成员不能在类外访问。
   cout << b.a3 << endl;       //错误,private成员不能在类外访问。
   system ( "pause" );
   return  0;
}

3.private继承:

代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<iostream>
#include<assert.h>
using  namespace  std;
class  A{
public :
   int  a;
   A(){
     a1 = 1;
     a2 = 2;
     a3 = 3;
     a = 4;
   }
   void  fun(){
     cout << a << endl;     //正确
     cout << a1 << endl;    //正确
     cout << a2 << endl;    //正确
     cout << a3 << endl;    //正确
   }
public :
   int  a1;
protected :
   int  a2;
private :
   int  a3;
};
class  B :  private  A{
public :
   int  a;
   B( int  i){
     A();
     a = i;
   }
   void  fun(){
     cout << a << endl;        //正确,public成员。
     cout << a1 << endl;        //正确,基类public成员,在派生类中变成了private,可以被派生类访问。
     cout << a2 << endl;        //正确,基类的protected成员,在派生类中变成了private,可以被派生类访问。
     cout << a3 << endl;        //错误,基类的private成员不能被派生类访问。
   }
};
int  main(){
   B b(10);
   cout << b.a << endl;        //正确。public成员
   cout << b.a1 << endl;       //错误,private成员不能在类外访问。
   cout << b.a2 << endl;       //错误, private成员不能在类外访问。
   cout << b.a3 << endl;       //错误,private成员不能在类外访问。
   system ( "pause" );
   return  0;
}

通过以上的代码都备有较为详尽的注释,读者应该能够理解。仔细看代码中派生类B中定义了和基类同名的成员a,此时基类的a仍然存在,可以验证。

?
1
2
3
4
5
6
7
int  main(){
   cout <<  sizeof (A) << endl;
   cout <<  sizeof (B) << endl;
 
   system ( "pause" );
   return  0;
}

输出:

16

20

所以派生类包含了基类所有成员以及新增的成员,同名的成员被隐藏起来,调用的时候只会调用派生类中的成员。

如果要调用基类的同名成员,可以用以下方法:

?
1
2
3
4
5
6
7
8
9
int  main(){
 
   B b(10);
   cout << b.a << endl;
   cout << b.A::a << endl;
 
   system ( "pause" );
   return  0;
}

输出:

10

4

记得这里是在类外访问,而a在基类中是public,所以继承方式应该为public,使得a在派生类中仍然为public,在类外可以访问。





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值