- What is Nested Classes in Java? Static Nested Classes and Inner Classes
- 1. What is a Nested Class in Java?
- 2. Why We Use Nested Classes in Java?
- 3. What is a Static Nested Class in Java?
- 4. Nested Interfaces in Java:
- 5. What is an Inner Class in Java?
- Other Recommended Tutorials:
- About the Author:
- Add comment
- Comments
- Статические вложенные классы
- Nested Classes in Java
What is Nested Classes in Java? Static Nested Classes and Inner Classes
Have you ever heard something like nested classes, inner classes, anonymous classes…? This tutorial gives you the concepts of nested classes in the Java programming language along with code examples. And we focus on explaining the concepts of static nested classes and inner classes.
By understanding how nested classes work, you will be able to write code more flexibly and more succinct in order to take the fullest extent of the Java programming language.
1. What is a Nested Class in Java?
A class is declared within another class is called a nested class. Here’s an example:
Here, the class Engine is nested within the class Car . Engine is the nested class and Car is the outer class (or enclosing class).
2. Why We Use Nested Classes in Java?
— Grouping related code together: some classes are only useful to others, e.g. the Engine class and Car class in the above example. By using nested classes, related code is grouped together which gives us more flexibility and controllability in writing code.
— Increasing code encapsulation: consider the above example — the nested class Engine is encapsulated inside the Car class, which protects the Engine class from the outside world.
— Making the code more readable and maintainable: Indeed, nested classes help us write more readable and maintainable code, as shown in the above example: when reading to the Car class, we can also navigate to the Engine class and make update quickly within the same source file.
Do you know there are two types of nested classes? They are static nested ones and inner ones. Let’s look at each now.
3. What is a Static Nested Class in Java?
A nested class is marked with static modifier is called the static nested class . Here’s an example:
Here, Wheel is a static nested class which is enclosed in the Car class. The following code illustrates how to instantiate an object of the static nested class:
Car.Wheel wheel = new Car.Wheel(); wheel.rotate();
As we can see, a static nested class does not have any relationship with the outer class, except for the purpose of packaging and encapsulation.
Like static methods, the static class can have only direct access to the static members of the enclosing class. For example:
As we can see, the static nested class cannot have direct access to instance members of the enclosing class, except via object reference of the enclosing class. Here’s an example:
Car car = new Car(); Car.Wheel wheel = new Car.Wheel(); wheel.test(car);
An interesting point is that the static nested class is just like a member of the enclosing class. That means we can use access modifiers for the static nested class, i.e. public, protected, private and package private.
A static class can also have instance and static members just like a regular class.
4. Nested Interfaces in Java:
Interfaces are static by default, thus we can instantiate an object of an implementing class like this:
Car.Control controller = new CarControl(); controller.start();
Provided that CarControl is the following class:
class CarControl implements Car.Control < public void start() < >public void stop() < >public void brake() < >>
5. What is an Inner Class in Java?
An inner class is a nested class which is not static. In other words, an inner class is like an instance member of the enclosing class. Here’s an example:
An inner class is associated with an instance of the enclosing class, thus we have to create a new object of the inner class like this:
Computer comp = new Computer(); Computer.Screen screen = comp.new Screen();
As we can see, unlike a static nested class, we need an object reference of the enclosing class in order to instantiate the inner class. Note that the place of the new key word used here:
Computer.Screen screen = comp.new Screen();
The inner class has direct access to all instance members of the enclosing class, even they are declared as private.
But an inner class cannot have static members (though it can have direct access to static members of the enclosing class).
Other Recommended Tutorials:
About the Author:
Nam Ha Minh is certified Java programmer (SCJP and SCWCD). He started programming with Java in the time of Java 1.4 and has been falling in love with Java since then. Make friend with him on Facebook and watch his Java videos you YouTube.
Add comment
Comments
Code is :
Car.Control controller = new CarControl();
Code I think should be :
Car.Control controller = new Car.Control();
—Below is the page link where you can find that code.
Page ->codejava.net/. /.
CodeJava.net shares Java tutorials, code examples and sample projects for programmers at all levels.
CodeJava.net is created and managed by Nam Ha Minh — a passionate programmer.
Copyright © 2012 — 2023 CodeJava.net, all rights reserved.
Статические вложенные классы
Привет! Мы продолжаем изучать тему вложенных классов (nested classes) в Java. На прошлом занятии мы поговорили о нестатических внутренних классах (non-static nested classes) или, как их еще называют, внутренних классах. Сегодня перейдем к другой группе и рассмотрим подробнее статические вложенные классы (static nested classes). Чем они отличаются от остальных групп? При объявлении такого класса мы используем уже знакомое тебе ключевое слово static:
public class Boeing737 < private int manufactureYear; private static int maxPassengersCount = 300; public Boeing737(int manufactureYear) < this.manufactureYear = manufactureYear; >public int getManufactureYear() < return manufactureYear; >public static class Drawing < public static int getMaxPassengersCount() < return maxPassengersCount; >> >
В этом примере у нас есть внешний класс Boeing737 , который создает самолет этой модели. А у него — конструктор с одним параметром: годом выпуска ( int manufactureYear ). Также есть одна статическая переменная int maxPassengersCount — максимальное число пассажиров. Оно будет одинаковым у всех самолетов одной модели, так что нам достаточно одного экземпляра. Кроме того, у него есть статический внутренний класс Drawing — чертеж самолета. В этом классе мы можем инкапсулировать всю служебную информацию о самолете. В нашем примере для простоты мы ограничили ее годом выпуска, но она может содержать много другой информации. Как мы и говорили в прошлой лекции, создание такого вложенного класса повышает инкапсуляцию и способствует более реалистичной абстракции. В чем же отличие между статическим и нестатическим вложенными классами? 1. Объект статического класса Drawing не хранит ссылку на конкретный экземпляр внешнего класса. Вспомни пример из прошлой лекции с велосипедом:
public class Bicycle < private String model; private int mawWeight; public Bicycle(String model, int mawWeight) < this.model = model; this.mawWeight = mawWeight; >public void start() < System.out.println("Поехали!"); >public class SteeringWheel < public void right() < System.out.println("Руль вправо!"); >public void left() < System.out.println("Руль влево!"); >> >
Там мы говорили о том, что в каждый экземпляр внутреннего класса SteeringWheel (руль) незаметно для нас передается ссылка на объект внешнего класса Bicycle (велосипед). Без объекта внешнего класса объект внутреннего просто не мог существовать. Для статических вложенных классов это не так. Объект статического вложенного класса вполне может существовать сам по себе. В этом плане статические классы более «независимы», чем нестатические. Единственный момент — при создании такого объекта нужно указывать название внешнего класса:
Почему мы сделали класс Drawing статическим, а в прошлой лекции класс Seat (сиденье велосипеда) был нестатическим? Как и в прошлый раз, давай добавим немного «философии» для понимания примера 🙂 В отличие от сиденья велосипеда, сущность чертежа не привязана так жестко к сущности самолета. Отдельный объект сиденья, без велосипеда, чаще всего будет бессмысленным (хотя и не всегда — мы говорили об этом на прошлом занятии). Сущность чертежа имеет смысл сама по себе. Например, он может пригодиться инженерам, планирующим ремонт самолета. Сам самолет для планирования им не нужен, и может находиться где угодно — достаточно просто чертежа. Кроме того, для всех самолетов одной модели чертеж все равно будет одинаковым, так что такой жесткой связи, как у сиденья с велосипедом, нет. Поэтому и ссылка на конкретный объект самолета объекту Drawing не нужна. 2. Разный доступ к переменным и методам внешнего класса. Статический вложенный класс может обращаться только к статическим полям внешнего класса. В нашем примере в классе Drawing есть метод getMaxPassengersCount() , который возвращает значение статической переменной maxPassengersCount из внешнего класса. Однако мы не можем создать метод getManufactureYear() в Drawing для возврата значения manufactureYear . Ведь переменная manufactureYear — нестатическая, а значит, должна принадлежать конкретному экземпляру Boeing737 . А как мы уже выяснили, в случае со статическими вложенными классами объект внешнего класса запросто может отсутствовать. Отсюда и ограничение 🙂 При этом неважно, какой модификатор доступа имеет статическая переменная во внешнем классе. Даже если это private , доступ из статического вложенного класса все равно будет. Все вышесказанное касается не только доступа к статическим переменным, но и к статическим методам. ВАЖНО! Слово static в объявлении внутреннего класса не означает, что можно создать всего один объект. Не путай объекты с переменными. Если мы говорим о статических переменных — да, статическая переменная класса, например, maxPassangersCount , существует в единственном экземпляре. Но применительно ко вложенному классу static означает лишь то, что его объекты не содержат ссылок на объекты внешнего класса. А самих объектов мы можем создать сколько угодно:
public class Boeing737 < private int manufactureYear; private static int maxPassengersCount = 300; public Boeing737(int manufactureYear) < this.manufactureYear = manufactureYear; >public int getManufactureYear() < return manufactureYear; >public static class Drawing < private int id; public Drawing(int id) < this.id = id; >public static int getPassengersCount() < return maxPassengersCount; >@Override public String toString() < return "Drawingв документации Oracle. Почитай, если вдруг остались неясные моменты. А теперь самое время решить пару задач! :)