JavaRush/Java блог/Архив info.javarush/Уровень 15: план уровня и доп. материалы
hubert
41 уровень

Уровень 15: план уровня и доп. материалы

Статья из группы Архив info.javarush
участников
План уровня:
  • Перегрузка методов, особенность вызова конструкторов
  • Модифиаторы доступа public, protected, модификатор по умолчанию (package), private
  • Неявная реализация абстрактного метода
  • Расширение видимости
  • Расширение типа результата, возвращаемого методом
  • Перегрузка методов
  • Порядок вызова конструкторов
  • статический блок
  • Порядок инициализации данных

Курс Java Что еще можно посмотреть на досуге: Инициализация членов класса Отличная подборка историй трудоустройства учеников JavaRush. Почитайте обязательно!
Нашли классную ссылку к материалу данной темы? Добавьте ее сюда в виде комментария. Возможно, именно Ваша ссылка поможет другому человеку стать программистом и улучшить свою жизнь!

Вернуться к плану обучения
Вернуться к обучению java онлайн на JavaRush
Комментарии (18)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
xgrothx
Уровень 30
8 февраля 2017, 20:43
public class Solution {
    public static void main(String[] args) {
        printMatrix((Double) 2.0, (Double) 3.0, "8");
        
    }

    public static void printMatrix(Integer m, Integer n, String value) {
        System.out.println("Integer");
    }
    
    public static void printMatrix(double m, double n, String value) {
        System.out.println("Double");
    }
    
    public static void printMatrix(Number n, Number m, String value) {
        System.out.println("Number");
    }


Да, очень странно. Вывод на экран:
Number


Почему так происходит? Примитивы и обертки очень странно себя ведут с точки зрения обывательской логики)
artemtimac
Уровень 22
28 января 2015, 01:39
В лекции Порядок загрузки классов, статические данные сказано, что статические переменные нельзя инициализировать в конструкторе, поэтому применяются статические блоки. Разъясните этот момент, пожалуйста, т.к. у меня свободно получается делать это в конструкторе, или я, видимо, не понял, что имелось ввиду.
IvanRychkov
Уровень 19
15 апреля 2015, 01:59
Здесь имеется в виду то, что класс при загрузке, в отличие от создаваемого объекта, не использует конструктор, но вместо этого можно добавить статические блоки, которые выполняют функцию инициализации статических полей(или делают ещё что-нибудь полезное)

public class Solution {

    static int A;
    static {
        System.out.println("Я - класс, я загрузился");
        A = 5;
    }
    
    public Solution(){
        System.out.println("Я - объект, меня создали");
    }
}
asolovey
Уровень 26
6 августа 2014, 23:48
В этой статье по ссылке об инициализации, есть такой пример:

//: initialization/ArraysOfPrimitives.java
// Массивы простейших типов.
import static net.mindview.util.Print.*;
 
public class ArraysOfPrimitives {
  public static void main(String[] args) {
    int[] a1 = { 1, 2, 3, 4, 5 };
    int[] a2;
    a2 = a1;
    for(int i = 0; i < a2.length; i++)
      a2[i] = a2[i] + 1;
    for(int i = 0; i < a1.length; i++)
      print("a1[" + i + "] = " + a1[i]);
  }
}
<spoiler text="Output:">

a1[0] = 2
a1[1] = 3
a1[2] = 4
a1[3] = 5
a1[4] = 6


Не могу понять, почему такой вывод, если мы присваиваем значения элементов массива a1 элементам массива a2. Ведь a1 по идее значения при этом не должны меняться. Объясните, пожалуйста.
hhp
Уровень 28
20 июля 2014, 21:01
Помогите разобраться — почему в main метод me.getMyParent() возвращает ссылку на Cat, а не на Tiger?
Ведь me фактически ссылается на Tiger, т.е при вызове метода
getMyParent() в процессе работы программы определяется фактический класс объекта(а он Tiger) и должен вызваться метод именно класса Tiger, который должен вернуть ссылку на Tiger, а не на Cat.
В последней строчке в main при попытке присвоить Tiger myParent = me.getMyParent(); компилятор подчеркивает и пишет:
«Incopatible types. Required: Tiger. Found: Cat»

public class Solution
{
    public static void main(String[] args)
    {
        Tiger parent = new Tiger();

        Cat me = new Tiger();
        me.setMyParent(parent);
        Tiger myParent = me.getMyParent();
    }
}

class Cat
{
    public Cat parent;
    public Cat getMyParent()
    {
        return this.parent;
    }
    public void setMyParent(Cat cat)
    {
        this.parent = cat;
    }
}

class Tiger extends Cat
{
    public Tiger getMyParent()
    {
        return (Tiger)this.parent;
    }
}
Sant9Iga
Уровень 41
25 июля 2014, 12:40
Izhak
Уровень 22
20 мая 2014, 15:18
в лекции Создание объектов. Порядок вызова конструкторов два раза повторяется одна и та же таблица.
Spitfire
Уровень 33
30 апреля 2014, 11:45
А каким образом происходит расширение типа, для классов-оберток над примитивными типами?
Вот пример кода:
public static void main(String[] args){
        print((Byte)(byte)1);
        
    }

    public static void print(int i)
    {
        System.out.println("int");
    }

    public static void print(Short i)
    {
        System.out.println("Short");
    }

Он выводит на экран
int
что для меня стало неожиданностью — не думал, что объектный тип будет «расширен» до примитивного.
Кто-то может рассказать, какая процедура расширения в таких случаях?
gnev
Уровень 24
17 мая 2014, 23:39
вообще IDEA подсвечивает кастование в (Byte), считая эту операцию лишней. А если так, то обертывания не происходит.
Nazgul
Уровень 33
14 апреля 2014, 02:50
Будем ли мы дальше проходить регулярные выражения и что посоветуете почитать на эту тему?
tarrus
Уровень 20
15 марта 2014, 22:06
Оставьте хоть какие нибудь ссылки где можно почитать про эти темы в лекции.
Maksim_Bardin
Уровень 28
12 марта 2014, 12:43
У меня вопрос по лекции «Порядок инициализации переменных».
Вот например если так:
public class Temp1
{
    public int getD()
    {
        return d;
    }

    public int a = getD();
    public int b = d;
    public int d = 4;
}

Почему в случае присваивания переменной a значения переменной d через функцию все нормально (a = 0),
а в случае присваивания переменной b значения переменной d компилятор пишет ошибку?
Если класс загружается сверху вниз, то d неизвестна ни там ни там. Судя по всему в случае использования функции применяется какой-то другой механизм?
Sant9Iga
Уровень 41
12 марта 2014, 13:07
при использовании метода, переменная d проинициализируется по умолчанию. а если ты просто присваиваешь одну переменную другой(непроинициализированной) тогда выдается ошибка компиляции.
немного похожий баг еще есть вот в такой штуке:
public class Temp1
{
    public int getD()
    {
        boolean s = false;
        while(true){
            if(s){
                break;
            }
        }
        return d;
    }

    public int a = getD();
    public int b = d;
    public int d = 4;
}

в вайле у тебя никогда иф не выполнится, и будет бесконечный цикл. Но если ты иф отсюда уберешь, тогда опять таки будет ошибка компиляции. Тебе подчеркнет эту строку:
return d;

и скажет что никогда не выполнится эта строка.
Maksim_Bardin
Уровень 28
12 марта 2014, 13:27
Sant9Iga, спасибо.
phashik
Уровень 28
12 марта 2014, 00:39
Что-то я не понял в лекции про вызов Cat.print(null)
Показаны две ситуации.
В первой
null не имеет определенного типа и компилятор откажется компилировать этот код
А во второй
ошибки компиляции не будет и вызовется метод print(String s), что несколько неочевидно
И никаких объяснений, почему же случается такая неочевидность :(
Maksim_Bardin
Уровень 28
12 марта 2014, 12:32
phashik, могу предположить, что в первом случае null можно присвоить как переменной Integer, так и переменной String, в плане приоритета эти два присваивания равнозначны, и возникает неопределенность. Если удалить один из этих методов, то код компилируется без ошибок, как и во втором случае.
MindIbniM
Уровень 41
28 июля 2014, 23:24
спасибо, тоже интересовал этот вопрос
mrANDERSON
Уровень 26
9 июля 2016, 13:35
Всегда можно посмотреть, что скажет Идеа, а говорит она, что подходят оба метода и неизвестно какой вызывать. А во втором случае однозначно можно определить, что String «шире» Object и нужно вызывать его. Т.е. String и Integer равнозначны, а
String и Object нет.