内部类: 顾名思义就是把类放在某个范围的内部
- 类可以放在包
- 类可以放在文件中,.java文件
- 类可以放在类中(类里套类) 内部类
- 类可以放在方法中(方法类套类) 内部类
1.类中放置内部类
要使用内部类,就需要在外部类中实例化内部类的对象
然后用对象打点调用内部类中的方法
(可以在外部类中,调用内部类的私有方法和私有属性)
通过内部类里的方法来操作内部类的数据,
在内部类中可以直接使用外部类中的所有的方法和属性
要使用内部类,可以在外部类的外面实例化内部类的对象
然后通过对象打点调用内部类的非私有的方法(同一个包内)
2.方法类套类
要使用方法中的内部类,就必须在方法中,内部类定义的下面
实例化内部类的对象,然后通过内部类对象打点,调用内部类
中的属性和方法(包含私有的)
内部类的作用域仅限于当前方法
从内部类定义开始到方法结束,内部类的作用域就消失
在内部类中可以直接使用外部类中的属性和当前方法中的局部变量
在外部类的外部不能使用外部类的方法中的内部类
例:
public class OuterClass {
private int outer_1=100;
public int outer_2=10;
InnerClass ic1=new InnerClass();//作用域整个OuterClass范围
public void outer_method1(){
System.out.println("outer_method1()");
System.out.println(outer_1+" "+outer_2);
InnerClass ic2=new InnerClass();//作用域,从本行开始到第一个右大括号结束
System.out.println("在外部类中用内部类的对象调用内部类中的所有(公,私)="+ic1.inner_1);
ic1.inner_method1();
ic1.inner_method2();
System.out.println("在外部类中用内部类的对象调用内部类中的所有(公,私)="+ic2.inner_1);
ic2.inner_method1();
ic2.inner_method2();
}
//有名内部类,类里套类
class InnerClass{
private int inner_1=123;
public int inner_2=321;
public void inner_method1(){
System.out.println("Inner_method1() 内部类可以直接访问外部类中的属性和方法");
System.out.println("InnerClass中的属性 "+inner_1+" "+inner_2);
System.out.println("outerClass中的属性 "+outer_1+" "+outer_2);
}
private void inner_method2(){
System.out.println("Inner_method2() 内部类可以直接访问外部类中的属性和方法");
System.out.println("InnerClass中的属性 "+inner_1+" "+inner_2);
System.out.println("outerClass中的属性 "+outer_1+" "+outer_2);
}
}
}
测试类
注意特殊用法,在外部类的外部实例化内部类的对象
OuterClass.InnerClass ic = oc.new InnerClass();
OuterClass.InnerClass ic1 =new OuterClass().new InnerClass();
public class Test {
public static void main(String[] args) {
//普通用法
OuterClass oc=new OuterClass();
oc.outer_method1();
//特殊用法,在外部类的外部实例化内部类的对象
OuterClass.InnerClass ic=oc.new InnerClass();
OuterClass.InnerClass ic1=new OuterClass().new InnerClass();
/*No enclosing instance of type
OuterClass is accessible. Must qualify the
allocation with an enclosing instance of
type OuterClass (e.g. x.new A()
where x is an instance of OuterClass).*/
}
}
运行结果:
outer_method1()
100 10
在外部类中用内部类的对象调用内部类中的所有(公,私)=123
Inner_method1() 内部类可以直接访问外部类中的属性和方法
InnerClass中的属性 123 321
outerClass中的属性 100 10
Inner_method2() 内部类可以直接访问外部类中的属性和方法
InnerClass中的属性 123 321
outerClass中的属性 100 10
在外部类中用内部类的对象调用内部类中的所有(公,私)=123
Inner_method1() 内部类可以直接访问外部类中的属性和方法
InnerClass中的属性 123 321
outerClass中的属性 100 10
Inner_method2() 内部类可以直接访问外部类中的属性和方法
InnerClass中的属性 123 321
outerClass中的属性 100 10