内部类
所谓内部类,就是把类放在某个范围的内部
类可以放在包中
类可放在文件中, .java文件
类可以放在类中(类里套类) 内部类
类可以放在方法中(方法里套类) 内部类
类中放置内部类
要使用内部类,就需要在外部类中实例化内部类的对象
然后用对象打点调用内部类中的方法(可以在外部类中,调用内部类中的私有方法和私有属性)
通过内部类里的方法来操作内部类的数据,在内部类中可以直接使用外部类中的方法和属性
要使用内部类,可以在外部类的外边实例化内部类的对象然后通过打点调用内部类的非私有的方法(同一个包内)
演示代码
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);
}
}
}
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).*/
}
方法里套类
要使用方法中的内部类,就必须在方法中,内部类定义的下面实例化对象,然后通过内部类对象打点调用内部类中的属性和方法(包含私有的)
内部类的作用域仅限于当前方法,从内部类定义开始到方法结束作用域就消失
在内部类中可以直接使用外部类中的属性,和当前方法中的局部变量
在外部类中,不能使用外部类方法中的内部类
演示代码
public class OuterClass {
private int outer_1=100;
private int outer_2=10;
public void outer_method1(){
int method_var1=456;
System.out.println("OuterClass.outer_method1()");
System.out.println(outer_1+" "+outer_2);
//有名的内部类
class InnerClass{
private int inner_1=123;
private int inner_2=321;
public void inner_method1(){
System.out.println("inner_method1()");
System.out.println(inner_1+" "+inner_2);
System.out.println(method_var1+" "+outer_1+" "+outer_2);
outer_method2();
}
private void inner_method2(){
System.out.println("inner_method1()");
System.out.println(inner_1+" "+inner_2);
System.out.println(method_var1+" "+outer_1+" "+outer_2);
}
}
InnerClass ic=new InnerClass();
ic.inner_method1();
ic.inner_method2();
outer_method2();
}
public void outer_method2(){
System.out.println("outer_method2()");
}
}
public static void main(String[] args) {
OuterClass oc=new OuterClass();
oc.outer_method1();
}
匿名内部类
匿名内部类也是内部类,但没有类的名字,但有属性和方法
比如:
Person接口
//匿名内部类,但有对象
Person p=new Person(){
public void study(){};
public void eat();
};
p.study(); p.eate();
//匿名内部类,但没有对象名
new Person(){
public void study(){};
public void eat(){}
}.study();
匿名内部类的特点:
当前匿名内部类中实现的方法,只能实现一次
如果还想要其他的实现,则必须用匿名内部类重新new 进行实现
匿名内部类更适合提供长辈的方法的实现,而且实现只需要一次,即可
匿名内部类跟有名内部类的区别
匿名内部类的方法只能实现一次,对象也只有一个,有名内部类也是实现一次,但可以new很多的内部类对象