Есть 4 формы внутренних классов Java, которые мы обычно используем: общие внутренние классы, локальные внутренние классы, анонимные внутренние классы и статические внутренние классы. Ниже приведен тест, который я сделал, чтобы проиллюстрировать характеристики различных внутренних классов.
Что касается характеристик внутренних классов, код подробно объясняется следующим образом.
/** Java Interabj Test********************************************************************************** В void pppp ()* Ниже приведен компилятор, автоматически сгенерированные статическими методами доступа к частным атрибутам или уровню пакета методов* Статический доступ $ 0 (Interobj)*/public class Interobj {private int i = 8; Private Intera a = null; public interobj () {ia = new Intera ();} private int geti () {return i; p () {pi (); pp (); ppp (); pppp (); pppp ();}/ * * В общих внутренних классах, методах и свойствах можно получить на любом уровне в «классе пальто». Класс куртки также может* получить доступ к методам и свойствам на любом уровне в «внутреннем классе». Потому что внутренний класс может содержать ссылку на объект класса пальто. * Для частных методов и атрибутов, к которым необходимо получить доступ внутренним классом, компилятор автоматически генерирует статические методы «пакет», соответствующие * частным методам и атрибутам. Эти методы должны использовать внешний объект класса в качестве параметра *, чтобы вы могли получить доступ к частным методам и * атрибутам во внешнем классе в статических методах «пакет». * Тот же принцип такой же для класса куртки, чтобы получить доступ к частным методам и свойствам во внутреннем классе. Когда внутренний класс будет скомпилирован, * будет генерировать статический метод «пакет» -Level, соответствующий частным методам и свойствам, к которым необходимо получить доступ к классу куртки. * * InterA reflection result: * private int ia * Below is the reference of the coat class object held by the internal class* final InterObj this$0 * Use the coat class object as a parameter in the constructor* InterObj$InterA(InterObj) * private void pA() * Below is the compiler automatically generates a static method for accessing private attributes or method package level* static void access$0(InterObj$InterA) * public void pa1 () * */class intera {private int ia = 9; private void pa () {system.out.println ("Это Intera.pa: ia ="+ia+", Interobj.i ="+geti ());} public void pa1 () {system.println ("Это intera.pa1: ia = "+ia+", interobj.i = "+geti ());}}/ * * Локальные внутренние классы видны только внутри методов, а другие функции такие же, как общие внутренние классы. * Для локальных переменных, к которым необходимо получить доступ, это должно быть установлено в конечном счете, потому что, хотя локальный внутренний класс может содержать * ссылки на объект внешнего класса для доступа к свойствам и методам, он не может получить доступ к локальным переменным во внешнем методе класса. Все компиляторы «копируют» копию локальных переменных, к которым необходимо получить доступ в локальном внутреннем классе (но нет копии для типов, основные типы, сплавка, плавание и строка * не изменяются). Чтобы убедиться, что копированное значение переменной и объект *, на который указывают значение переменной во внешнем методе, являются одинаковым объектом, требуется, чтобы эти локальные переменные, используемые локальным классом, были установлены на конечную и не могут быть изменены *, чтобы гарантировать, что копированные переменные в локальной части и переменные во внешнем методе указывают на тот же объект. Установка переменной * на конечные элементы управления, на которые указывает на адрес объекта переменная, остается неизменной, а не то, что внутренние свойства объекта, на который он указывает, не могут быть изменены. * * Результат отражения Interb: * * Private int IB * ниже приведен ссылка на объект класса COAT, удерживаемый внутренним классом * Окончательный интерфейс. Компилятор автоматически генерирует статический метод для доступа к частным свойствам или уровню пакета методов * Статический доступ $ 0 (Interobj $ 1 $ interb) */public void pi () {final int s = 5; окончательный тест теста = new Test (); класс Interb {private int ib = 7; private void pb () {System.out.println ("Это intb.p. ", (Method) pi.s ="+s+", test.t ="+test.gett ());}} interb ib = new Interb (); // Это изменяется внутреннее состояние теста на тест, на который ссылаются локальный внутренний класс. // Когда результат называется ib.pb (), вывод - это измененное значение 100test.sett (100); ib.pb ();}/ * * Статический внутренний класс, используемый, когда нет необходимости удерживать ссылку на «объект класса пальто». * * Результат отражения интерк: (статический внутренний класс не имеет ссылки на объект класса COAT) * Private Int IC * interc () * private void pc () */static class interc {private int ic = 6; private void pc () {System.out.println («Это Interc.pc: ic ="+ic);}}/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * You can access any permissions in the inner class*/public void pp(){InterA ia=new InterA();ia.pA();ia.pA1();InterC ic=new InterC();ic.pC();// Local internal classes are only visible inside the method //InterB ib=new InterB();}/* * Static methods can only construct static internal classes. * Вы не можете построить нестатические внутренние классы, потому что в статическом методе нет объекта, который относится к «классу пальто», чтобы построить * объект внутреннего класса, на который необходимо ссылаться объект класса пальто. */public static void ppp () {// intera ia = new Intera (); // Но его можно построить следующим образом: Interobj iobj = new Interobj (); Intera ia = iobj.new intera (); ia.pa (); ia.pa1 () interc = new Interc () iC.pa ();//inpertab ib = new Interb ();}/ * * * Анонимный внутренний тест класса */public void pppp () {testinterface tif = new testinterface () {public void pppp () {system.out.println ("testinterface.noname");}}; tif.pppp ();}/ * Запуск Результат: * interb.p.p. ib = 7, (метод) pi.s = 5, test.t = 100 * Это интернат. Это Interc.pc: ic = 6*testinterface.noname*/public static void main (string [] args) {interobj io = new Interobj (); io.p ();}}/** Интерфейс для создания класса внутренних классов*/interface testinterface {public void pppp ();}/** локальный класс getT () {return t;} public void settle (int t1) {t = t1;}}Позвольте мне поделиться еще одним примером:
открытый класс innerclass {static toy toy = new toy () {string name = "lao wu";@переопределить public void jump () {system.out.println (имя+"взлома из Земли"); Go ();}};/*Внутренний класс: класс, определенный внутри класса*1. Внутренний класс участника: *1.1 Внутренний класс члена может напрямую получить доступ к свойствам внешнего класса *1.2 Доступ к текущему объекту внешнего класса через внешнее имя класса. Таким образом * Участник внутреннего класса созданный объект: Имя внешнего класса. Внутреннее имя класса Ссылка на имя = внешний класс объект. NEW Внутреннее имя класса (); *2. Статический внутренний класс*2.1. Ресурсы элемента внешнего класса не могут быть доступны внутри статического внутреннего класса и могут получить доступ к статическим ресурсам внешнего класса через имя класса*Статический внутренний класс объект создания: Имя внешнего класса. Внутреннее имя класса Ссылка на имя = новое имя внешнего класса. Внутреннее имя класса (); *3. Локальный внутренний класс:*3.1 Вы также можете напрямую получить доступ к свойствам внешнего класса*3.2 Вы также можете получить доступ к текущему объекту внешнего класса*3.3. Локальный внутренний класс можно получить только внутри метода, а модификатор может быть только по умолчанию*4. Анонимный внутренний класс: когда требуется конкретный экземпляр подкласса класса, класс временно генерируется с использованием * New Class name () { * Topwrite Method; *}; *4.1 Анонимный внутренний класс доступ к свойствам внешнего метода, и это свойство будет преобразовано в постоянные*4.2 Новые атрибуты и методы, добавленные во внутренний класс анонимного, и могут использоваться только в анонимном внутреннем классе **/Public void Main (String [] args) {Человек на = новый человек ("lao chen", 18); Компьютер («инопланетянин»); Person.computer PC1 = новый человек ("Jian Zihao", 18) .new Computer ("инопланетянин"); pc.rungame (); pc1.rungame (); person.computer1 pc11 = new Person.computer1 ("internet cafe computer"); pc11.rungame (); per.Usecomputer (); "Rokudou"; Computer com = new Computer () {@override public void rungame () {// todo автоматически сгенерированный метод. Classes/*Toy Toy = new Toy () {@Override public void jump () {System.out.println («Вырыв из земли»); }};*/toy.jump (); toy.jump (); // toy.go (); // system.out.println (toy.);}} класс Person {string name; int age; int age1 = 18; static String name1 = "Обычный эксперт"; public name, int age) {super (); playgame () {System.out.println (name+"Play Game");} Public Class Computer {string name; public Computer (string name) {super (); this.name = name;} public void Rungame () {System.out.println (имя+"run game"); System.out.println (aste. oge. Статический класс Computer1 {string name; public computer1 (string name) {super (); this.name = name;} public void rungame () {System.out.println (name+"run game"); System.out.println (Person.age1+""+person.name1+"string game");} public public usecumpure () {string neme usempure {class {string usempure {{string usemputer {) {string us us {string) {super (); this.name = name;} public void rungame () {System.out.println (name+"run game"); System.out.println (Person.tis.age+""+Person.Tis.name+"Playing Game");}} Compact Comm = new Compact ("Notebring"); Rungame ();} открытый класс Toy {public void Jump () {System.out.println ("Jump Toy");}}Суммировать
Выше приведено подробное объяснение внутреннего тестового кода Java в этой статье, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!