内部类
在一个类中定义另一个类叫做内部类,一个独立的类,在编译时内部类会被编译成独立.class文件
只不过在文件名前面有外部类的类名和$符号
例如:在A类中定义一个B类 -> A$B.class
注意: 1)内部类是外部类的一个成员,因此内部类可以自由访问外部类的成员,包括私有成员。
2)但是外部类不能访问内部类属性
最主要的内部类:
1.成员内部类 成员变量 --->
(1)成员内部类可以等同看作成员变量,位置在:外部类类体中,方法体之外
(2)可以用控制访问权限的修饰符修饰
(3)成员内部类不能拥有静态声明
(4)成员内部类可以访问外部类的所有数据
1.1 成员内部类创建对象
外部类 外部类对象 = new 外部类名() ;
外部类名.内部类名 内部类对象 = 外部类对象.new 内部类名();
注意:如果导入了import包名.外部类名.内部类名;可省略成为:内部类名 内部类对象 = 外部类对象.new 内部类名();
2.静态成员内部类 静态变量
(1)静态内部类可以看作静态变量
(2)静态内部类可以被控制访问权限修饰从
(3)静态内部类可以声明静态成员(也可以声明非静态成员)
(4)静态内部类可以直接访问我们外部类的静态数据,而不能访问成员数据(原因:随外部类加载后,成员数据还未加载)
2.1静态成员内部类创建对象:
外部类名.静态内部类名 静态内部类对象=new 外部类名.静态类名();
/*18.10.17
*
*
* 3.局部内部类 局部变量
* (1)局部内部类可以等同看作局部变量
* (2)不能使用控制访问权限修饰
* (3)局部内部类不能拥有静态声明(方法在栈中会被销毁,不是永存的)
* 重点:(4)局部内部类访问局部变量的时候,局部变量必须是final修饰的
* 解释: 方法在栈中,因此局部内部类也在栈中,当方法运行完毕之后,这个局部内部类应该被销毁,而对象可能没有被销毁,当对象去访问一个不存在的变量。(对象在,变量不在)
* 当加入final时,将局部变量放入了内部类的成员变量中。
*
4.匿名内部类
* (1)匿名内部类:指类没有名字
* (2)只传入接口
* (3)好处:少定义一个类
* 缺点:无法重复利用
* (4)用法:方法(new 接口)(理解:在不知道名字的情况下,接口想象成父类便于理解)
*
*
*/
public class TestInnerClass {
//静态变量
private static String st1="111";
//成员变量
private String st2="222";
//静态方法
private static void m1(){
}
//成员方法
private void m2() {
}
//关于匿名内部类
public static void test(CustomerService cs) {
cs.logout();
}
public static void main(String[] args){
//成员内部类创建对象
//创建外部类:方式一
TestInnerClass anonymous=new TestInnerClass();
TestInnerClass.TestMemberInnerClass member1=anonymous.new TestMemberInnerClass();
//创建外部类:方式二
TestMemberInnerClass member2=new TestInnerClass().new TestMemberInnerClass();
//传入的是一个接口
test(new CustomerService() {
//实现接口
public void logout() {
System.out.println("我已经成功退出");
}
});
}
class TestMemberInnerClass{ //成员内部类
//静态方法
//public static void m3(){}
//静态变量
//public static
//普通方法
public void m4(){
System.out.println(st1);
System.out.println(st2);
m1();
m2();
}
}
//关于匿名内部类
interface CustomerService{
void logout();
}
}