内部类定义
将一个类定义在另一个类里面,我们把里面那个类称为内部类(内置类、嵌套类)。
内部类和外部类互访原则
1.内部类可以直接访问外部类的成员,包括私有成员。因为隐含了外部类的引用。
格式:外部类名.this.外部成员名
2.外部类访问内部类必须建立内部类对象。
内部类可以定义在外部类的任意位置上,成员或者局部都可以:
当内部类定义在成员位置时
只有当内部类定义在外部类成员位置上时,才可以被成员修饰符private/static所修饰
(1)当内部类没有被任何成员修饰符所修饰时,可以在外部其他类中直接建立该内部类对象
格式:Outer.Inner in = new Outer().new Inner();
(2)当内部类被private所修饰时(将内部类在外部类中进行封装)。
可以在外部类的成员函数内建立内部类的对象,
并在外部其他类中建立外部类的对象调用该成员函数以访问该内部类。
(3)当内部类被static所修饰时,该内部类只能直接访问外部类中的static成员。
内部类是static的,该内部类里面的成员函数可以不是static的: new Outer.Inner().function();
该内部类里面的成员函数也可以是static的: Outer.Inner.function();
注意:
当内部类中定义了static成员,那么这个内部类必须是static的。(非静态内部类中不能有静态申明)
当外部类中的static方法访问内部类时,该内部类也必须是static的。
因为当外部类一加载的时候静态方法就已经存在,这时候方法内需要内部类对象,而该内部类是非静态成员,在外部类建立对象时才加载。
1 class Outer
2 {
3 private static int num = 9;
4
5 private static class Inner
6 {
7 //int num = 5;
8 private static void function()
9 {
10 //int num = 3;
11 System.out.println(num);
12 }
13 }
14
15 static void method()
16 {
17 //new Inner().function();
18 Inner.function();
19 }
20 }
21
22 class InnerDemo
23 {
24 public static void main(String[] args)
25 {
26 //Outer.Inner di = new Outer().new Inner(); //Inner类被private修饰之后就不可以这样访问了
27 //di.print();
28
29 //Outer d = new Outer();
30 //d.method();
31
32 Outer.method();
33 }
34 }
什么时候定义内部类?
当描述事物时,事物的内部还有事物,该事物用内部类来表示。
因为内部事物在使用外部事物的内容。
1 /*
2 //心脏小例子
3 class Body
4 {
5 private class Heart
6 {
7 //内部类成员体
8 }
9
10 public void show()
11 {
12 new Heart().内部类方法;
13 }
14
15 }
16 */当内部类定义在局部(外部类的成员函数里)时:
(1)不能再被成员修饰符所修饰,因为它已不再是外部类的成员,而是局部。
局部内部类是不能定义静态成员的,因为当内部类中定义了static成员,那么这个内部类必须也是static的。(非静态内部类中不能有静态申明)
(2)在外部类成员函数内局部内部类外面的下面建立局部内部类对象调用内部类成员函数,否则内部类内成员函数不予执行。
(3)可以直接访问外部类的成员,因为还持有外部类引用。
(4)不可以直接访问外部类成员函数内的局部变量(局部内部类外的),也就是说不允许直接访问它所在的局部中的变量,只能访问被final修饰的局部变量。
(5)外部类的成员可以是静态的。成员变量可以是私有的,成员函数如果私有了得话就不能被外部类对象调用了。
1 class Outer2 {3 private static int num = 9;4 5 void method(final int num)6 {7 //final int num = 5;8 class Inner9 {10 //private int num = 3;11 void function()12 {13 System.out.println(num);14 }15 }16 new Inner().function();17 }18 }19 20 21 class InnerDemo2 22 {23 public static void main(String[] args) 24 {25 Outer out = new Outer();26 out.method(7);27 out.method(8);28 29 }30 }
匿名内部类1.匿名内部类其实就是内部类的简写格式。2.定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。3.匿名内部类的格式: new 父类或者接口(){定义子类的内容}4.其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。 可以理解为带内容的对象。5.匿名内部类中定义的方法最好不要超过3个。1 abstract class AbsDemo
2 {3 abstract void show();4 }5 6 class Outer7 {8 private int x = 9;9 10 /*11 class Inner extends AbsDemo //第一步:创建内部类继承一个抽象类或借口12 {13 void show() //第二部:覆盖父类方法14 {15 System.out.println("Outer:x="+x);16 }17 }18 */19 20 public void function()21 {22 //new Inner().show(); //第三步:创建内部类对象,第四步:用内部类对象调用内部类成员方法。23 new AbsDemo() //将绿色部分的四步合为一步24 {25 void show()26 {27 System.out.println("Outer:x="+x);28 }29 }.show();30 }31 }32 33 34 class InnerDemo335 {36 public static void main(String[] args) 37 {38 new Outer().function();39 }40 }
例子:1 interface Inter2 {3 void method();4 }5 6 class Test7 {8 //补足代码,通过匿名内部类9 static Inter function()10 {11 return new Inter()12 {13 public void method()14 {15 System.out.println("haha");16 }17 };18 }19 20 }21 22 23 class InnerClassTest 24 {25 public static void main(String[] args) 26 {27 Test.function().method();28 29 }30 }
什么时候定义匿名内部类呢?
当你使用的方法的参数类型是一个借口类型时,该接口你去查看一下,当它里面的方法是一个或两个的时候, 可以定义一个匿名内部类,把匿名内部类作为参数传进去也可以。
1 interface Inter2 {3 void method();4 }5 6 class Test7 {8 public static void show(Inter in)9 {10 in.method();11 }12 }13 14 class InnerClassTest2 15 {16 public static void main(String[] args) 17 {18 Test.show(new Inter()19 {20 public void method()21 {22 System.out.println("method run");23 }24 });25 26 }27 }
面试问答: 请问没有父类没有接口可不可以定义匿名内部类,我只想定义一个function()方法?
答:可以,因为所有类都有一个共同的父类Object。
1 class InnerClassTest3 2 {3 public static void main(String[] args) 4 {5 new Object()6 {7 void function()8 {9 System.out.println("function run");10 }11 }.function();12 13 }14 }
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net