目前我正在学习java和C ++的基础知识。我在书中读到了让我们使用C ++ ,几乎在所有情况下,为了安全起见,我们将实例变量设为私有,方法为public。但在本书中也提到,在某些情况下,我们将变量公开,方法是私有的。
我一直在思考,在这种情况下我们会这样做。任何人都可以解释一下。
答案 0 :(得分:2)
私有方法(或C ++术语中的私有成员函数)主要用作辅助函数。例如,考虑一下您希望实现分数的情况,但希望确保您的分数始终是标准化的。然后你可以使用一个私有成员函数normalize()
来规范你的分数,并在每次操作后调用它,这可能会导致非规范化的分数,例如(C ++代码):
class Fraction
{
public:
Fraction(int num, int den = 1);
Fraction operator+=(Fraction const& other);
Fraction operator*=(Fraction const& other);
// ...
private:
int numerator, denominator;
};
Fraction::Fraction(int num, int den):
numerator(num),
denominator(den)
{
normalize();
}
Fraction Fraction::operator+=(Fraction const& other)
{
int new_den = denominator*other.denominator;
numerator = numerator*other.denominator + denominator*other.numerator;
denominator = new_den;
}
Fraction Fraction::operator*=(Fraction const& other)
{
numerator *= other.numerator;
denominator *= other.denominator;
normalize();
}
void Fraction::normalize()
{
int factor = gcd(numerator, denominator);
numerator /= factor;
denominator /= factor;
}
另一方面,C ++对私有函数的特定使用是基于这样的事实:在C ++中,private只是关于访问控制,而不是关于可见性。这使得能够在基类中进行不可重构的前后条件检查,同时使实际的函数成为虚拟:
class Base
{
public:
foo frobnicate(some arguments);
private:
virtual foo do_frobnicate(some arguments) = 0;
};
foo Base::frobnicate(some arguments)
{
check_precondition(arguments);
foo result = do_frobnicate(arguments);
check_post_condition(foo);
return foo;
}
从Base
派生的类将覆盖do_frobnicate
,而用户将调用frobnicate
,无论派生类的作用如何,都会检查前/后条件。
答案 1 :(得分:1)
通常,静态最终变量在类中是公共的。如果您不需要更改该变量的值并希望其他类访问它,那么您可以将其设置为public static final。
私有方法仅在类中用于执行该任务的内部任务。像实用方法或一些商业计算方法。或者只是将公共方法的代码分解为多个私有方法,这样方法就不会变得太大。
答案 2 :(得分:0)
当一个方法被该类的其他方法(公共)使用并且您不希望该对象直接访问该方法时,我们将该方法设置为私有。
在某些情况下,如果您想直接从类对象访问您的变量,请将其公开。
答案 3 :(得分:0)
如果您不需要其他类中的变量或方法,请不要将其公开。这适用于方法和变量。
答案 4 :(得分:0)
私有方法用于类的内部使用。可以从其他公共类调用它们。这些是私人的,因为你是从外部世界封装的。
例如
public void method1(){
method2();
}
private void method2(){
// for internal use
}
公共变量主要用于类变量,在这种情况下,从外部直接访问变量没有任何危害。例如
public static final int FLAG = true;
您可以直接从外部调用变量。
答案 5 :(得分:0)
这取决于您希望每个课程的安全程度。
例如,如果你有一个Vector类,它只有3个变量x,y和z,你应该将它们公之于众。许多类可能会使用Vector类,如果它们更改了它的值就没问题。
如果您有一个存储信用卡号,背景记录,地址等的Person类,您应该将它们设为私有以避免安全问题。
但是,如果您将所有变量都设为私有变量,并为所有变量提供访问器和变换器,那么您实际上就像公开变量一样(但需要更多工作)。
编辑: 所有常量变量都应该是公共的,因为无论如何都无法改变它们。 静态变量可以是两者,具体取决于具体情况。静态变量的静态get和set函数可能更好。
答案 6 :(得分:0)
私有变量或函数只能在声明它们的类中使用。
公共变量或函数可以在您的应用程序中随处使用。
因此,您应该声明所有那些您将在其所属的类中使用 ONLY 的变量和函数。
示例:
public class Car {
private String model;
public setModel(String model) {
if (model != null)
this.model = model;
}
public getModel() {
return model;
}
private doSomething() {
model = "Ford";
}
}
在Car类中,我们将String模型声明为private,因为我们只在Car类中使用它,这样我们确保其他类在不使用函数setModel的情况下无法更改此String的值。 / p>
函数setModel和getModel是公共的,所以我们只能使用这些方法从其他类访问私有变量模型。
在此示例中,函数setModel检查值是否为null,在这种情况下它不设置值。在这里你可以看到,如果你已经将String模型声明为public,你将无法控制它被记录的值。
函数doSomething是私有的,其他类不能使用它。对于另一方,像这个函数是私有的,它属于同一个类,其中是String模型,它可以在不使用方法setModel的情况下更改其值。
答案 7 :(得分:0)
根据经验,当其他类可以访问它们时,您可以创建方法public
。内部方法或辅助方法应该是protected
或private
。Protected
如果您希望扩展您的类可以扩展该方法,但是如果您不希望这样,只需标记它们{ {1}}。