Java笔记——内部类
2014-10-19 21:09
302 查看
实例1:内部类的基本结构
程序编译过后会产生两个.class文件,分别是Out.class和Out$In.class。其中$代表了上面程序中Out.In中的那个。
Out.In in = new Out().new In()可以用来生成内部类的对象,这种方法存在两个小知识点需要注意:
1.开头的Out是为了标明需要生成的内部类对象在哪个外部类当中。
2.必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变量。
实例2:内部类中的变量访问形式
局部变量:14
内部类变量:13
外部类变量:12
从实例1中可以发现,内部类在没有同名成员变量和局部变量的情况下,内部类会直接访问外部类的成员变量,而无需指定Out.this.属性名,否则,内部类中的局部变量会覆盖外部类的成员变量。而访问内部类本身的成员变量可用this.属性名,访问外部类的成员变量需要使用Out.this.属性名。
实例3:静态内部类
可以看到,如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性。其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)。
实例4:私有内部类
如果一个内部类只希望被外部类中的方法操作,那么可以使用private声明内部类。上面的代码中,我们必须在Out类里面生成In类的对象进行操作,而无法再使用Out.In in = new Out().new In() 生成内部类的对象,也就是说,此时的内部类只有外部类可控制,如同是,我的心脏只能由我的身体控制,其他人无法直接访问它。
实例5:方法内部类
3
12
在上面的代码中,我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法。如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义,至于final在这里并没有特殊含义,只是一种表示形式而已。
//外部类 class Out { private int age = 12; //内部类 class In { public void print() { System.out.println(age); } } } public class Demo { public static void main(String[] args) { Out.In in = new Out().new In(); in.print(); //或者采用下种方式访问 /* Out out = new Out(); Out.In in = out.new In(); in.print(); */ } }运行结果:12
程序编译过后会产生两个.class文件,分别是Out.class和Out$In.class。其中$代表了上面程序中Out.In中的那个。
Out.In in = new Out().new In()可以用来生成内部类的对象,这种方法存在两个小知识点需要注意:
1.开头的Out是为了标明需要生成的内部类对象在哪个外部类当中。
2.必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变量。
实例2:内部类中的变量访问形式
class Out { private int age = 12; class In { private int age = 13; public void print() { int age = 14; System.out.println("局部变量:" + age); System.out.println("内部类变量:" + this.age); System.out.println("外部类变量:" + Out.this.age); } } } public class Demo { public static void main(String[] args) { Out.In in = new Out().new In(); in.print(); } }运行结果:
局部变量:14
内部类变量:13
外部类变量:12
从实例1中可以发现,内部类在没有同名成员变量和局部变量的情况下,内部类会直接访问外部类的成员变量,而无需指定Out.this.属性名,否则,内部类中的局部变量会覆盖外部类的成员变量。而访问内部类本身的成员变量可用this.属性名,访问外部类的成员变量需要使用Out.this.属性名。
实例3:静态内部类
class Out { private static int age = 12; static class In { public void print() { System.out.println(age); } } } public class Demo { public static void main(String[] args) { Out.In in = new Out.In(); in.print(); } }运行结果:12
可以看到,如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性。其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)。
实例4:私有内部类
class Out { private int age = 12; private class In { public void print() { System.out.println(age); } } public void outPrint() { new In().print(); } } public class Demo { public static void main(String[] args) { //此方法无效 /* Out.In in = new Out().new In(); in.print(); */ Out out = new Out(); out.outPrint(); } }运行结果:12
如果一个内部类只希望被外部类中的方法操作,那么可以使用private声明内部类。上面的代码中,我们必须在Out类里面生成In类的对象进行操作,而无法再使用Out.In in = new Out().new In() 生成内部类的对象,也就是说,此时的内部类只有外部类可控制,如同是,我的心脏只能由我的身体控制,其他人无法直接访问它。
实例5:方法内部类
class Out { private int age = 12; public void Print(final int x) { class In { public void inPrint() { System.out.println(x); System.out.println(age); } } new In().inPrint(); } } public class Demo { public static void main(String[] args) { Out out = new Out(); out.Print(3); } }运行结果:
3
12
在上面的代码中,我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法。如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义,至于final在这里并没有特殊含义,只是一种表示形式而已。
相关文章推荐
- thinking in java 笔记--内部类的规则inner class rules(2007.10.12)
- java学习笔记-内部类
- 【Java学习笔记】内部类
- 内部类之Java学习笔记
- Java学习笔记004——接口、克隆、回调、内部类
- java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释
- Java学习笔记——内部类及其调用方法
- [笔记][Java 4 android] [035~044] 内部类、线程和类集框架
- java笔记2(观察者模式、内部类、输入输出)
- Java笔记2 面向对象<5>内部类、静态内部类、内部类定义原则、匿名内部类、异常概述、RuntimeException
- 关于JAVA中 内部类的几点学习笔记
- 内部类定义在局部学习笔记InnerClassDemo3.java
- 内部类 - JAVA课堂笔记整理
- Java学习笔记(接口与内部类)
- C\C++ 程序员从零开始学习Android - 个人学习笔记(八) - java基础 - 继承、抽象类、接口、内部类(待续)
- 【Java】学习笔记——内部类
- java学习笔记——内部类
- 匿名内部类学习笔记InnerClassTest.java
- 《黑马程序员》java笔记->【03.1.1】匿名内部类
- JAVA笔记九(35-38 内部类、匿名内部类以及java的线程)