Внутренний класс и вложенный статический класс в 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 с примером
Инициализация Двойных фигурных скобок взяла меня врасплох несколько месяцев назад, когда я сначала обнаружил его, никогда не слышимый о ней прежде.
ThreadLocals не обычно так широко известны как способ сохранить на состояние потока.
, Так как JDK 1.5 Java имел чрезвычайно хорошо реализованные и устойчивые инструменты параллелизма вне просто блокировок, они живут в , java.util.concurrent и специфически интересный пример подпакет java.util.concurrent.atomic , который содержит ориентированные на многопотоковое исполнение примитивы, которые реализуют сравнивать-и-подкачивать операция и могут отобразиться на фактические поддерживаемые версии собственного оборудования этих операций.
Едва ли функция, но забавный прием я недавно обнаружил в некоторой Веб-странице:
class Example
{
public static void main(String[] args)
{
System.out.println("Hello World!");
http://Phi.Lho.free.fr
System.exit(0);
}
}
действительная программа Java (хотя она генерирует предупреждение). Если Вы не видите, почему, см. ответ Gregory!;-) ну, подсветка синтаксиса здесь также дает подсказку!
метод asList в java.util.Arrays
позволяет хорошую комбинацию varargs, общих методов и автоупаковки:
List<Integer> ints = Arrays.asList(1,2,3);
Используя этот ключевое слово для доступа к полям/методам содержания класса от внутреннего класса. В ниже, скорее изобретенный пример, мы хотим использовать 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;
}
}
заключительная инициализация может быть отложена.
Это удостоверяется, что даже со сложным потоком логических возвращаемых значений всегда устанавливаются. Слишком легко пропустить случай и пустой указатель возврата случайно. Это не делает пустой указатель возврата невозможным, просто очевидным, что это нарочно:
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;
}
Я думаю, что другой "пропущенной" функцией Java является сама JVM. Это - вероятно, лучшее доступное VM. И это поддерживает много интересных и полезных языков (Jython, JRuby, Scala, Groovy). Все те языки могут легко и беспрепятственно сотрудничать.
при разработке нового языка (как в scala-случае) Вы сразу имеете все существующие библиотеки в наличии, и Ваш язык поэтому "полезен" с самого начала.
Все те языки используют оптимизацию HotSpot. VM является очень хорошо монитором и debuggable.
Несколько человек отправили об инициализаторах экземпляра, вот хорошее использование для него:
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");
}
});
}});
}});
}};
Динамические прокси (добавленный в 1,3) позволяют Вам определять новый тип во времени выполнения, которое соответствует интерфейсу. Это пригодилось удивительное количество раз.
С Java 1.5 Java теперь имеет намного более чистый синтаксис для записи функций переменной арности. Так, вместо того, чтобы просто передать массив, теперь можно сделать следующий
public void foo(String... bars) {
for (String bar: bars)
System.out.println(bar);
}
, панели автоматически преобразовываются в массив указанного типа. Не огромная победа, а победа, тем не менее.
Мой фаворит: выведите все отслеживания стека потока к стандарту.
окна: CTRL - Повреждение в Вашем Java cmd/console Unix окна
: kill -3 PID
Параметрические усилители типа для общих методов могут быть определены явно как так:
Collections.<String,Integer>emptyMap()
Разрешение методов и конструкторов в перечислениях удивило меня. Например:
enum Cats {
FELIX(2), SHEEBA(3), RUFUS(7);
private int mAge;
Cats(int age) {
mAge = age;
}
public int getAge() {
return mAge;
}
}
у Вас может даже быть "постоянное определенное тело класса", которое позволяет определенное перечисление значений переопределенным методам.
[еще 114] документация здесь .
Не видели, что любой упоминает instanceof, реализовываемый таким способом, которым проверка пустой указатель не необходима.
Вместо:
if( null != aObject && aObject instanceof String )
{
...
}
просто использование:
if( aObject instanceof String )
{
...
}
Передача управления в наконец блоке выбрасывает любое исключение. Следующий код не бросает 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
Для большинства людей я беру интервью для положений 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, является просто ключевым словом?:)
Как насчет ковариантные типы возврата , которые существовали начиная с JDK 1.5? Это довольно плохо разглашено, поскольку это - несексуальное дополнение, но насколько я понимаю, абсолютно необходимо для дженериков работать.
По существу, компилятор теперь позволяет подклассу сужать тип возврата переопределенного метода быть подклассом типа возврата исходного метода. Таким образом, это позволяется:
class Souper {
Collection<String> values() {
...
}
}
class ThreadSafeSortedSub extends Souper {
@Override
ConcurrentSkipListSet<String> values() {
...
}
}
можно назвать подкласс values
метод и получить отсортированное ориентированное на многопотоковое исполнение Set
из String
s , не имея необходимость вниз бросать к ConcurrentSkipListSet
.
JDK 1.6_07 + содержит приложение под названием VisualVM (bin/jvisualvm.exe), который является хорошим GUI сверху многих инструментов. Это кажется более всесторонним, чем JConsole.
Я был удивлен инициализаторами экземпляра на днях. Я удалял некоторые свернутые кодом методы и закончил тем, что создал несколько инициализаторов экземпляра:
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");
}};
Совместное объединение в различии параметра типа:
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.
Это не точно "скрытые функции" и не очень полезное, но может быть чрезвычайно интересно в некоторых случаях:
Класс 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);
}
};
}
Мой голос переходит в java.util.concurrent с его параллельными наборами и гибкими исполнителями, позволяющими среди пулов потоков других, запланированных задач и скоординированных задач. DelayQueue является моим любимым, где элементы сделаны доступными после указанной задержки.
java.util. Таймер и TimerTask могут безопасно быть помещены в отдых.
кроме того, не точно скрытый, но в различном пакете от других классов, связанных до настоящего времени и время. java.util.concurrent. TimeUnit полезен при преобразовании между наносекундами, микросекундами, миллисекундами и секунды.
Это читает намного лучше, чем обычный someValue * 1000 или someValue / 1000.
я лично обнаружил java.lang.Void
очень поздний - улучшает удобочитаемость кода в сочетании с дженериками, например, Callable<Void>
Добавление цикла 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;
}
Едва ли часть языка Java, но javap дизассемблер, который идет с JDK Sun, не широко известна или используется.
Уровень языка утверждает ключевое слово.
Можно использовать перечисления для реализации интерфейса.
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 {
При помощи интерфейса разработчики могут определить свои собственные стратегии. Используя enum
средства я могу определить набор (пять) созданный в.
Вы можете определить анонимный подкласс и напрямую вызвать для него метод, даже если он не реализует интерфейсы .
new Object() {
void foo(String s) {
System.out.println(s);
}
}.foo("Hello");
При работе в Swing мне нравится скрытая функция Ctrl - Shift - F1 .
Она выгружает компонент дерево текущего окна.
(Предполагая, что вы не связали это нажатие клавиши с чем-то другим.)
Подстановочные знаки пути к классам начиная с 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
Каждый файл класса начинается с шестнадцатеричного значения 0xCAFEBABE, чтобы идентифицировать его как действительный байткод JVM.