Почему переменная stati c в базовом классе недоступна в дочернем классе? - PullRequest
0 голосов
/ 10 апреля 2020
class BaseClass{
    static int count1=10;
    public void display(){
        System.out.println("Invoking display method of Base Class");
    }
}

public class SingleInheritance01 extends BaseClass {
    int value=200;
    static int count2=10;
    public static void main(String args[]){
        SingleInheritance01 objDerivedClass=new SingleInheritance01();
        objDerivedClass.display();
    }
}

/*
The object created in Derived Class cannot reference static variables in Base Class as well as 

Получено. Я могу получить к нему доступ, используя ClassName. Я полагаю, что как переменные c являются общими для экземпляров класса. * /

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Stati c переменные по определению not "instance variables". Их состояние доступно для всех экземпляров этого класса.

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

Одно из применений переменной класса (статика) - реализация Singleton Design Pattern.

. c переменные базового класса в любом из классов в одном и том же пакете (пакет по умолчанию в вашем случае, так как пакеты не определены). Это включает в себя любой из производных классов в пакете. Если вы хотите сделать его доступным через пакеты, используйте модификатор "public". Чтобы получить доступ к переменным состояния c, просто введите префикс имени класса.

Ex: BaseClass.count1

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

0 голосов
/ 10 апреля 2020

Прежде всего, переменные stati c не привязаны к экземплярам. Вы должны получить к ним доступ, используя имя класса. Вы можете использовать объект для доступа к нему, но это не рекомендуется. Если целью создания count1 static было обращение к нему в подклассе, вы можете удалить модификатор static. Во-вторых, видимость count1 определяется модификатором доступа. Прямо сейчас его default. Это означает, что он виден только классам в одном пакете. Поэтому я предполагаю, что ваш BaseClass находится в другом пакете, чем ваш подкласс.

Если вы измените его на protected или publi c, вы сможете получить к нему доступ в подклассе.

Если вы хотите сохранить это состояние c, то вы можете сделать это, но вам придется изменить его доступ к защищенному или общедоступному c

...