将一个类定义在另一个给类里面或者方法里面,这样的类就被称为内部类。
内部类分为四类:成员内部类,匿名内部类,静态内部类,方法内部类。
class A{ class B{ } }
B为内部类,A为外部类。成员内部类可以无条件访问外部类的属性和方法,但是外部类想要访问内部类属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法。
public class child { //外部类 String name ; static int age; protected String littlename; public void friend(){ System.out.println("小孩没有朋友"); } public void friend1(){ System.out.println("小孩有一个朋友"); child1 one=new child1(); //外部类要调用内部方法必须实例化一个对象 one.method(); } public class child1{ //内部类 public void method(){ name="三毛"; age=10; littlename="毛儿"; System.out.println(name+""+age+""+littlename); } public void method2(){ friend(); friend1(); } } } ============================================================================= public class text { public static void main(String[] args) { child one=new child(); one.friend1(); //创建内部类对象方式一,必须先实例化外部类,然后在实例化内部类 child.child1 two=one.new child1(); two.method2(); } }
如果某个类的实例只是用一次,则可以将类的定义与类的创建,放到一起完成,或者说在定义类的同时就创建一个类。以这种方法定义的没有名字的类成为匿名内部类。
public class person { String name ; public void method(){ System.out.println("这是外部类的方法"); } public static void main(String[] args) { ( new person(){ //匿名内部类 public void method2(){ this.name="张三"; System.out.println(name+"这是匿名内部类"); } }).method2(); //匿名内部类结束 } }
静态内部类和成员内部类相比多了一个static修饰符。它与类的静态成员变量一般,是不依赖于外部类的。同时静态内部类也有它的特殊性。因为外部类加载时只会加载静态域,所以静态内部类不能使用外部类的非静态变量与方法。
public class person { public static class person1{ } }
public class person { static String name1; String name; public void method1() { System.out.println("这是一个普通方法"); } public static void method2() { System.out.println("这是一个静态方法"); } public static class person1 { public void method() { name1 = "小明"; // this.method1(); //无法调用非静态方法,name,也无法调用 method2(); //调用静态方法 } }
1.方法内部类就是定义在外部类的方法中,方法内部类只在该方法内可以用;
2、由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。