Javenue logo

Javenue

Программирование на Java

Информационные технологии

Java задачи и головоломки - Видео

Всем привет. Для разнообразия посмотрим на язык программирования Java с другой стороны. В этой статье вы найдете:


Задачи на особенности языка Java

1. Напишите программу на java, которая выводит на консоль "Hello" при этом не содержит ни одного символа точка-с-запятой.

2. Дан код:

public class Puzzle2 {
    public static void main(String...args) {
        System.out.println(1);
    }
    public static void main(String...args) {
        System.out.println(2);
    }
}

Исправьте его так, чтобы он печатал "2". Первый метод трогать нельзя, можно либо менять второй метод, либо дописывать код после второго метода. Естественно, ничего, что связано с потоками вывода и печатью символов, тоже использовать и менять нельзя.

3. Добавьте код вместо комментариев, чтобы программа успешно компилировалась и печатала в консоль "Hello":

public class Puzzle3 { 
    // add some code here  
    public static void main(String[] args) { 
        Puzzle3 reference = null; 
        System.out.println(reference./* add more code here */); 
    } 
}

Ответы будут в конце статьи.

Видео - головоломки про Java

Кроме того, ниже вы найдете одну очень интересную ссылку. Два серьезных дядьки - Джошуа Блок (Joshua Bloch) и Нил Гафтер (Neal Gafter) в совсем несерьезном стиле предлагают вашему вниманию интереснейшие головоломки. К моему глубочайшему сожалению, я обнаружил это видео очень поздно.

Для того, чтобы их понять и попытаться решить, не нужно очень уж глубоко знать язык Java. Достаточно знать основы синтаксиса и некоторые core пакеты. С другой стороны, я практически уверен, что даже очень опытным программистам некоторые задачи не удастся решить с первого наскока.

Каждый выпуск идет около часа, но вы не будете жалеть о потраченном времени - это я вам гарантирую. Итак, один из выпусков Java Puzzlers:


Ответ на задачи

1. Наверное многие догадались, что можно как-то использовать управляющую конструкцию, например, if, с пустым блоком вместо точки с запятой. Но тогда печать должна быть в условии между круглыми скобками. Для этих целей подойдет метод printf, который возвращает PrintStream.

public class Puzzle1 {
    public static void main(String[] args) throws Exception {
        if (System.out.printf("Hello") != null) { }
    }
}

Как вариант можно воспользоваться более сложным способом с reflection:

if (System.out.getClass().getMethod("print", String.class)
        .invoke(System.out, "Hello") != null) { }

Ну и еще один читерский способ - использование в коде Unicode символа точки-с-запятой.

2. В этой задаче нужно воспользоваться тем фактом, что каждый класс имеет full qualified имя с названием пакета. Кроме того, вспоминаем, что пакет java.lang подключается автоматически. А вот и ответ:

public class Puzzle2 {
    public static void main(String...args) {
        System.out.println(1);
    }
    public static void main(java.lang.String...args) {
        System.out.println(2);
    }

    class String { }
}

После описания внутреннего класса с именем String мы неявно внесли изменения в первый метод main и теперь он не будет запущен виртуальной машиной Java.

3. Чтобы решить эту задачу нужно вспомнить про то, что доступаться к статическим полям и методам некоторого класса можно не только через имя класса, но и через ссылку на экземпляр этого класса. Таким образом, в начале можно добавить статические метод или переменную, а в месте вызова - обращение к этому методу/переменной, например:

public class Puzzle3 {
    static String hello = "Hello";
    public static void main(String[] args) {
        Puzzle3 reference = null;
        System.out.println(reference.hello);
    }
}

На сегодня все. Удачи.


Комментариев: 1

  Выйти

  * для публикации комментариев нужно  

Dmytro Pastovenskyi:

Понравилось.