一、内部类
内部类是指定义在另外一个类里面的类,这叫做内部类,就是在类里面定义类,内部类又分为成员内部类和局部内部类。
1、成员内部类
成员内部类是指定义在外部类的成员位置。
package gc.test.java.cs2; public class Info{ public String name = "张三"; protected String sex = "男"; String addr = "湖北武汉"; private int age = 20; class User{//User是一个成员内部类 public void init1(){ System.out.println(name); System.out.println(sex); System.out.println(addr); System.out.println(age); } } public void show(){ User user = new User(); user.init1(); } }
package gc.test.java.cs1; import gc.test.java.cs2.Info; public class Main { public static void main(String[] args) { Info info = new Info(); info.show(); } }
运行结果:
张三
男
湖北武汉
20
通过上面运行结果可以看出,成员内部类可以直接访问外部内的成员,即使是私有成员也可以访问。
下面我们在成员内部类中加上和外部内同样的变量,看下结果是怎么样的
package gc.test.java.cs2; public class Info{ public String name = "张三"; protected String sex = "男"; String addr = "湖北武汉"; private int age = 20; class User{//User是一个成员内部类 public String name = "李四"; protected String sex = "女"; String addr = "北京"; private int age = 30; public void init1(){ System.out.println(Info.this.name); System.out.println(Info.this.age); System.out.println(this.name); System.out.println(name); } } public void show(){ User user = new User(); user.init1(); System.out.println("成员内部类的age:" + user.age); } }
运行结果:
张三
20
李四
李四
成员内部类的age:30
通过上面运行结果可以看出,成员内部类是可以访问外部类的变量的,通过外部类名.this.变量名称就可以访问,同样也可以看出,外部内也可以访问成员内部类的变量,即使是私有的也可以,需要实例化成员内部类才能访问。
package gc.test.java.cs1; public class Base { public String sex = "男"; }
package gc.test.java.cs2; import gc.test.java.cs1.Base; public class Info{ public String name = "张三"; class User extends Base{//User是一个成员内部类 } public void show(){ User user = new User(); System.out.println("成员内部类的name:" + user.name);//编译报错 System.out.println("成员内部类的sex:" + user.sex); } }
通过上面代码,可以看出,成员内部类和外部内是没有继承关系的。
2、局部内部类
局部内部类是指内部类定义在方法和作用域内。
package gc.test.java.cs2; public class Info{ public String name = "张三"; protected String sex = "男"; String addr = "湖北武汉"; private int age = 20; public void init(){ class User{//User是一个局部内部类 public void show(){ System.out.println(name); System.out.println(sex); System.out.println(addr); System.out.println(age); } } User user = new User(); user.show(); } }
package gc.test.java.cs1; import gc.test.java.cs2.Info; public class Main { public static void main(String[] args) { Info info = new Info(); info.init(); } }
运行结果:
张三
男
湖北武汉
20
通过上面运行结果可以看出,局部内部类也可以访问外部内的成员,包括私有的也可以。