Включен ли пакет по умолчанию в пакетный доступ?

77
10

Я хотел бы знать, как пакет по умолчанию определен в Java. Я знаю, как определяется открытый и закрытый доступ, но я не знаю, есть ли какой-либо доступ к пакету по умолчанию, который определен в доступе на уровне пакета в java.

Код, который я пытался выполнить, это:

  class A
{
public static void value()
{
int a;
a=5;
}
public static void main()
{
value();
}
}
class B
{
public void greet()
{
System.out.println("Value of a is"+a);
}
}

Ошибка, которую я получил:

D:\Downloads\pro>javac A.java
A.java:17: error: cannot find symbol
System.out.println("Value of a is"+a);
^
symbol: variable a
location: class B
1 error

Поскольку оба класса относятся к одному и тому же пакету по умолчанию, не должен быть классом класса B класса A (a)?

Я задаю этот вопрос, потому что, когда я компилирую java файл, содержащий два класса, поскольку для классов не предоставляется модификатор, java-компилятор предоставит доступ к уровню пакета в качестве модификатора доступа по умолчанию для классов. Поскольку никакого пакета не определено, java-компилятор будет использовать по умолчанию, но я не мог получить, включен ли пакет по умолчанию в пакетный доступ на уровне java. Может ли кто-нибудь мне помочь.

спросил(а) 2021-01-28T01:22:04+03:00 4 месяца, 3 недели назад
1
Решение
77

является переменной внутри статической функции value и не видны за пределами этой функции на всех. Не имеет отношения к спецификаторам доступа.

ответил(а) 2021-01-28T01:22:04+03:00 4 месяца, 3 недели назад
63

Пакет по умолчанию - это пакет без имени, все классы без объявления пакета в верхней части файла попадают в него.

Он подчиняется всем нормальным правилам пакетов, за исключением того, что вы не можете ссылаться на его классы из класса внутри пакета.

Например, у меня есть два java файла:

public class A{
public static void foo(){System.out.println("fooCalled");}
}

а также

package com.example;

public class B{
public static void main(String[] arg){
A.foo();//won't compile
}

}

Тогда B (или в квалифицированной форме com.example.B) никогда не может называть foo A без магии reflection.

ответил(а) 2021-01-28T01:22:04+03:00 4 месяца, 3 недели назад
64

Итак, наконец, я получил способ доступа к переменной в другом классе без создания объекта, если оба класса останутся в одном пакете. Просто сделайте переменную static.

Здесь код:

import java.io.*;
class A
{
static int a=5;
public void turn()
{
System.out.println("value of a is"+a);
}
}
class B
{
public static void main(String args[])
{
int b;
b=A.a;
System.out.println("value of a is"+b);
}
}

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

ответил(а) 2021-01-28T01:22:04+03:00 4 месяца, 3 недели назад
63

Ваша программа не имеет ничего общего с access specifiers, поскольку вы access specifiers свою переменную int a внутри метода.

Таким образом, он становится только local variable. Вы даже не можете использовать его вне этого метода в том же классе.

Если мы говорим конкретно о спецификаторах доступа, тогда у нас может быть спецификатор доступа по default в Java, который имеет область действия только для одного и того же пакета.

package com;
class A{
int a; // this is an instance variable
static int b; //this is a class variable
}

package com;
class B{
//can use a variable here
// To use a here, we need new A().a;
// To use b here, we can do, A.b
}

package hello;
class C{
//can't use a variable here
}

редактировать

Предположим, мы создаем файл с именем MyProgram.java на Desktop. Ниже приведен код этого файла,

class First{
int a; // a is an instance variable
static int b; // b is a static (class) variable

void display(){
int c; // c is a local variable
}
}

class Second{
public static void mian(){
First obj = new First();
obj.a = 10; // to access instance variable we need object of the class
obj.b = 20; // class variable can also be accessed using the object

// First.a = 10; //It won't work as a is instance variable and can be accessed by object only

// First.b = 20; // We can also access static variables by class name directly without using any object

// obj.c = 30; // It won't work. As c is a local variable of method display and can be used only inside that method.

// First.c = 30; //It also won't work as c can only be used inside the method where it is declared.
}
}

ответил(а) 2021-01-28T01:22:04+03:00 4 месяца, 3 недели назад
45

В вашем class B a не определен.

class B {
public void greet() {
System.out.println("Value of a is" + a );//cannot find 'a' inside 'B'
}
}

Теперь доступ к доступности, так как ваши оба класса находятся в одном пакете, класс B может получить доступ к открытым, защищенным и дефолтным (без модификаторов доступа) членам другого класса, например A Но в вашем случае является локальной переменной внутри a A метода состоит value(), поэтому переменная не может быть доступна за пределами метода, где он был объявлен. a

class A {
public static void value() {
int a;//not accessible outside this method
a=5;
}
public static void main() {//FYI: this main is not valid to execute your code, missing here: 'String[] args' argument
value();
//'a', is even not accessible here, forget about class 'B'
}
}

Пример кода, все в одном пакете:

class A {
String bar;
}

class B {
public foo() {
A a = new A();//required, as 'bar' is instance(non-static) member of class 'A'
a.bar 'hi there';//set value
System.out.printf("a.bar = %s\n", a.bar);
}
}

РЕДАКТИРОВАТЬ

Пример кода с вложенным классом:

class A {
int foo;

class B {
void setFoo() {
foo = 45; //accessing member of class 'A'
}
}
}

Рабочий код:

<pre>
<code>
class A {
private int foo;
private B b;

A() {
foo = -1;
b = new B();
}

class B {
void setFoo(int foo) {
System.out.printf("Inside B setFoo(), foo = %d\n", foo);
A.this.foo = foo; //accessing member of class 'A'
}
}

int getFoo() {
return foo;
}

public void setFoo(int foo) {
System.out.printf("Inside A setFoo(), foo = %d\n", foo);
b.setFoo(foo);
}
}

class Ideone{
public static void main (String[] args) {
A a = new A();
System.out.printf("main(), foo = %d\n", a.getFoo());
a.setFoo(34);
System.out.printf("main(), foo = %d\n", a.getFoo());
}
}
</code>
</pre>

ответил(а) 2021-01-28T01:22:04+03:00 4 месяца, 3 недели назад
45

Default access modifier means we do not explicitly declare an access modifier for a class, field, 
method, etc.

A variable or method declared without any access control modifier is available to any other
class in the same package. The fields in an interface are implicitly public static final and
the methods in an interface are by default public.

ответил(а) 2021-01-28T01:22:04+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема