Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295

Люди не могу понять что это?

05.06.2013, 08:47. Показов 2449. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Яву учу где-то 3 месяца уже и вот столкнулся вот с таким не понятным примеров :
Есть 3 класса Animals Dogs и Cats
Dogs и Cats наследуються от Animals
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 import java.util.ArrayList;
import java.util.Iterator;
 
 
public abstract class Animals {
     static ArrayList<Animals> list = new ArrayList<Animals>();
    
    abstract void Eat();
    
    public Animals(){
        System.err.println("Конструктор : "+this.getClass().getSimpleName() );
        System.err.println(this.getClass().getSimpleName());
        list.add(this);
    }
    
    public static void eating(){
        Iterator<Animals> i = list.iterator();
        while(i.hasNext()){
            i.next().Eat();
        }
        
    }
    
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
 public class Dogs extends Animals{
 
    @Override
    void Eat() {
        System.out.println("Я ем как : "+ this.getClass().getSimpleName());
    }
    
    public Dogs(){
        System.err.println("Конструктор DogsEX: "+this.getClass().getSimpleName() );
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
 
public class Cats extends Animals{
 
    @Override
    void Eat() {
        System.out.println("Я ем как : "+ this.getClass().getSimpleName());
    }
    
    public Cats(){
        System.err.println("Конструктор CatEX: "+ this.getClass().getSimpleName() );
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
    public static void main(String[] args) {
        Dogs dog1 = new Dogs();
        Cats cats = new Cats();
        Animals.eating();
        
//      for(Animals anim : Animals.list){
//          System.out.println(anim.getClass());
//      }
    }
 
}
Вывод Конструктор : Dogs
Dogs
Конструктор DogsEX: Dogs
Конструктор : Cats
Cats
Конструктор CatEX: Cats
Я ем как : Dogs
Я ем как : Cats


Как видно Dogs и Cats переопределяют метод Eat
Но вот одно но ! Есть статический ArrayList<Animals> который в деф конструкторе Animals до кладет ссылку this в себя

Но вот что мне не понятно :
Как метод eating() вызывает полиморфные методы Cats и Dogs ??? Если в дефолтном конструкторе я указал ссылку this тоесть на данный момент , и так же как объект типа class в конструкторе Animals как то становиться объектом типо Dogs или Cats???

Я голову ломаю , не могу разобраться ... что же я упустил?
P.S пример написал сам по типо другого примера...

Добавлено через 7 минут
Я знаю что сначала вызываеться Конструктор род класса затем вызывающего класса (тоесть дочернего),
но Как Дефолтный Конструктор родительского класса становиться Дочерним ??
class.getSimpleName(); в конструкторе Род класса указывает на Дочерние классы... Объясните пожалуйста в чем дело ?)

Добавлено через 11 часов 24 минуты
Что не кто не знает? Если не понятный пример я могу написать по проще и без всяких class
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.06.2013, 08:47
Ответы с готовыми решениями:

Не могу понять что это за операция?
Помогаю человеку с проектом на Java, сам на ней никогда не писал, так вот разгребая код я нашел это boolean a__z = num.a__z(x.num); ...

Не могу понять, что это за реализация ORM и как это работает
Есть проект на C#, есть база данных MSSQL, есть код, который позволяет мне добавлять и удалять данные из базы данных (без создания и...

Есть папка с файлами, происхождение аля что-то microsoft, не могу понять что это такое
Здравствуйте, я занимаюсь веб разработкой, и не шарю в том, что у меня сейчас на руках. Суть в том, что у меня есть папка с файлами,...

15
91 / 91 / 10
Регистрация: 18.05.2013
Сообщений: 265
05.06.2013, 09:17
Он НЕ становиться.
Они работают с объектами через и-с Animals, пользуясь только его методами ....
1
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
05.06.2013, 09:24  [ТС]
Цитата Сообщение от edwin3d Посмотреть сообщение
Он НЕ становиться.
Они работают с объектами через и-с Animals, пользуясь только его методами ....
У Animals метод Eat() вобще абстрактный как они с ним будут работать? И тогда почему при вызове конструктора Animals , System.out.println("Конструктор:" + this.getClass().getSimpleName()); Выдает Dogs или Cats ???) Если это конструктор Animals ! я не пойму
0
91 / 91 / 10
Регистрация: 18.05.2013
Сообщений: 265
05.06.2013, 10:24
Вы путаете и-с и его реализацию.
Смотрите ... какая разница какой класс в и-се ?
Главное при обращении к и-су - это параметры метода .. как он реализован - нас не касается никаким боком.
Дальше - о реализации.
Она никак не касается того, что в род. классе метод абстрактный ... с помощью this мы обращаемся к ТЕКУЩЕМУ объекту и работаем с ним ВНУТРИ.

Добавлено через 1 минуту
По к-ру - вообще непонятен суть Вашего вопроса.
А почему он должен выдавать ИНОЕ ?
Ведь у нас идет порождение класса Dogs и вызывается соот. к-р ...
1
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
05.06.2013, 10:41  [ТС]
Объясните пожалуйста что такое "и-су" и "к-ру" ?? Я не понял... Вроде "к-ру" это конструктор? а "и-су"?

Добавлено через 4 минуты
[quote]Ведь у нас идет порождение класса Dogs и вызывается соот. к-р ...[/quote="edwin3d"]

Но ведь конструктор Animals ,а не Dogs или Cats ...и класс другой должен быть ? Или же при объявлении Dogs extends Animals , Dogs сразу же получает и содержит Конструктор Animals? Тоесть дефолтный конструтор Animals становиться Дефолтным к-су Dogs? Тогда зачем при вызове к-ра Dogs вызывается сначало Деф-конструктор Animals , а затем Dogs?

Добавлено через 5 минут
Так уже начинаеться проясняться ... Значит this указывает на ТЕКУЩИЙ объект а не на КЛАСС? поэтому в статик методах нельзя использовать this... Но вот что не понятно как же в конструкторе Animals создаеться и добовляеться объект типа Dogs и Cats? Ведь получаеться при вызове конструктора Animals создаеться Объект Animals? Но как я знаю нельзя создать объект Абстрактного класса ... ааааа Мозг зарветься ща_)
0
91 / 91 / 10
Регистрация: 18.05.2013
Сообщений: 265
05.06.2013, 10:52
1) Интерфейс (и-с)
2) Конструктор (к-р)
почему объект должен быть ДРУГОЙ ? .... мы создаем экземпляр класса Dogs.
И потом помещаем его в список.
Но при вызове eating() и т.д. мы с ним работаем через интерфейс Animals ... но сам объект от этого НЕ перестает быть Dogs.
Теперь о порядке вызовов к-ров.
1) Сперва вызывается Animals
2) Потом уже Dogs
Но тем не менее, при вызовах к-ра идет работа именно с экземпляром класса Dogs.
1
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
05.06.2013, 12:58  [ТС]
Цитата Сообщение от edwin3d Посмотреть сообщение
1) Сперва вызывается Animals
2) Потом уже Dogs
Но тем не менее, при вызовах к-ра идет работа именно с экземпляром класса Dogs.
Но почему??? Ладно я понима если в к-ре Cats или Dogs мы добовляли в список текущий объект ,но мы это делаем в к-ре Animals который нечего не знает про свои дочерние классы...

Насчет интрефесов... Откуда тут интерфесы?? У меня только абстрактный класс Animals но не интрейфес... или что я не понял?

Добавлено через 2 минуты
Цитата Сообщение от edwin3d Посмотреть сообщение
1) Сперва вызывается Animals
2) Потом уже Dogs
Вот вот СНАЧАЛО ANIMALS ! Не каких Dogs или Cats там нетУ! и в list.add(this); Мы дожны добавить Animals тоесть Текущий Объекто ,Ведь при вызове к-ра создаеться объект? Всегда? Или кон-тор играет тут другую роль?

Добавлено через 4 минуты
Как я понимаю :
Сначало создаеться объект Animals (не понимаю как если Abstract классы не могу иметь эеземпляров)
Затем создаеться Объект Dogs и в него так сказать Интегрируеться объект Animals ,что бы все его методы и переменные могли использоваться в дочерним классе...

Я правильно понимаю?

Добавлено через 14 минут
Вот сделал болле простой пример:
Класс Animals:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.ArrayList;
import java.util.Iterator;
 
 
public class Animals {
     static final ArrayList<Animals> list = new ArrayList<Animals>();
    
          void Eat(){
              System.out.println("Я ем как :"+this.getClass().getSimpleName());
          }
          
    
    public Animals(){
        list.add(this);
        System.out.println("Конструктор Animals!!! вызываеться: "+this.getClass().getSimpleName());
    }
    
    public static void eating(){
        Iterator<Animals> i = list.iterator();
        while(i.hasNext()){
            i.next().Eat();
        }
        
    }
    
}
класс Dogs:
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class Dogs extends Animals{
 
    @Override
    void Eat() {
        System.out.println("Я ем как : "+ this.getClass().getSimpleName());
    }
    
    public Dogs(){
        System.err.println("Конструктор Dogs ");
    }
 
}
класс Cats:
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class Cats extends Animals{
 
    @Override
    void Eat() {
        System.out.println("Я ем как : "+ this.getClass().getSimpleName());
    }
    
    public Cats(){
        System.err.println("Конструктор Cats" );
    }
 
}
Main:
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
    public static void main(String[] args) {
        Dogs dog1 = new Dogs();
        Cats cats = new Cats();
        Animals anim = new Animals();
        
        Animals.eating();
        
        
    }
 
}
// Вывод:

Конструктор Animals!!! вызываеться: Dogs
Конструктор Animals!!! вызываеться: Cats
Конструктор Animals!!! вызываеться: Animals
Я ем как : Dogs
Я ем как : Cats
Я ем как :Animals
Конструктор Dogs
Конструктор Cats


Ещё бывает что сначало вызываеться Конструктор Dogs а потом к-су Animals (редко),я так понял это из-за потоков ...
И ещё как видем сначало создаються к-ры в Animals затем выводиться методом Eating все методы объектов в списке и ТОЛЬКО ЗАТЕМ вызываеться к-торы дочерних классов ! КАК ??? ЧТО ЭТО?)

Добавлено через 37 минут
Вроде бы я понял ... Если мы пишем ключевое слово extends <Объект> то мы просто копируем все члены класса (методы+ поля) родительского класса при том и Дефолтный КОНСТРУКТОР который теперь находиться уже в дочерним классе , а не в род классе! И поэтому при ссылке this добовляеться текущий объект,тоесть Dogs , или Cats , потому что Класс Animals ВОБЩЕ не вызываеться ! все что в нем есть , есть и в Дочерних классах! И как помним список у нас статический
и при вызове в конструкторе Animal который мы уже знаем унаследован и находиться в Dogs или Cats и статические методы не наследуються , они находяться в 1 экземпляре ! и когда мы вызываем в деф конструкторе list.add(this);
На самом деле мы вызываем Animals.list.add(this); просто это явно не видно !

Правильно ли я рассуждаю?

Добавлено через 28 минут
Теперь вроде разобрался... я думал привызове super(); Создаеться объект типа род класс и вызываеться его конструктор или типо того ... и я не не знал что КОНСТРУКТОРЫ тоже НАСЛЕДУЮТЬСЯ тоесть как бы они тоже методы и все конструкторы род класса наследються Дочерними классами... Вот в чем была моя проблема?

Я думал что Конструкторы род класса вызываються от балды и даже не задумовался об этом и на самом деле рпи вызове дочернего класс (точней его экзеемпляра) мы Вызываем Род класс кторым он и являеться (is-a впрямом смысле ,а я думал это в переносном) только с новыми методами если они есть и новым именим класса...

Кто нибуть ответьте правильно я рассждаю плиз) Ото не могу дальше нечего делать) Постоянно думаю об этом)

Добавлено через 11 минут
Ещё Точней ))) Я думал что при вызове у объекта метод или переменную Род класса то Java загружает класс Род класса и с него все это использует не посрдественно ) кароче бред полный) Сорри за флуд) Кто нить ответит мне ааа?)
0
91 / 91 / 10
Регистрация: 18.05.2013
Сообщений: 265
05.06.2013, 13:20
http://www.gornakov.com/articl... zyke-java/
0
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
05.06.2013, 14:05  [ТС]
Цитата Сообщение от edwin3d Посмотреть сообщение
ttp://www.gornakov.com/articles/nas...v-yazyke-java/
Сразу же в статье в вашей ссылке нашел вот это:

Поскольку мы не определяли вообще никакого спецификатора, а это по умолчанию равно ключевому слову public, то подкласс SiemensM55, будет иметь доступ ко всем членам своего суперкласса Siemens.

Разве дефолтный модификатор равен public???

Добавлено через 17 минут
Но это все я знаю то ... Просто я не знал как Дочерний класс обращаеться к методам Супер класса... Я думал при каждом обращение к методу суперкласса , Java подгружает класс супер класса и в нем использует его . а на самом деле Все это (Родительчкий класс) копируеться в Дочерний класс ! Даже private Методы и Поля родительского класса есть в Дочернем ,но мы просто не можем получить к ним доступ...

Ещё я не знал что Конструкторы тоже наследуються....
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
05.06.2013, 14:08
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
 *
 * @author mutagen
 */
public class InheritAll {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new InheritAll().new S2().demo();
    }
 
    class S1 {
 
        void def() {
            System.out.println("default");
        }
 
        private void priv() {
            System.out.println("private");
        }
        
        public void pub() {
            System.out.println("public");
        }
    }
 
    class S2 extends S1 {
 
        void demo() {
            super.def();
            super.priv();
            super.pub();
        }
    }
}
но если раскидать по разным файлам то приват станет невиден
0
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
05.06.2013, 14:27  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
 *
 * @author mutagen
 */
public class InheritAll {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new InheritAll().new S2().demo();
    }
 
    class S1 {
 
        void def() {
            System.out.println("default");
        }
 
        private void priv() {
            System.out.println("private");
        }
        
        public void pub() {
            System.out.println("public");
        }
    }
 
    class S2 extends S1 {
 
        void demo() {
            super.def();
            super.priv();
            super.pub();
        }
    }
}
но если раскидать по разным файлам то приват станет невиден
Мда....)) Терь ещё больше не понятно) Зачем тогда нужна инкапсуляция , если мы можем взять с помощью super вызвать
приватный метод? И почему так?)

Добавлено через 2 минуты
Ведь модификатор private говорит что метод или переменная может быть использована только внутри класса? Или я не прав??
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
05.06.2013, 14:29
Цитата Сообщение от Care Посмотреть сообщение
Ведь модификатор private говорит что метод или переменная может быть использована только внутри класса? Или я не прав??
только если классы в разных файлах
1
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
05.06.2013, 14:39  [ТС]
Блин стоп это же иннер классы? Значит в этом подвох?

Добавлено через 4 минуты
Цитата Сообщение от mutagen Посмотреть сообщение
только если классы в разных файлах
Да но почему тогда я явно не смогу это сделать?
new InheritAll().new S1().priv(); Этот код Мне выдаст Ошибку типа :
The method priv() from the type InheritAll.S1 is not visible Тоесть Метод priv() из типа InheritAll.S1 не виден... а вот через super он виден... Это касяк разрабов Java?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
05.06.2013, 14:39
Цитата Сообщение от Care Посмотреть сообщение
Значит в этом подвох?
именно )
1
77 / 33 / 9
Регистрация: 04.06.2013
Сообщений: 295
05.06.2013, 15:08  [ТС]
Так стоп The method priv() from the type InheritAll.S1 is not visible выводиться если я создам переменную типа InheritAll.S1 в другом классе , и как бы другом объекте ...

Я вот не понял одного : Я знаю что внутриний класс имеет доступ ко всем Членам внешнего класса, а вто Внешний класс имеет ли доступ ко всем Членам внутреннего класса?

Добавлено через 6 минут
Все разобрался
InheritAll(){
S1 s = new S1();
s.priv();
}
Приват методы вызываються из-за того что это внтуренние классы вызывающегося метода и он имеет доступ к ним так как они в 1 классе ... Я правильно понял?

Добавлено через 2 минуты
Можно даже так :
void demo() {
new S1().priv();
super.def();
super.priv();
super.pub();
}
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
06.06.2013, 14:26
Цитата Сообщение от Care Посмотреть сообщение
Я вот не понял одного : Я знаю что внутриний класс имеет доступ ко всем Членам внешнего класса, а вто Внешний класс имеет ли доступ ко всем Членам внутреннего класса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.06.2013, 14:26
Помогаю со студенческими работами здесь

Не могу понять что это за ошибка
Не могу понять что это за ошибка , появилась после перезапуска Unity

Не могу понять, что это значит: while(i<10/2)
/*обращение массива*/ #include &lt;stdio.h&gt; main() { int p,i=0; static a={10,11,12,13,14, 15,16,17,18,19}; while(i&lt;10/2) ...

Никак не могу понять что это
#include &lt;iostream&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;rus&quot;); double chocolate, cofe, milk; cout &lt;&lt;...

Я не могу понять что делает данная программа. Точнее что делают функции используемые в это коде
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;ctime&gt; using namespace std; int g(int a, int n); int s(int a, int n); int...

Подскажите что делать. Знаю что надо перегрузить оператор но никак не могу понять как это сделать
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;Windows.h&gt; #include &lt;string&gt; using namespace...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru