您的位置:首页 > 编程语言 > C语言/C++

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

2012-01-10 04:33 501 查看
java中:
java中的访问权限有public,private,protected和默认的包访问权限,如果类中的属性方法没有显示的指明访问权限,则具有包访问权限,我喜欢称它为packeged权限,很多人也称它为friendly访问权限,而packaged和friendly这两个关键字在实际中都是不存在的。
详细解释,我引别人的一篇博客,说明:
java访问权限修饰符publicprotectedfriendly private用法总结
首先声明:java中,friendly这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是friendly。
为了条理清晰,分三种不同情况来总结。
一 访问权限修饰符修饰成员变量和方法
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:classtest
{
private int money;
test()
{
money=2000;
}
private int getmoney()
{
return money;
}
publicstaticvoid main(string args[])
{
test te=newtest();
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 ;
protectedint 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
}
publicstaticvoid 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
上述代码是无法编译的,因为b.test()在main里是不可见的,main无法访问b的protected方法,即使方法是通过子对象来调用的,如果把b中的protected方法改为public,则代码可以,编译成功,编译成功后,在b中可以房问父类的protected属性.
下表列出了c++三种继承对属性的访问情况:
public属性protected属性private属性
public继承publicprotected不可见
protected继承protectedprotected不可见
private继承privateprivate不可见

======================================================

在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定
这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: