什么是内部类

内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类

为什么要使用内部类

①内部类提供了更好的封装,除了该外围类,同一个包下的其他类都不能访问

②内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体

③内部类可以对同一个包中的其他类隐藏起来,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以

④可以实现多继承

⑤当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷

内部类特性

①内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号

②内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量

③外部类不能直接访问内部类的的成员,但可以通过内部类对象来访问

④内部类可以自由地访问外部类的成员变量,无论是否是private的

⑤因为当某个外围类的对象创建内部类的对象时,此内部类会捕获一个隐式引用

实现多重继承

class Eat {
public void eat() {
System.out.println("eat()");
}
} class Drink {
public void drink() {
System.out.println("drink()");
}
} public class MutiExtend {
private EatExtra eat = null;
private DrinkExtra drink = null; MutiExtend() {
eat = new EatExtra();
drink = new DrinkExtra();
} public void drink() {
drink.drink();
System.out.println("drinkExtra()");
} public void eat() {
eat.eat();
System.out.println("eatExtra()");
} private class EatExtra extends Eat { // inner class can not have static declaration
// static int age;
// allowed,因为在compile阶段就已经确定了
static final int name = 123;
@Override
public void eat() {
super.eat();
}
} private class DrinkExtra extends Drink {
@Override
public void drink() {
super.drink();
}
}
}

注意事项

①内部类不能定义静态成员变量和方法

②内部类访问外部类实例用: 外部类名.this.变量名

③创建内部类: outerClassInstane.new InnerClass()

局部内部类

①不能范围该方法的非final局部变量

②不可以定义静态变量

静态内部类

①要创建嵌套类的对象,并不需要其外围类的对象

一种比较好的用法

public class AuthModule {

//    private static int SUCCESS = 200;
// private static int FAIL = 400; // 比这种实现要好很多吧,但是只限于是该类的状态,这样可以有命名空间Status
private static class Status {
private static int SUCCESS = 200;
private static int FAIL = 400;
} public void doSomething() {
System.out.println(Status.SUCCESS);
System.out.println(Status.SUCCESS);
}
}

最新文章

  1. BZOJ4539: [Hnoi2016]树
  2. Mysql数据库主从心得整理
  3. javascript 变量提前
  4. Java hashCode() 和 equals()的若干问题
  5. GOICE项目初探
  6. 工作中遇到的问题--JPA 一对多查询
  7. 配置DNS
  8. qemu 模拟-arm-mini2440开发板-启动u-boot,kernel和nfs文件系统
  9. Angularjs 通过WebApi 下载excel
  10. 大数据架构师基础:hadoop家族,Cloudera产品系列等各种技术
  11. Node.js小Httpserver
  12. ActionScript通用开发框架
  13. python3中的编码与解码用法
  14. 【原】无脑操作:IDEA + maven + SpringBoot + JPA + EasyUI实现CRUD及分页
  15. 深入理解group by 语句的执行顺序 from→where→group by→select(含聚合函数)
  16. webpack学习笔记 (二) html-webpack-plugin使用
  17. mysql异常 : The driver has not received any packets from the server.
  18. Django之admin中管理models中的表格
  19. kali linux 更新问题
  20. Spring MVC 的国际化和本地化

热门文章

  1. android 5.0新特性学习--视图阴影
  2. QQ的邮我功能
  3. js_设置光标到文本的最后位置
  4. Android中的自定义Adapter(继承自BaseAdapter)——与系统Adapter的调用方法一致——含ViewHolder显示效率的优化(转)
  5. BootStrap中关于input-group的问题(未解决)
  6. 关于flex4 list 高度适应内容
  7. JS查找和替换字符串列子
  8. Android代码资源的国际化
  9. rm link
  10. .net remoting 实现通用消息处理窗口