在哪些情况下,我们将变量设为public,将方法设为private?

时间:2013-06-21 06:44:42

标签: java c++ oop

目前我正在学习java和C ++的基础知识。我在书中读到了让我们使用C ++ ,几乎在所有情况下,为了安全起见,我们将实例变量设为私有,方法为public。但在本书中也提到,在某些情况下,我们将变量公开,方法是私有的。

我一直在思考,在这种情况下我们会这样做。任何人都可以解释一下。

8 个答案:

答案 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。内部方法或辅助方法应该是protectedprivateProtected如果您希望扩展您的类可以扩展该方法,但是如果您不希望这样,只需标记它们{ {1}}。