内部类
概念:在类中定义的类
外部类:相对于内部类而言,在外部的类
注意:
1.外部类不能使用static修饰
2.外部类的访问权限修饰符不能使用private修饰
匿名对象:没有对象名的的对象
分类
作用:为外部类提供属性与方法
成员内部类
位置:类中方法外
语法
访问权限修饰符 class 类名{
}
注意:成员内部类不能使用静态成员(静态属性,静态方法,静态代码块)
创建对象:
外部类类名.内部类类名 对象名 = 外部类类名.new 内部类类名(实参列表);
特殊情况:
1.当外部类属性名与内部类属性名相同时如何区分
this.属性名表示内部类属性
外部类.this.属性名 表示外部属性
2.当外部类方法与内部类方法相同时如何区分
this.方法名(实参列表) 内部类方法
外部类.this.方法名(实参列表) 外部类方法
例:
package com.qf.demo03;
//OutClass:外部类
public class OutClass {
//InClass:内部类
public class InClass{
}
}
静态内部类(就是用static修饰的成员内部类)
位置:类中方法外
语法
访问权限修饰符 static class 类名{
}
注意:外部类可以定义的,静态内部类都可以定义
创建对象:
外部类类名 .内部类类名 对象名 = new 外部类类名.内部类类名(实参列表);
特殊情况:
1.当外部类属性名与内部类属性名相同时如何区分
当属性为静态属性
内部类类名.属性名表示内部类属性
外部类类名.属性名表示外部类属性
当属性为非静态属性
内部类中不能直接使用外部类非静态成员
例:
package com.qf.demo06;
import java.io.Serializable;
public class OutClass {
private String text01 = "外部类非静态属性";
private static String text02 = "外部类静态属性";
public static class InClass extends Object implements Serializable{
private String text01 = "内部类非静态属性";
private static String text02 = "内部类静态属性";
public InClass() {
}
public void test01() {
System.out.println(this.text01);//内部类属性
System.out.println(InClass.text02);//内部类静态属性
System.out.println(OutClass.text02);//外部类静态属性
//静态内部类中不能直接使用外部类非静态成员
//System.out.println(OutClass.this.text01);
}
public static void test02() {
}
{
}
static {
}
}
}
局部内部类
位置:方法内
语法
class 类名{
}
创建对象
内部类类名. 对象名 = new 内部类类名(实参列表);
注意:只能在定义该类的方法中使用
匿名内部类(*)
位置:值或实参中
语法
父类名/父接口名 对象名 = new 父类名/父接口名(){
属性
方法
代码块
}
特点:
1.一个匿名内部类只能创建一个对象
优点:便于书写
注意:
1.匿名内部类不能定义静态成员
2.匿名内部类必须重写所有抽象方法
例:
package com.qf.demo08;
public class Button {
private OnClikeListener listener;
//设置点击后需要执行的事件
public void setListener(OnClikeListener listener) {
this.listener = listener;
}
//按钮按下的方法
public void down() {
listener.click();
}
}