学习目标:
内部类
1.成员内部类
2.静态内部类
3.局部内部类
4.匿名内部类
学习内容:
内部类
一个类定义在另外一个类的内部.
编译后,内部类会编译为一个独立的.class文件,与外部类分别独立存在,互无关系.
1.成员内部类
- 可以访问外部类的私有成员
- 用 外部类类名 .this.xxx
class Outer {
private int a=10;
private static int b=20;
class MemberInner{
//成员内部类
private int a=30;
public void print() {
int a=50;
System.out.println(a); //50--内部变量
System.out.println(this.a); //30--成员变量,this在这里可以区分局部变量或成员变量
System.out.println(Outer.this.a);//10
}
}
}
2.静态内部类
3.局部内部类
- 定义在方法内部,作用范围,从定义开始,到所在代码块结束
- 可以访问外部类的私有成员
- 可以访问外部类 的局部变量,编译器会将将该局部变量变为final,其值不能改变
package com.dhy.test01;
class Outer {
//成员变量
private int a=10;
private static int b=20;
//成员内部类
class MemberInner{
private int a=30;
public void print() {
}
}
static class StaInner{
public void print() {
}
}
public void method(int x) { //x=30
int y=40;
//局部内部类,定义在方法内部
//jdk8以前,局部内部类不能访问x,y,只能访问常量final int x
//现在使用自动在x前加上final
//y++语法过不去,这里y已经是常量,不能改变
class LocalInner{
public void print() {
System.out.println(a);//10
System.out.println(b);//20
System.out.println(x);//30
System.out.println(y);//40
}
}
LocalInner i=new LocalInner();
i.print();
}
}
为保证值不变,加final变常量
局部变量在方法内部,
4.匿名内部类
- 特殊的局部内部类
- 必须继承某个类,或是实现某个接口
- 只会创建一次对象
- 可以访问外部类的私有成员和局部常量(final)
- 无法定义构造方法,只有一个默认的公开无参构造方法
new 接口名 (){接口的实现类的代码}
用一个匿名的局部内部类实现接口,同时创建了实现类的一个对象
interface IA{
void a();
void b();
}
/*
class IAin implements IA{
public void a(){}
public void b(){}
}
IA m1=new IAin();
*/
IA m2=new IA(){
public void a();
public void b();
}