一、内部类
将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)
二、理解
当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容
如:
class Body//身体 { private class Heart//心脏 { //....... } }
三、特点
-
内部类编译后的文件名为:“外部类名$内部类名.class”
-
内部类可以直接访问外部类中的成员,包括private成员
-
外部类要访问内部类中的成员,必须要建立内部类的对象
-
示例
class Outer { int x = 5; class Inner//内部类,可以private { void function() { //可以访问外部类的 x 因为内部类中持有了一个外部类的引用,格式:外部类名.this System.out.println("inner :"+x);//这里的x相当于Outer.this.x } } void method() { //建立内部类对象才能调用内部类方法 Inner in = new Inner(); in.function(); } } class InnerDemo { public static void main(String[] args) { Outer out = new Outer(); out.method(); } }
四、当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中直接建立内部类对象
格式:外部类名.内部类名 变量名 = 外部类对象.内部类对象
如:
class InnerDemo { public static void main(String[] args) { Outer.Inner in = new Outer().new Inner(); in.function(); /* 或者可以这样写 Outer out = new Outer(); out.new Inner().function(); */ } }//但是这种应用不多见,因为内部类之所以定义在内部就是为了封装。
想要获取内部类对象通常都通过外部类的方法来获取。这样可以对内部类对象进行控制。
五、内部类在成员位置上时
- 可以被成员修饰符所修饰如:private static
- private:将内部类在外部类中进行封装
- static:内部类具备了static的特性
- 当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限
- 在外部其他类中,如何直接访问static内部类的非静态成员呢? new Outer.Inner().function();
- 注意: 当内部类中定义了静态成员,该内部类必须是static的
class Outer { private static int x = 3; static class Inner1//静态内部类 { void function() { System.out.println("inner:"+x); } } static class Inner2 { static void function() { System.out.println("inner:"+x); } } } class InnerClassDemo { public static void main(String[] args) { new Outer.Inner1().function(); Outer.Inner2.function(); } }
六、内部类定义在局部
- 不可以被成员修饰符修饰
- 可以直接访问外部类中的成员,因为还持有外部类中的引用。
- 但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量
class Outer { int x = 3; void method() { final int x = 7; class Inner//不能被static等修饰 { void function() { System.out.println(Outer.this.x); System.out.println(x); } } new Inner().function(); } } class Test { public static void main(String[] args) { new Outer().method(); } }//结果是:3 7
七、匿名内部类
- 匿名内部类其实就是内部类的简写格式
- 定义匿名内部类的前提: 内部类必须是继承一个类或者实现接口
- 匿名内部类的格式: new 父类或者接口(){定义子类的内容}
- 其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖
- 示例:
abstract class AbsDemo { abstract void show(); } class Outer { int x=3; void method() { new AbsDemo()//匿名内部类 { void show() { System.out.println("x="+x); } }.show();//调用匿名内部类的方法 } } class InnerClass { //主函数 public static void main(String[] args) { new Outer().method(); } } 编译会生成的文件: InnerClass.class Outer$1.class Outer.class AbsDemo.class
6.也可以给匿名内部类取名字
AbsDemo d = new AbsDemo() { void show() { System.out.println("x=="+x); } void abc() { System.out.println("haha"); } }; d.show(); //d.abc();编译失败,所以匿名内部类不要定义特有方法,用不上
匿名内部类的方法最好不要超过3个,要不然程序就没有可读性
相关推荐
JAVA_12内部类
MLDN魔乐JAVA_12内部类.rar
12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类...
1.接口-简介 2.接口-作用 3.接口-定义方式 4.接口-实现 5.接口-与抽象类之区别 6.接口-应用示例(设计模式...内部类-局部内部类 12.内部类-匿名内部类 13.内部类-静态内部类 14.综述
从零开始学JAVA第12章_内部类.ppt
成员内部类 定义的位置:类中,方法以外 静态内部类 定义的位置:类中,方法以外 局部内部类 定义的位置:方法中 匿名内部类 定义的位置:值或实参中 1.2成员内部类 定义位置: 在类中方法以外 语法: 访问权限修饰符 ...
day11_12_局部内部类的final问题
作为刚入门Java的小白,这两天看到内部类,这里做一个总结,若有错误,欢迎指正~ 内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹相同。 内部类分为: 成员内部类、局部内部类、静态嵌套类、...
JAVA基础——Java内部类.ppt
定义一个复数类 complex ,它的内部具有两个实例变量:realPart和imagPart,分别代表复数的实部和虚 部,编程实现要求的数学运算。 (1)实现两个复数相加。复数加运算的原则是:复数的实部和虚部分别相加。 (2...
java面向对象程序设计第2版第6章内部类与异常类.ppt
[精选]会计继续教育12年企业内部控制基本规范讲解10.pptx
本课程从零开始,以通俗易懂的方式讲解Java技术,手把手教你掌握每一个知识点。 真正做到零基础入门学习...9.成员内部类、局部内部类、静态内部类、匿名内部类 教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!
lec12企业外包业务内部控制.pptx
innerbuilder, 生成内部生成器类的IntelliJ IDEA 插件 innerbuilder 在生成菜单中添加一个'生成器'操作的 IntelliJ IDEA 插件插件,它生成内部生成器类,如 Effective Java 中所述。 使用 IntelliJ IDEA 12. x, 13. ...
Windows之父Jim Allchin曾经说过不要满足于只知道How-to、小技巧之类的知识,而是应该深入底层了解其内部原理。只有了解了这些安全特性的内在原理,才能真正了解Windows Vista是怎样精心替我们解决安全问题的,才能...
3.16内部类 26 3.17匿名类 27 3.18二维数组和对象数组 28 3.19其他注意事项 28 Java SE核心I 30 4.1 Object类 30 4.2 String类 31 4.3 StringUtils类 33 4.4 StringBuilder类 33 4.5正则表达式 34 4.6 Date类 35 4.7...
财务管理第12章内部控制评审(二).pptx
内部审计实务标准修订实务公告(doc 12).docx
常用类 内部类、Object、包装类、String chp11.集合框架 Collection、List、Set、Map的接口及其实现类、迭代、Hash 算法与 hashCode 方法、comparable、泛型 chp12.异常 概念、分类、产生、传递、处理、自定义异常 ...