Скрытые функции Java

Внутренний класс и вложенный статический класс в Java - это классы, объявленные внутри другого класса, известного как класс верхнего уровня в Java. В терминологии Java. Если вы объявляете вложенный класс static, он будет вызывать вложенный статический класс в Java, а нестатический вложенный класс просто называется Inner Class.

Что такое Inner Class в Java?

Любой класс, который не является верхним уровнем или объявлен внутри другого класса, известен как вложенный класс и из тех вложенных классов, класс, которые объявлены нестатические известны как класс Inner в Java. в Java есть три типа класса Inner:

1) Локальный внутренний класс - объявляется внутри кодового блока или метода. 2) Анонимный внутренний класс - это класс, который не имеет имени для ссылки и инициализируется в том же месте, где он создается. 3) Внутренний класс члена - объявлен как нестационарный член внешнего класса.

public class InnerClassTest {
    public static void main(String args[]) {      
        //creating local inner class inside method i.e. main() 
        class Local {
            public void name() {
                System.out.println("Example of Local class in Java");

            }
        }      
        //creating instance of local inner class
        Local local = new Local();
        local.name(); //calling method from local inner class

        //Creating anonymous inner class in Java for implementing thread
        Thread anonymous = new Thread(){
            @Override
            public void run(){
                System.out.println("Anonymous class example in java");
            }
        };
        anonymous.start();

        //example of creating instance of inner class
        InnerClassTest test = new InnerClassTest();
        InnerClassTest.Inner inner = test.new Inner();
        inner.name(); //calling method of inner class
    }

     //Creating Inner class in Java
    private class Inner{
        public void name(){
            System.out.println("Inner class example in java");
        }
    }
}

Что такое вложенный статический класс в Java?

Вложенный статический класс - это другой класс, который объявлен внутри класса как члена и статично. Вложенный статический класс также объявляется членом внешнего класса и может быть закрытым, открытым или защищенным, как и любой другой член. Одним из основных преимуществ вложенного статического класса над внутренним классом является то, что экземпляр вложенного статического класса не привязан к какому-либо закрывающему экземпляру класса Outer. Вам также не нужен какой-либо экземпляр класса Outer для создания экземпляра вложенного статического класса в Java .

1) Он может получить доступ к статическим членам данных внешнего класса, включая частные. 2) Статический вложенный класс не может получить доступ к нестатистическому (экземпляру) элементу данных или method .

public class NestedStaticExample {
    public static void main(String args[]){  
        StaticNested nested = new StaticNested();
        nested.name();
    }  
    //static nested class in java
    private static class StaticNested{
        public void name(){
            System.out.println("static nested class example in java");
        }
    }
}

Ссылка: Внутренний класс и вложенный Static Class в Java с примером

295
задан 5 revs, 4 users 57% 23 May 2017 в 02:26
поделиться

95 ответов

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

ThreadLocals не обычно так широко известны как способ сохранить на состояние потока.

, Так как JDK 1.5 Java имел чрезвычайно хорошо реализованные и устойчивые инструменты параллелизма вне просто блокировок, они живут в , java.util.concurrent и специфически интересный пример подпакет java.util.concurrent.atomic , который содержит ориентированные на многопотоковое исполнение примитивы, которые реализуют сравнивать-и-подкачивать операция и могут отобразиться на фактические поддерживаемые версии собственного оборудования этих операций.

432
ответ дан 2 revs, 2 users 88% 23 November 2019 в 01:34
поделиться

Едва ли функция, но забавный прием я недавно обнаружил в некоторой Веб-странице:

class Example
{
  public static void main(String[] args)
  {
    System.out.println("Hello World!");
    http://Phi.Lho.free.fr

    System.exit(0);
  }
}

действительная программа Java (хотя она генерирует предупреждение). Если Вы не видите, почему, см. ответ Gregory!;-) ну, подсветка синтаксиса здесь также дает подсказку!

52
ответ дан PhiLho 23 November 2019 в 01:34
поделиться

метод asList в java.util.Arrays позволяет хорошую комбинацию varargs, общих методов и автоупаковки:

List<Integer> ints = Arrays.asList(1,2,3);
56
ответ дан Bruno De Fraine 23 November 2019 в 01:34
поделиться

Используя этот ключевое слово для доступа к полям/методам содержания класса от внутреннего класса. В ниже, скорее изобретенный пример, мы хотим использовать sortAscending поле контейнерного класса от анонимного внутреннего класса. Используя ContainerClass.this.sortAscending вместо this.sortAscending добивается цели.

import java.util.Comparator;

public class ContainerClass {
boolean sortAscending;
public Comparator createComparator(final boolean sortAscending){
    Comparator comparator = new Comparator<Integer>() {

        public int compare(Integer o1, Integer o2) {
            if (sortAscending || ContainerClass.this.sortAscending) {
                return o1 - o2;
            } else {
                return o2 - o1;
            }
        }

    };
    return comparator;
}
}
53
ответ дан Tahir Akhtar 23 November 2019 в 01:34
поделиться

заключительная инициализация может быть отложена.

Это удостоверяется, что даже со сложным потоком логических возвращаемых значений всегда устанавливаются. Слишком легко пропустить случай и пустой указатель возврата случайно. Это не делает пустой указатель возврата невозможным, просто очевидным, что это нарочно:

public Object getElementAt(int index) {
    final Object element;
    if (index == 0) {
         element = "Result 1";
    } else if (index == 1) {
         element = "Result 2";
    } else {
         element = "Result 3";
    }
    return element;
}
82
ответ дан 2 revs, 2 users 97% 23 November 2019 в 01:34
поделиться

Я думаю, что другой "пропущенной" функцией Java является сама JVM. Это - вероятно, лучшее доступное VM. И это поддерживает много интересных и полезных языков (Jython, JRuby, Scala, Groovy). Все те языки могут легко и беспрепятственно сотрудничать.

при разработке нового языка (как в scala-случае) Вы сразу имеете все существующие библиотеки в наличии, и Ваш язык поэтому "полезен" с самого начала.

Все те языки используют оптимизацию HotSpot. VM является очень хорошо монитором и debuggable.

62
ответ дан Mo. 23 November 2019 в 01:34
поделиться

Несколько человек отправили об инициализаторах экземпляра, вот хорошее использование для него:

Map map = new HashMap() {{
    put("a key", "a value");
    put("another key", "another value");
}};

быстрый способ инициализировать карты, если Вы просто делаете что-то быстрое и простое.

Или использование его для создания быстрого колебания структурируют прототип:

JFrame frame = new JFrame();

JPanel panel = new JPanel(); 

panel.add( new JLabel("Hey there"){{ 
    setBackground(Color.black);
    setForeground( Color.white);
}});

panel.add( new JButton("Ok"){{
    addActionListener( new ActionListener(){
        public void actionPerformed( ActionEvent ae ){
            System.out.println("Button pushed");
        }
     });
 }});


 frame.add( panel );

, Конечно, этим можно злоупотребить:

    JFrame frame = new JFrame(){{
         add( new JPanel(){{
               add( new JLabel("Hey there"){{ 
                    setBackground(Color.black);
                    setForeground( Color.white);
                }});

                add( new JButton("Ok"){{
                    addActionListener( new ActionListener(){
                        public void actionPerformed( ActionEvent ae ){
                            System.out.println("Button pushed");
                        }
                     });
                 }});
        }});
    }};
89
ответ дан 3 revs, 3 users 75% 23 November 2019 в 01:34
поделиться

Динамические прокси (добавленный в 1,3) позволяют Вам определять новый тип во времени выполнения, которое соответствует интерфейсу. Это пригодилось удивительное количество раз.

88
ответ дан 3 revs, 3 users 75% 23 November 2019 в 01:34
поделиться

С Java 1.5 Java теперь имеет намного более чистый синтаксис для записи функций переменной арности. Так, вместо того, чтобы просто передать массив, теперь можно сделать следующий

public void foo(String... bars) {
   for (String bar: bars)
      System.out.println(bar);
}

, панели автоматически преобразовываются в массив указанного типа. Не огромная победа, а победа, тем не менее.

104
ответ дан Paul Wicks 23 November 2019 в 01:34
поделиться

Мой фаворит: выведите все отслеживания стека потока к стандарту.

окна: CTRL - Повреждение в Вашем Java cmd/console Unix окна

: kill -3 PID

93
ответ дан 3 revs, 2 users 82% 23 November 2019 в 01:34
поделиться

Параметрические усилители типа для общих методов могут быть определены явно как так:

Collections.<String,Integer>emptyMap()
121
ответ дан Kevin Wong 23 November 2019 в 01:34
поделиться

Разрешение методов и конструкторов в перечислениях удивило меня. Например:

enum Cats {
  FELIX(2), SHEEBA(3), RUFUS(7);

  private int mAge;
  Cats(int age) {
    mAge = age;
  }
  public int getAge() {
    return mAge;
   }
}

у Вас может даже быть "постоянное определенное тело класса", которое позволяет определенное перечисление значений переопределенным методам.

[еще 114] документация здесь .

134
ответ дан Adrian Mouat 23 November 2019 в 01:34
поделиться

Не видели, что любой упоминает instanceof, реализовываемый таким способом, которым проверка пустой указатель не необходима.

Вместо:

if( null != aObject && aObject instanceof String )
{
    ...
}

просто использование:

if( aObject instanceof String )
{
    ...
}
141
ответ дан Cadet Pirx 23 November 2019 в 01:34
поделиться

Передача управления в наконец блоке выбрасывает любое исключение. Следующий код не бросает RuntimeException - это потеряно.

public static void doSomething() {
    try {
      //Normally you would have code that doesn't explicitly appear 
      //to throw exceptions so it would be harder to see the problem.
      throw new RuntimeException();
    } finally {
      return;
    }
  }

От http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html

142
ответ дан 2 revs, 2 users 71% 23 November 2019 в 01:34
поделиться

Для большинства людей я беру интервью для положений Java-разработчика, маркированные блоки очень удивительны. Вот пример:

// code goes here

getmeout:{
    for (int i = 0; i < N; ++i) {
        for (int j = i; j < N; ++j) {
            for (int k = j; k < N; ++k) {
                //do something here
                break getmeout;
            }
        }
    }
}

то, Кто сказал goto в Java, является просто ключевым словом?:)

156
ответ дан 2 revs, 2 users 97% 23 November 2019 в 01:34
поделиться

Как насчет ковариантные типы возврата , которые существовали начиная с JDK 1.5? Это довольно плохо разглашено, поскольку это - несексуальное дополнение, но насколько я понимаю, абсолютно необходимо для дженериков работать.

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

class Souper {
    Collection<String> values() {
        ...
    }
}

class ThreadSafeSortedSub extends Souper {
    @Override
    ConcurrentSkipListSet<String> values() {
        ...
    }
}

можно назвать подкласс values метод и получить отсортированное ориентированное на многопотоковое исполнение Set из String s , не имея необходимость вниз бросать к ConcurrentSkipListSet.

144
ответ дан 2 revs 23 November 2019 в 01:34
поделиться

JDK 1.6_07 + содержит приложение под названием VisualVM (bin/jvisualvm.exe), который является хорошим GUI сверху многих инструментов. Это кажется более всесторонним, чем JConsole.

201
ответ дан Kevin Wong 23 November 2019 в 01:34
поделиться

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

public class App {
    public App(String name) { System.out.println(name + "'s constructor called"); }

    static { System.out.println("static initializer called"); }

    { System.out.println("instance initializer called"); }

    static { System.out.println("static initializer2 called"); }

    { System.out.println("instance initializer2 called"); }

    public static void main( String[] args ) {
        new App("one");
        new App("two");
  }
}

Выполнение main метод отобразится:

static initializer called
static initializer2 called
instance initializer called
instance initializer2 called
one's constructor called
instance initializer called
instance initializer2 called
two's constructor called

я предполагаю, что они были бы полезны, если бы Вы имели несколько конструкторов и нуждались в общем коде

, Они также обеспечивают синтаксический сахар для инициализации Ваших классов:

List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};

Map<String,String> codes = new HashMap<String,String>(){{ 
  put("1","one"); 
  put("2","two");
}};
220
ответ дан 5 revs, 2 users 99% 23 November 2019 в 01:34
поделиться

Совместное объединение в различии параметра типа:

public class Baz<T extends Foo & Bar> {}

, Например, если Вы хотели взять параметр, это и Сопоставимо и Набор:

public static <A, B extends Collection<A> & Comparable<B>>
boolean foo(B b1, B b2, A a) {
   return (b1.compareTo(b2) == 0) || b1.contains(a) || b2.contains(a);
}

Этот изобретенный метод возвращает true, если два данных набора равны или если любой из них содержит данный элемент, иначе ложь. Точка для замечания - то, что можно вызвать методы и Сопоставимого и Набор на аргументах b1 и b2.

279
ответ дан 5 revs, 2 users 94% 23 November 2019 в 01:34
поделиться

Это не точно "скрытые функции" и не очень полезное, но может быть чрезвычайно интересно в некоторых случаях:
Класс sun.misc. Небезопасный - позволит Вам реализовывать управление непосредственной памятью в Java (можно даже записать код Java самоизменения с этим при попытке много):

public class UnsafeUtil {

    public static Unsafe unsafe;
    private static long fieldOffset;
    private static UnsafeUtil instance = new UnsafeUtil();

    private Object obj;

    static {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");
            f.setAccessible(true);

            unsafe = (Unsafe)f.get(null);
            fieldOffset = unsafe.objectFieldOffset(UnsafeUtil.class.getDeclaredField("obj"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    };
}
46
ответ дан Das 23 November 2019 в 01:34
поделиться

Мой голос переходит в java.util.concurrent с его параллельными наборами и гибкими исполнителями, позволяющими среди пулов потоков других, запланированных задач и скоординированных задач. DelayQueue является моим любимым, где элементы сделаны доступными после указанной задержки.

java.util. Таймер и TimerTask могут безопасно быть помещены в отдых.

кроме того, не точно скрытый, но в различном пакете от других классов, связанных до настоящего времени и время. java.util.concurrent. TimeUnit полезен при преобразовании между наносекундами, микросекундами, миллисекундами и секунды.

Это читает намного лучше, чем обычный someValue * 1000 или someValue / 1000.

38
ответ дан stili 23 November 2019 в 01:34
поделиться

я лично обнаружил java.lang.Void очень поздний - улучшает удобочитаемость кода в сочетании с дженериками, например, Callable<Void>

34
ответ дан Rahel Lüthy 23 November 2019 в 01:34
поделиться

Добавление цикла foreach создает в 1,5. Я < 3 это.

// For each Object, instantiated as foo, in myCollection
for(Object foo: myCollection) {
  System.out.println(foo.toString());
}

И может использоваться во вложенных экземплярах:

for (Suit suit : suits)
  for (Rank rank : ranks)
    sortedDeck.add(new Card(suit, rank));

для - каждая конструкция также применима к массивам, где она скрывает индексную переменную, а не итератор. Следующий метод возвращает сумму значений в международном массиве:

// Returns the sum of the elements of a
int sum(int[] a) {
  int result = 0;
  for (int i : a)
    result += i;
  return result;
}

Ссылка на документацию Sun

36
ответ дан 18Rabbit 23 November 2019 в 01:34
поделиться

Едва ли часть языка Java, но javap дизассемблер, который идет с JDK Sun, не широко известна или используется.

37
ответ дан Binil Thomas 23 November 2019 в 01:34
поделиться

Уровень языка утверждает ключевое слово.

37
ответ дан Mark Cidade 23 November 2019 в 01:34
поделиться

Можно использовать перечисления для реализации интерфейса.

public interface Room {
   public Room north();
   public Room south();
   public Room east();
   public Room west();
}

public enum Rooms implements Room {
   FIRST {
      public Room north() {
         return SECOND;
      }
   },
   SECOND {
      public Room south() {
         return FIRST;
      }
   }

   public Room north() { return null; }
   public Room south() { return null; }
   public Room east() { return null; }
   public Room west() { return null; }
}

Править: Несколько лет спустя....

Я использую эту функцию здесь

public enum AffinityStrategies implements AffinityStrategy {

https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/vanilla/java/affinity/AffinityStrategies.java

При помощи интерфейса разработчики могут определить свои собственные стратегии. Используя enum средства я могу определить набор (пять) созданный в.

112
ответ дан 2 revs 23 November 2019 в 01:34
поделиться

Вы можете определить анонимный подкласс и напрямую вызвать для него метод, даже если он не реализует интерфейсы .

new Object() {
  void foo(String s) {
    System.out.println(s);
  }
}.foo("Hello");
58
ответ дан 23 November 2019 в 01:34
поделиться

При работе в Swing мне нравится скрытая функция Ctrl - Shift - F1 .

Она выгружает компонент дерево текущего окна.
(Предполагая, что вы не связали это нажатие клавиши с чем-то другим.)

42
ответ дан 23 November 2019 в 01:34
поделиться

Подстановочные знаки пути к классам начиная с Java 6.

java -classpath ./lib/* so.Main

Вместо

java -classpath ./lib/log4j.jar:./lib/commons-codec.jar:./lib/commons-httpclient.jar:./lib/commons-collections.jar:./lib/myApp.jar so.Main

См. http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html

173
ответ дан 23 November 2019 в 01:34
поделиться

Каждый файл класса начинается с шестнадцатеричного значения 0xCAFEBABE, чтобы идентифицировать его как действительный байткод JVM.

(Explanation)

40
ответ дан 23 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: