内部类
概念:在Java,类中除了可以定义属性和方法外,还可以定义类,该类称为内部类,内部类所在的类称为外部类.
内部类的特性:
1.内部类与外部类经过编译后是两个独立的类
2.内部类是外部类的一个成员,因此内部类能够访问外部类的任何成员(包括私有),但是外部类不可以直接访问内部类的成员
3.内部类可以由static由public,protected,private修饰,而外部类只能由public或package修饰.
可以创建内部类对象,通过内部类对象来访问内部类成员
- 内部类访问特点
- a:内部类可以直接访问外部类的成员,包括私有。
- b:外部类要访问内部类的成员,必须创建对象。
- 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
根据内部类的位置,修饰符,定义方式的不同,分为四种:
1)成员内部类;
public class InnerTest {
private String name = "Other";
private int count;
public void otherSay() {
System.out.println("outer class");
}
class Inner {
private String name = "Other.inner";
public void say() {
//类名.this表示外部类对象
System.out.println(InnerTest.this.name);
//当前类
System.out.println(this.name);
InnerTest.this.count = 10;
System.out.println("count=" + InnerTest.this.count);
InnerTest.this.otherSay();
}
}
}
//---------------------------------------
A a = new A();
A.B b = a.new B();
2)静态内部类
3)方法内部类
在成员方法中定义的类,与局部变量类似,作用域为定义它的代码块,因此只能在定义该内部类的方法体内new
public class FunctionInner {
private static String name = "Other2";
private int count = 10;
public void say() {
String name = "say";
//声明方法内部类
class Inner {
//定义成员
public String name = "Other.Inner";
public void say() {
System.out.println(name);
System.out.println(FunctionInner.name);
}
}
Inner obj = new Inner();
obj.say();
}
}
匿名内部类
没有名称的内部类,声明内部类时就会创建一个内部类对象,声明内部类结束后,对象也随即消失,匿名内部类不能重复使用.
内部类的适用场合:不是必须的
继承:子类是父类的拓展(功能增强)
内部类:对类中的成员进一步的细分
interface A{
public void doSomething();
}
public class B{
public void fun(A a){
System.out.println("B's fun");
a.doSomething();
}
}
public class Test{
public static void main(String args[]){
B b = new B();
b.fun(new A(){
public void doSomething(){
System.out.println("匿名内部类");
}
}
}
}
A:匿名内部类
- 就是内部类的简化写法。
B:前提:存在一个类或者接口
- 这里的类可以是具体类也可以是抽象类。
C:格式:
new 类名或者接口名(){
重写方法;
}D:本质是什么呢?
- 是一个继承了该类或者实现了该接口的子类匿名对象。