成员内部类
private 修饰为了数据的安全性
static 修饰为了访问的方便性
成员内部类不是静态的:
外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
成员内部类是静态的:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
成员内部类不是静态
class Outer{
class Inner{
public void show(){
System.out.println(“TEst”);
}
}
}
class Cheng{
public static void main(String[] args){
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
成员内部类是静态的
class Outer{
static class Inner{
public void show(){
System.out.println(“TEst”);
}
}
}
class Cheng{
public static void main(String[] args){
Outer.Inner oi = new Outer.Inner();
oi.show();
}
}
局部内部类
可以直接访问外部类的成员
在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类工能
题:
局部内部类访问局部变量的注意事项
局部内部类访问局部变量,局部变量必须用final修饰
因为局部变量会随着方法调用完毕消失,而堆内存的内容不会立即消失,所以要final修饰
匿名内部类
内部类的简化写法
前提:存在一个类或者接口
格式
new 类名或者接口名(){ // 被继承的类或者被实现的接口名
重写方法;
}
本质
是一个继承了该类或者实现了该接口的子类的对象
例:
interface Inner{
public abstract void show();
public abstract void show2();
}
class Outer {
public void method(){
/*
// 实现Inner接口的匿名局部内部类(子类) 对象 调用一个方法.
new Inner(){
public void show(){
System.out.println(“show”);
}
}.show();
*/
// 实现Inner接口的匿名局部内部类(子类) 对象 调用多个方法. 多态
Inner i = new Inner(){
public void show(){
System.out.println(“show”);
}
public void show2(){
System.out.println(“show2”);
}
}; // 主要要加分号
i.show();
i.show2();
}
}
class InnerClassDemo{
public static void main(String[] args){
Outer o = new Outer();
o.method();
}
}
匿名内部类的实际应用
interface Person{
public abstract void study();
}
/*
//方式1 实现类
class Student implements Person{
public void study(){
System.out.println(“好好学习”);
}
}
/
class PersonDemo{
//接口名作为形式参数
//需要接口实现类的对象
public void method(Person p){
p.study();
}
}
class InnerDemo{
public static void main(String[] args){
/
//方式1
Student s = new Student();
PersonDemo p = new PersonDemo();
p.method(s);
*/
//方式2 节省内存空间 不定义Student类 直接传递Person接口实现类的匿名对象
PersonDemo p1 = new PersonDemo();
p1.method(new Person(){
public void study(){
System.out.println(“好好学习天天向上”);
}
});
}
}
/*填空要求打印HelloWorld!
interface Inner{
public abstract void show();
}
class Outer{填空}
}
class OuterDemo{
public static void main(String[] args){
Outer.method().show();
}
}
/
/
1:Outer.method()可以看出method()应该是Outer中的一个静态方法
2:Outer.method().show()可以看出method()方法的返回值是一个对象.
又因为接口Inner中有一个show()方法,所以我认为method()方法的返回值类型是一个接口.
*/
interface Inner{
public abstract void show();
}
class Outer{
public static Inner method(){
return new Inner(){
public void show(){
System.out.println(“HelloWorld!”);
}
};
}
}
class OuterDemo{
public static void main(String[] args){
Outer.method().show();
}
}