Hello.

There are three classes. Plain, abstract and abstract heir.

A regular class contains an abstract variable, where, after some manipulations, an object of the heir is written.

Abstract:

public abstract class LessonInfo { static String NAME; static int COUNT_QUESTION; static int[] PARTS; static String[] INFO_QUESTIONS; static int[] MARK_QUESTIONS; } 

Heir:

  public class RussianInfo extends LessonInfo { static final String NAME = "Русский язык"; static final int COUNT_QUESTION = 24; static final int[] PARTS = {24}; static final String[] INFO_QUESTIONS = {"ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ тСкста", "БрСдства связи ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ", "ЛСксичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слова", "ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ударСния", "Π£ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ½ΠΈΠΌΠΎΠ²", "ΠœΠΎΡ€Ρ„ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π½ΠΎΡ€ΠΌΡ‹", "БинтаксичСскиС Π½ΠΎΡ€ΠΌΡ‹", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΡ€Π½Π΅ΠΉ", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ приставок", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ суффиксов", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π³Π»Π°Π³ΠΎΠ»ΠΎΠ² ΠΈ причастий", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ НЕ ΠΈ НИ", "Π‘Π»ΠΈΡ‚Π½ΠΎΠ΅ ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ написаниС слов", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ -Н- ΠΈ -НН_", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ", "ΠžΠ±ΠΎΡΠΎΠ±Π»Π΅Π½Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ прСдлоТСния", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π²ΠΎ второстСпСнных Ρ‡Π». прСдлоТСния", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π² БПП", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π² Ρ€Π°Π·Ρ‹Ρ… Ρ‚ΠΈΠΆΠ°Ρ… связи", "Бмысловая Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ тСкста", "Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ-смысловыС Ρ‚ΠΈΠΏΡ‹ Ρ€Π΅Ρ‡ΠΈ", "ЛСксичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слова", "БрСдства связи ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ", "БрСдства Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ" }; static final int[] MARK_QUESTIONS = {2,1,1,1,1,1,7,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,25}; } 

Normal (fragment):

  public class TestActivity extends AppCompatActivity { LessonInfo info; static LessonInfo lessonInfo; @Override protected void onCreate(Bundle savedInstanceState) { lessonInfo = new RussianInfo(); } } 

After the command "NormalActiviti.lessonInfo.MARK_QUESTIONS [i]" the application does not crash.

What's wrong? I think, messed up with an abstract class and his successor

    3 answers 3

    In the abstract class, try creating the abstract method initVariables and calling it in the abstract class constructor. In each of the heirs to implement this method and initialize the variables in it. Also, it is not necessary to make static variables in an abstract class, since the value of this variable will be the same for all instances of the class.

    Abstract:

     public abstract class LessonInfo { public String name; public int countQuestion; public int[] parts; public String[] infoQuestions; public int[] markQuestions; public LessonInfo() { initVariables(); } public abstract void initVariables(); } 

    Heir:

     public class RussianInfo extends LessonInfo{ @Override public void initVariables() { name = "Русский язык"; countQuestion = 24; parts = new int[]{24}; infoQuestions = new String[]{"ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ тСкста", "БрСдства связи ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ", "ЛСксичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слова", "ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ударСния", "Π£ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ½ΠΈΠΌΠΎΠ²", "ΠœΠΎΡ€Ρ„ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π½ΠΎΡ€ΠΌΡ‹", "БинтаксичСскиС Π½ΠΎΡ€ΠΌΡ‹", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΡ€Π½Π΅ΠΉ", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ приставок", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ суффиксов", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π³Π»Π°Π³ΠΎΠ»ΠΎΠ² ΠΈ причастий", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ НЕ ΠΈ НИ", "Π‘Π»ΠΈΡ‚Π½ΠΎΠ΅ ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ написаниС слов", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ -Н- ΠΈ -НН_", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ", "ΠžΠ±ΠΎΡΠΎΠ±Π»Π΅Π½Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ прСдлоТСния", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π²ΠΎ второстСпСнных Ρ‡Π». прСдлоТСния", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π² БПП", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π² Ρ€Π°Π·Ρ‹Ρ… Ρ‚ΠΈΠΆΠ°Ρ… связи", "Бмысловая Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ тСкста", "Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ-смысловыС Ρ‚ΠΈΠΏΡ‹ Ρ€Π΅Ρ‡ΠΈ", "ЛСксичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слова", "БрСдства связи ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ", "БрСдства Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ"}; markQuestions= new int[]{2,1,1,1,1,1,7,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,25}; } } 

    Activate:

     public class MainActivity extends AppCompatActivity { private LessonInfo lessonInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lessonInfo = new RussianInfo(); Log.d("MainActivity", "lessonInfo.name" + lessonInfo.name); Log.d("MainActivity", "lessonInfo.markQuestions" + lessonInfo.markQuestions.toString()); Log.d("MainActivity", "lessonInfo.infoQuestions" + lessonInfo.infoQuestions.toString()); } } 

    By the way, the lessonInfo variable also does not need to set the static modifier.

    • In principle, you can do without the abstract method initVariables and initialize the variables in the constructor of each successor, but the solution with the abstract method is more beautiful and clearly makes it clear that the variables need to be initialized in this method. This reduces the chance to forget to initialize the variables. - Ivan Dembicki
    • Thank you very much, everything works! - Evgeny Manko
    • one
      @YevgeniyManko, if the answer solves your problem, then you can mark it correct by clicking the checkbox to the left of the response body. - Yuriy SPb ♦

    Another option:

    Abstract:

     public abstract class LessonInfo { public abstract String getName(); public abstract int getCountQuestion(); public abstract int[] getParts(); public abstract String[] getInfoQuestions(); public abstract int[] getMarkQuestions(); } 

    Heir:

     public class RussianInfo extends LessonInfo { private String name = "Русский язык"; private int countQuestion = 24; private int[] parts = new int[]{24}; private String[] infoQuestions = new String[]{"ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ тСкста", "БрСдства связи ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ", "ЛСксичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слова", "ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ударСния", "Π£ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ½ΠΈΠΌΠΎΠ²", "ΠœΠΎΡ€Ρ„ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π½ΠΎΡ€ΠΌΡ‹", "БинтаксичСскиС Π½ΠΎΡ€ΠΌΡ‹", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΡ€Π½Π΅ΠΉ", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ приставок", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ суффиксов", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π³Π»Π°Π³ΠΎΠ»ΠΎΠ² ΠΈ причастий", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ НЕ ΠΈ НИ", "Π‘Π»ΠΈΡ‚Π½ΠΎΠ΅ ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ написаниС слов", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ -Н- ΠΈ -НН_", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ", "ΠžΠ±ΠΎΡΠΎΠ±Π»Π΅Π½Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ прСдлоТСния", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π²ΠΎ второстСпСнных Ρ‡Π». прСдлоТСния", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π² БПП", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π² Ρ€Π°Π·Ρ‹Ρ… Ρ‚ΠΈΠΆΠ°Ρ… связи", "Бмысловая Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ тСкста", "Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ-смысловыС Ρ‚ΠΈΠΏΡ‹ Ρ€Π΅Ρ‡ΠΈ", "ЛСксичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слова", "БрСдства связи ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ", "БрСдства Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ"}; private int[] markQuestions = new int[]{2,1,1,1,1,1,7,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,25}; @Override public String getName() { return name; } @Override public int getCountQuestion() { return countQuestion; } @Override public int[] getParts() { return parts; } @Override public String[] getInfoQuestions() { return infoQuestions; } @Override public int[] getMarkQuestions() { return markQuestions; } } 

    Activate:

     public class MainActivity extends AppCompatActivity { private LessonInfo lessonInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lessonInfo = new RussianInfo(); Log.d("MainActivity", "lessonInfo.name" + lessonInfo.getName()); Log.d("MainActivity", "lessonInfo.markQuestions" + lessonInfo.getMarkQuestions().toString()); Log.d("MainActivity", "lessonInfo.infoQuestions" + lessonInfo.getInfoQuestions().toString()); } } 

      In Java, polymorphism works only with non-static methods.

      Static fields and methods are not inherited, and the class whose field will be used is calculated at the compilation stage, according to the type of expression to the left of the point (in your case LessonInfo ). Reversal to fields declared with the same name in the superclass and in the heir works in a similar way.

      If you want to make settings through inheritance, and not, for example, through configuration files, you can do something like this:

       public abstract class LessonInfo { public String name(); public int questionCount(); public int[] parts(); public String[] infoQuestions(); public int[] markQuestions(); } public class RussianInfo extends LessonInfo { @Override public String name() { return "Русский язык"; } /* ..... */ @Override public String[] infoQuestions(); return new String[] {"ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ тСкста", "БрСдства связи ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ", "ЛСксичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слова", "ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ударСния", "Π£ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ½ΠΈΠΌΠΎΠ²", "ΠœΠΎΡ€Ρ„ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π½ΠΎΡ€ΠΌΡ‹", "БинтаксичСскиС Π½ΠΎΡ€ΠΌΡ‹", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΡ€Π½Π΅ΠΉ", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ приставок", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ суффиксов", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π³Π»Π°Π³ΠΎΠ»ΠΎΠ² ΠΈ причастий", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ НЕ ΠΈ НИ", "Π‘Π»ΠΈΡ‚Π½ΠΎΠ΅ ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ написаниС слов", "ΠŸΡ€Π°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ -Н- ΠΈ -НН_", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ", "ΠžΠ±ΠΎΡΠΎΠ±Π»Π΅Π½Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ прСдлоТСния", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π²ΠΎ второстСпСнных Ρ‡Π». прСдлоТСния", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π² БПП", "ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΡ Π² Ρ€Π°Π·Ρ‹Ρ… Ρ‚ΠΈΠΆΠ°Ρ… связи", "Бмысловая Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ тСкста", "Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ-смысловыС Ρ‚ΠΈΠΏΡ‹ Ρ€Π΅Ρ‡ΠΈ", "ЛСксичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слова", "БрСдства связи ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ", "БрСдства Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ" }; } } 

      Using:

       public class TestActivity extends AppCompatActivity { LessonInfo info; @Override protected void onCreate(Bundle savedInstanceState) { info = new RussianInfo(); System.out.println( Arrays.toString( info.infoQuestions() ) ); } } 
      • In this variant, when calling infoQuestions() , a new array will be created each time, which is not very good, as it may be necessary to change the array data from the outside and take an already modified array. - Ivan Dembicki 4:42 pm
      • And perhaps the opposite, you will need to protect this array from changes from outside. - zRrr
      • That's right, here, depending on your needs, you need to choose a solution. - Ivan Dembicki 4:56 pm