内部类(当作类中的一个普通成员变量,只不过此成员变量是class的变量类型)
一个java文件中可以包含多个类,但是只能有一个public class。
如果一个类定义在另一个类的内部,此时可以称之为内部类。
1 public class Demo{ 2 private int id; 3 private String name; 4 public void test(){ 5 System.out.println("test"); 6 } 7 8 class InnerClass{ 9 private int age; 10 public void show(){ 11 System.out.println("show"); 12 } 13 } 14 }
使用:外部类.内部类 内部类名 = new 外部类().new 内部类();
1 public class TestInner{ 2 public static void main(String agrs[]){ 3 Demo.InnerClass inner = new Demo().new InnerClass(); 4 inner.show(); 5 } 6 }
特点:内部类可以方便的使用外部类的私有属性;
外部类不能访问内部类的私有属性,但是如果创建了内部类的对象,此时可以在外部类中访问私有属性;
内部类中不能定义静态属性;
当内部类和外部类具有相同的私有属性时,在内部类访问时,可直接访问内部类的私有属性,要想访问外部类时需要 外部类.this.属性名
1 package com.test.InnerClass; 2 3 public class Demo { 4 private int id=1; 5 private String name="tom"; 6 private int age; 7 public void test(){ 8 System.out.println("test"); 9 InnerClass inner = new InnerClass(); 10 System.out.println("不能直接调用内部类私有属性,可以通过创建内部类对象调用age:"+inner.age); 11 } 12 13 class InnerClass{ 14 private int age=15; 15 public void show(){ 16 System.out.println("show"); 17 System.out.println("直接调用外部类id:"+id); 18 test(); 19 System.out.println("内部类age:"+age); 20 System.out.println("外部类age:"+Demo.this.age); 21 } 22 } 23 }
分类(重要):1、匿名内部类。
当定义一个类,实现了某个接口时,在使用过程中只需要使用一次,没有其他用途,再考虑到代码的简洁,可以不特意创建一个类,而使用new interface(){(实现未实现的方法)},就叫匿名内部类。
2、静态内部类。
在内部类中可以定义静态内部类,使用static关键字修饰,使用规则 外部类.内部类 内部类名字 = new 外部类.内部类();
1 package com.test.InnerClass; 2 3 public class Demo01 { 4 private int id; 5 public void test(){ 6 System.out.println("test"); 7 } 8 9 public static void main(String[] args) { 10 Demo01.InnerClass01 inner = new Demo01.InnerClass01(); 11 inner.show(); 12 } 13 14 static class InnerClass01{ 15 private int age; 16 public void show(){ 17 System.out.println("static内部类的show"); 18 } 19 } 20 }
3、方法内部类
在外部类的方法中也可以定义内部类(作为了解),使用时需要注意,只能在方法中创建对象,因为此class的作用域就是该方法。
1 package com.test.InnerClass; 2 3 public class Demo01 { 4 private int id; 5 public void test(){ 6 System.out.println("test"); 7 class InnerClass03{ 8 private int age; 9 public void show(){ 10 System.out.println("方法内部类的show"); 11 } 12 } 13 InnerClass03 inner = new InnerClass03(); 14 inner.show(); 15 } 16 }
1 package com.test.InnerClass; 2 3 public class Test { 4 public static void main(String[] args) { 5 // Demo.InnerClass inner = new Demo().new InnerClass(); 6 // inner.show(); 7 8 Demo01 demo01 = new Demo01(); 9 demo01.test(); 10 } 11 }