内部类
作用:
1.补充外部类的功能
名词介绍
内部类:在类中定义的类就是内部类(类中、方法中)
如:public class A{
public class B{
}
}
此时b就是内部类
外部类:没在类中的类就是外部类,如上面的,此时A就是外部类
内部类的分类
1.成员内部类
在类中方法以外定义的类就是成员内部类
如:
public class A{
public class B{
属性
方法
}
}
注:成员内部类不能定义静态的,因为加载时,会优先加载静态,但是此时还没有加载内部类,所以不能这样
如果内部类属性和外部类属性重名的话,要用外部类属性的时候,类名.this.属性名,其他的都和普通类一样
外部类方法中创建内部类对象:
public void text(){
B b=new B();
}
在外部类的静态方法中创建内部类对象:
public static void text1(){
A a=new A();
B b=a.new B();
}
在别的类中创建该内部类对象:本质上和外部类的静态方法中创建内部类对象一样
class C{
void text3(){
A a=new A();
B b=a.new B();
// B b=new A().new B(); 简写方法
}
}
2.静态内部类
用static修饰的成员内部类
如:
public class A{
public static class B{
}
}
注:静态内部类中不能使用外部类的非静态成员,如果是静态的,则直接类名.成员名 就可以了
在别的类中创建静态内部类对象:
class C{
void text4(){
B b=new A.B();
}
}
3.局部内部类
方法以内定义的类就是局部内部类
如:
class A{
void text5(){
class B{
}
}
}
注意:只能在当前方法中使用,不能定义静态成员,没有访问权限修饰符
创建对象:
class A{
void text5(){
class B{
}
B b=new B();
}
}
4.匿名内部类
在实参中或者值中定义的类就是 匿名内部类(没有类名的类就是匿名内部类),只能创建一个该类对象
注意:使用位置只能在值或者实参中用,必须有一个父类或者父接口,匿名内部类的使用80%伴随接口回调
如:
public class Text {
public static void main(String[] args) {
Button button = new Button();
button.setClick(new Click() { public void click(boolean a) {
if(a) {
System.out.println("开灯");
}
else {
System.out.println("关灯");
}
}});
button.dianJi();
button.dianJi();
}
}
优点:1.节省一个类名
2.方便书写代码
缺点:1.导致代码结构混乱,难以阅读
语法:new 父类/接口(){重写的方法}
使用场景:1.获取一个接口或抽象类对象
2.调用方法时,参数需要一个接口对象或者抽象类的对象



