标签:关系 .data extend builder this clear put var tin
Java内部类或嵌套类是在类或接口中声明的类。我们使用内部类在一个地方逻辑地分组类和接口,以便它更可读和可维护。此外,它还可以访问外部类的成员,包括私有数据成员和方法。
内部类是嵌套类的一部分,非静态嵌套类被视为内部类
有静态嵌套类和非静态嵌套类两种类型。非静态嵌套类被视为内部类
在类内部创建但在方法之外的非静态类称为成员内部类。语法:
1 class TestMemberOuter1{ 2 private int data=30; 3 class Inner{ 4 void msg(){System.out.println("data is "+data);} 5 } 6 public static void main(String args[]){ 7 TestMemberOuter1 obj=new TestMemberOuter1(); 8 TestMemberOuter1.Inner in=obj.new Inner(); 9 in.msg(); 10 } 11 }
Java编译器在内部类的情况下创建两个类文件。内部类的类文件名是“outer$inner”。如果要实例化内部类,则必须创建外部类的实例。在这种情况下,内部类的实例是在外部类的实例中创建的。
java编译器创建一个名为"outer$inner"的类文件。成员内部类具有外部类的引用,这就是为什么成员内部类可以访问外部类的所有数据成员的原因
import java.io.PrintStream; class Outer$Inner { final Outer this$0; Outer$Inner() { super(); this$0 = Outer.this; } void msg() { System.out.println((new StringBuilder()).append("data is ") .append(Outer.access$000(Outer.this)).toString()); } }
一个没有名字的类在Java中被称为匿名内部类。如果您必须重写类或接口的方法,则应该使用它。可以通过两种方式创建Java匿名内部类
1 abstract class Person{ 2 abstract void eat(); 3 } 4 class TestAnonymousInner{ 5 public static void main(String args[]){ 6 Person p=new Person(){ 7 void eat(){System.out.println("nice fruits");} 8 }; 9 p.eat(); 10 } 11 }
import java.io.PrintStream; static class TestAnonymousInner$1 extends Person { TestAnonymousInner$1(){} void eat() { System.out.println("nice fruits"); } }
在方法中创建的类称为Java中的本地内部类。如果要调用本地内部类的方法,必须在该方法中实例化该类。
1 public class localInner1{ 2 private int data=30;//instance variable 3 void display(){ 4 class Local{ 5 void msg(){System.out.println(data);} 6 } 7 Local l=new Local(); 8 l.msg(); 9 } 10 public static void main(String args[]){ 11 localInner1 obj=new localInner1(); 12 obj.display(); 13 } 14 }
1 import java.io.PrintStream; 2 class localInner1$Local 3 { 4 final localInner1 this$0; 5 localInner1$Local() 6 { 7 super(); 8 this$0 = Simple.this; 9 } 10 void msg() 11 { 12 System.out.println(localInner1.access$000(localInner1.this)); 13 } 14 }
规则:
在类中创建的静态类在Java中称为静态嵌套类。它不能访问非静态数据成员和方法。它可以由外部类名访问。
class TestOuter1{ static int data=30; static class Inner{ void msg(){System.out.println("data is "+data);} } public static void main(String args[]){ TestOuter1.Inner obj=new TestOuter1.Inner(); obj.msg(); } }
在这个例子中,你需要创建静态嵌套类的实例,因为他含有实例方法msg()。但是你不需要创建外部类的实例,因为嵌套类是静态的并且静态的属性、方法、类在没有对象情况下可以被访问
1 import java.io.PrintStream; 2 static class TestOuter1$Inner 3 { 4 TestOuter1$Inner(){} 5 void msg(){ 6 System.out.println((new StringBuilder()).append("data is ") 7 .append(TestOuter1.data).toString()); 8 } 9 }
5. 嵌套接口
在另一个接口或类中声明的接口称为嵌套接口。嵌套接口用于对相关接口进行分组,以便它们易于维护。嵌套接口必须由外部接口或类引用。它不能直接访问。
嵌套接口要记住的要点
interface Showable{ void show(); interface Message{ void msg(); } } class TestNestedInterface1 implements Showable.Message{ public void msg(){System.out.println("Hello nested interface");} public static void main(String args[]){ Showable.Message message=new TestNestedInterface1();//upcasting here message.msg(); } }
public static interface Showable$Message { public abstract void msg(); }
是的,我们可以在接口中定义一个类,java编译器将会创建一个静态嵌套类
标签:关系 .data extend builder this clear put var tin
原文地址:https://www.cnblogs.com/boboshenqi/p/9531897.html