内部类:
内部类在类中定义的类称为内部类
分类:
成员内部类:类中方法以外
静态内部类:类中方法以外,其使用static修饰
局部内部类:方法中
匿名内部类:值或实参之中
使用内部类的原因:每个内部类都能独立的继承一个接口的实现,所以其外部的类是否继承实现接口对内部类都没有影响。
成员内部类
定义位置:在类中方法以外
语法:
访问权限修饰符 class 类名{
}
成员内部类不能定义静态属性,静态方法,静态代码块
创建对象的方式:
内部类 对象名 = 外部类对象.new 内部类对象(实参列表)
在内部类所在的外部类普通方法中创建该内部类对象,可以使用this生成内部类对象
this.new 内部类类名(实参列表);
此时this可以忽略不写
package test12;
public class Doum1 {
public void aS() {
}
public class A{
}
A a1=this.new A();//使用this
A a2=new A();
}
package test12;
import test12.Doum1.A;
public class Test1 {
public static void main(String[] args) {
Doum1 aDoume=new Doum1();
aDoume.aS();
A aw=aDoume.new A();//语法 内部类 对象名 = 外部类对象.new 内部类对象(实参列表)
}
}
当外部属性与内部属性重名时可用this区分
外部类类名.this.属性名 外部类属性
this.属性名 内部类属性
静态内部类
定义位置:内中方法以外
语法:访问权限修饰符 static class 类名{
}
外部类可以定义的,该内部类都可以定义
内部类类名 对象名 =new 外部类类名.内部类名(实参列表);
静态内部类中不能使用外部类非静态成员
局部内部类
定义位置:方法中
语法:class 类名 {
}
注意局部内部类不能定义静态属性,静态方法,静态代码块
创建对象:
内部类类名 对象名 = new 内部类类名(实参列表);
注意;
只能在定义该类内部类的方法中使用
必须在定义该类下,方法结束前
import test12.Doum1.A;
public class Test1 {
public static void main(String[] args) {
Doum1 aDoume=new Doum1();
aDoume.aS();
A aw=aDoume.new A();//语法 内部类 对象名 = 外部类对象.new 内部类对象(实参列表)
}
public void Test2() {
class B{
}
B b1=new B();
}
B c1=new B();//可见局部内部类对象,必须创建在方法内
}
匿名内部类
定义位置:值或实参中
语法:父类名/接口名 对象名 = new 父接口名/父类名(){
属性
方法
要重写的方法
}
特点:一个匿名内部类只能创建一个对象
优点:代码属性方便
缺点:导致代码混乱,使其阅读性较差
例:
package test2;
public class test {
public static void main(String[] args) {
nuBer a1=new nuBer();
a1.jia();//当想在main中直接调用未实现的方法jia时,必须使用
//一个类实现接口的类,再创建对象来使用
}
}
interface Sum{
public void jia();
}
class nuBer implements Sum{
@Override
public void jia() {
System.out.println("使用加法");
}
}
但当使用匿名内部类时
new Sum() {
@Override
public void jia() {
System.out.println("使用匿名内部类");
}
}.jia();
可以看到大大简化了书写步骤