Какова идея доступа к частным атрибутам внутри main? Java x C ++ - PullRequest
5 голосов
/ 29 февраля 2012

При использовании C ++ нельзя получить доступ к приватному атрибуту внутри главной функции.Пример:

#include <iostream>
using namespace std;
class Test {
    private: int a;
    public:
       Test(int value) { a = value; }
       int getValue() { return a; }
};
int main (int argc, char *argv[]) { 
    Test test2(4);
    cout << test2.a; // Compile error! Test::a is private within this context
    cout << test2.getValue(); // OK!
    return 0;
}

Понятно, почему возникает ошибка при доступе к закрытым атрибутам вне методов класса, поскольку C ++ не имеет основных функций внутри классов.

Однако в Java это разрешено:

public class Test {
    private int a;
    public Test(int value) { a = value; }
    public int getValue() { return a; }
    public static void main (String args[]) { 
        Test test1 = new Test(4);
        System.out.println(test1.a);
    }
}

Я понимаю, что в этом случае главное - это INSIDE тестовый класс.Тем не менее, я не могу понять идею, ПОЧЕМУ это разрешено, и как это влияет на разработку / управление кодом.

При изучении C ++ я однажды услышал: «Классы не должны иметь основной.Main действует с экземплярами классов или использует их ".

Может кто-нибудь пролить свет на этот вопрос?

Ответы [ 5 ]

6 голосов
/ 29 февраля 2012

Вы смотрите на это с неправильной точки зрения. Вопрос не в том, почему main может получить доступ к внутренним объектам класса. В Java нет one 'main'. Важным отличием в этом отношении является то, что для C ++ существует единственная точка входа в приложение, которая является main , в то время как в Java одно приложение может иметь несколько точек входа, по одной на класс. Точка входа должна быть статическим методом (функция-член на жаргоне C ++) класса с определенной сигнатурой, и поведение точно такое же, как и для других статических методов того же класса.

Причина, по которой в Java может быть несколько точек входа, заключается в том, что при запуске вы указываете ВМ, в каком (в каком классе) вы хотите запустить приложение. Эта функция недоступна в C ++ (и во многих других языках)

5 голосов
/ 29 февраля 2012

Вы действительно можете сделать то же самое в C ++:

class Test {
    private: int a;
    public:
       Test(int value) { a = value; }
       int getValue() { return a; }
       static void Main()
       {
          Test t(10);
          cout << t.a;
       }
};

Это так просто: в обоих языках private переменные доступны только внутри класса.

Однако я не могу понять идею, ПОЧЕМУ это разрешено.

Это просто языковая функция.Если вы не смогли получить доступ к частным лицам внутри класса, что вы могли бы с ними сделать?

Кроме того, не то, чтобы уровни доступа были общеклассовыми, а не общеэкземплярными.Это может сбить вас с толку.Это означает, что вы можете получить доступ к частному экземпляру другого экземпляра из одного и того же класса.Кроме того, в C ++ есть ключевое слово friend, которое дает вам те же привилегии.

2 голосов
/ 29 февраля 2012

Ваша интуиция верна.Второй код действителен в Java, потому что main находится внутри класса Test.Чтобы сделать его эквивалентным коду C ++, попробуйте получить доступ к закрытому члену другого класса, который не сможет скомпилироваться:

class Test2 {

    private int a;
    public Test(int value) { a = value; }
    public int getValue() { return a; }

}

public class Test {

    public static void main (String args[]) { 
        Test2 test2 = new Test2(4);
        System.out.println(test2.a); // does not compile
    }
}

Фактическое основное отличие состоит в том, что в C ++ функции могут существовать вне классов,в то время как в Java любой метод должен быть частью класса.

1 голос
/ 29 февраля 2012

private в Java можно считать «локальным файлом», если локальный пакет.Например, вы можете получить доступ к закрытым членам класса, определенного в том же внешнем классе.

AFAIK, Предполагается, что вам не нужно защищать себя от кода в том же файле.

public interface MyApp {
    class Runner {
        public static void main(String... args) {
            // access a private member of another class
            // in the same file, but not nested.
            SomeEnum.VALUE1.value = "Hello World"; 
            System.out.println(SomeEnum.VALUE1);
        }
    }

    enum SomeEnum {
        VALUE1("value1"),
        VALUE2("value2"),
        VALUE3("value3");
        private String value;

        SomeEnum(final String value) {
            this.value = value;
        }
        public String toString() {
            return value;
        }
    }
}

http://vanillajava.blogspot.com/#!/2012/02/outer-class-local-access.html

0 голосов
/ 29 февраля 2012

Эта причина: Java - это полностью Object Oriented Programming модель, поэтому в ней должны быть определены все вещи в классе или наименьшая единица в java - это класс.

...