为什么在面向对象程序中使用 'private'?
Why is 'private' used in object oriented program?
oop像c++语言一样有'public'、'private'、'protected'。并且尝试了两种简单的方案。
下面是c++中的第一种情况。
class A {
public:
string name;
}
int main(void) {
A a;
a.name;
}
并且,第二种情况...
class A {
protected:
string name;
public:
string getName(void) {
return name;
}
}
int main(void) {
A a;
//a.name; //can't access
cout << a.getName();
}
两种情况哪个更好?
因为要隐藏信息,我想第二个可能更好。但是在第二个中,它也可以通过使用函数 getName()
来访问 'name' 变量。如果是这样,虽然第一个比第二个简单,但我为什么要使用第二个?也就是说,为什么要用protected
?
第二个更好class,我们将数据紧密封装到class并且还通过使用protected允许继承范围。成员名称只能由class的成员函数改变。
首先 class,通过将成员设为 public,我们允许程序中的外部函数操作数据,这实际上不是一个好的编程习惯。
封装。
在第一个示例中,任何人都可以按照自己的意愿使用名称。在这个简单的例子中,它们不会造成太大伤害,但是如果 name
是 "Fred" 并将其更改为 "Barney" 会导致程序崩溃吗?
A.name = "Barney";
程序现在崩溃了。
在第二个示例中,name
无法访问。 getName
returns name
的副本。收件人可以在不破坏 A
内部状态的情况下对此副本做任何他们想做的事情,所以
string temp = A.getName();
temp = "Barney";
什么都不做。
将此视为对象的自卫。每个对象现在都可以控制其内部状态的修改方式,并可以保护自己免受意外误用和损坏。
A
的用户甚至不必知道他们从 getName
获得的内容是如何存储的。他们只知道他们得到了 string
。这将 A
与其用户分离。
受保护的访问修饰符
受保护的访问修饰符可在包内和包外访问,但只能通过继承访问。
私有访问修饰符
私有访问修饰符只能在 class 内访问。
private 主要用于抽象。
示例
package pack;
public class A{
protected void msg(){System.out.println("Hello");}
}
//save by B.java
package mypack;
import pack.*;
class B extends A{
public static void main(String args[]){
B obj = new B();
A obj = new B();//compile time error
obj.msg();
}
}
Output:Hello
private 比 protected 更严格
oop像c++语言一样有'public'、'private'、'protected'。并且尝试了两种简单的方案。
下面是c++中的第一种情况。
class A {
public:
string name;
}
int main(void) {
A a;
a.name;
}
并且,第二种情况...
class A {
protected:
string name;
public:
string getName(void) {
return name;
}
}
int main(void) {
A a;
//a.name; //can't access
cout << a.getName();
}
两种情况哪个更好?
因为要隐藏信息,我想第二个可能更好。但是在第二个中,它也可以通过使用函数 getName()
来访问 'name' 变量。如果是这样,虽然第一个比第二个简单,但我为什么要使用第二个?也就是说,为什么要用protected
?
第二个更好class,我们将数据紧密封装到class并且还通过使用protected允许继承范围。成员名称只能由class的成员函数改变。
首先 class,通过将成员设为 public,我们允许程序中的外部函数操作数据,这实际上不是一个好的编程习惯。
封装。
在第一个示例中,任何人都可以按照自己的意愿使用名称。在这个简单的例子中,它们不会造成太大伤害,但是如果 name
是 "Fred" 并将其更改为 "Barney" 会导致程序崩溃吗?
A.name = "Barney";
程序现在崩溃了。
在第二个示例中,name
无法访问。 getName
returns name
的副本。收件人可以在不破坏 A
内部状态的情况下对此副本做任何他们想做的事情,所以
string temp = A.getName();
temp = "Barney";
什么都不做。
将此视为对象的自卫。每个对象现在都可以控制其内部状态的修改方式,并可以保护自己免受意外误用和损坏。
A
的用户甚至不必知道他们从 getName
获得的内容是如何存储的。他们只知道他们得到了 string
。这将 A
与其用户分离。
受保护的访问修饰符
受保护的访问修饰符可在包内和包外访问,但只能通过继承访问。
私有访问修饰符
私有访问修饰符只能在 class 内访问。 private 主要用于抽象。
示例
package pack;
public class A{
protected void msg(){System.out.println("Hello");}
}
//save by B.java
package mypack;
import pack.*;
class B extends A{
public static void main(String args[]){
B obj = new B();
A obj = new B();//compile time error
obj.msg();
}
}
Output:Hello
private 比 protected 更严格