`
len-len
  • 浏览: 21949 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

内部类之成员内部类

    博客分类:
  • java
阅读更多

引子:最近几天一直在看内部类,虽然自己用了java将近2年了,但是基本很少使用过内部类,除了有一次在学习android的时候,写过一些外,基本是没有使用的。说实话,个人感觉内部类很是复杂,有时候就图方便,直接用普通的类去完成任务了,也没有去考虑使用内部类这个东西。但是用不用是一回事,学不学又是另外一回事,至少要掌握,说的小点,在笔试,面试什么的有帮助。说的大点,以后遇到需要使用,或者别人写的代码,就可以无压力对待了。

今天主要介绍下最基本的成员内部类。先看个demo。

public class Out {
	//内部类
	private int j = 0;
	private class Inner{
		public int i=1;
		public void f(){
			System.out.println(j);
		}
	}
	public Inner inner(){
		return new Inner();
	}
	public static void main(String[] args) {
		Out out =  new Out();
		out.j= 2;
		Out.Inner inner = out.inner();
		inner.f();
	}
}

 

  上面的例子是个很简单的内部类,Out是类(可以称为外部类),inner是内部类。我们把内部类定义作为类的一个成员的内部类称为“成员内部类”。

代码中我们看到我们使用 returnInner()这个方法去实例化了一个内部类对象,然后在main中去引用了这个对象。看似简单,但是疑问不少。疑问一:为什么要在一个方法体里面实例化内部类,直接实例化不行么?Out.Inner  inner = new Inner();;疑问二:为什么在main方面里面声明内部类要加上 Out.Inner,直接inner不行么?带着这些疑问我们在eclipse测试下。

 

	public static void main(String[] args) {
		Out out =  new Out();
		Out.Inner inner = new Inner();//error code
		System.out.println(inner.i);
	}

 

	public static void main(String[] args) {
		Out out =  new Out();
		Inner11 inner = out.inner();
		System.out.println(inner.i);
	}

  第一个测试报错了,显然,我们无法直接在一个静态的方法中去实例化内部类,必须要使用外部对象是实例化内部对象。

第二个测试正确了,说实话吧,《think  in java》第四版中文版中有这么一句话:如果想从外部类的非静态方法之外的任何位置创建某个内部类的对象,必要具体的指明 这个对象的类型 OutClassName.InnerClassName(《think in java》第四版中文版347页)。我开始以为这句话没问题,以为必须要加上OutClassName,可是我测试的结果是没有加上OutClassName并没有报错,所以我这里个人认为是否是书中翻译错误或者是我理解错误,请知道的高手帮忙解释下这句话。

那么我就只看第一个错误的原因,就是成员内部类的初始化必须是由外部类的对象去完成这个工作。所以在main方法里面创建一个Out对象,也正是这个Out对象建立起了内部类和外部类的联系,正是这种联系,所以在内部类中是可以使用外部类的任何东西,包括声明是private的内容,这也是为什么,内部类中f()打印的是2而不是0,因为内部类和外部类中间的联系是通过外部类的一个对象的引用,也就是out,所以内部类访问外部类的东西,其实是访问这个引用里面的东西。

最后说下this.和new.的用法,先介绍下.new,其实也很简单,就是在初始化的内部类的时候,直接使用new 关键字处理,Inner inner = out.new Inner()。this的话,是指在内部类中生成对外部类的引用,例如 Out.this就是引用了外部类。

请注意,这里所有的情况都是针对于成员内部类,至于其他的静态内部类,方法内部类,将会在后面的文章中讲到,东西不在乎多,在乎精,在乎理解成自己的东西,think in java厚厚的一本,加上是国人翻译的,如果不去理解的话,那些晦涩难懂的翻译会让你头疼的。

在前面的一篇文章中我们提到过,一个class一定会生成一个class文件,内部类也不例外,它也会生成一个Out$Inner.class的class文件。

内部类始终还是一个类,它也具有一些类的基本特性,这里先介绍到这里,下节介绍方法内部类。

3
1
分享到:
评论

相关推荐

    java 利用反射获取内部类静态成员变量的值操作.docx

    java 利用反射获取内部类静态成员变量的值操作.docx

    Java的内部类讲解案例代码(成员内部类、局部内部类、匿名内部类、静态内部类、外部类访问四种内部类、其他类访问四种内部类...)

    - 不同类型的内部类(静态内部类、成员内部类、局部内部类和匿名内部类)的区别和用法 - 内部类的优缺点以及使用场景 这些目标将帮助你理解和掌握内部类的概念,并能够在适当的时候使用内部类来解决问题...

    13.成员内部类(类种类).zip

    13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部...

    成员内部类

    该资源适合初学者。能够了解成员内部类的用法。

    java 成员内部类的使用规范

    java 成员内部类的使用规范 java 成员内部类的使用规范

    java 内部类使用(内部匿名类)

    java 成员内部类使用 内部匿名类 方法参数匿名类 方法匿名类

    内部类的分类及各自用法

    成员内部类、局部内部类、静态内部类、匿名内部类

    java 匿名内部类的使用规范

    java 匿名内部类的使用规范 java 匿名内部类的使用规范 java 匿名内部类的使用规范

    e语言-类的私有成员实现从外部访问

    可以直接用赋值的方式来修改,但易语言只有私有成员,无法直接用赋值的方式来改动私有成员的数据值,这个例程演示了如何把内部私有成员的数据地址跟外部变量的变量地址打通,从而间接实现从类外部修改内部私有成员的...

    编程语言-Java语言-关于内部类的分类和认识

    Java语言中的内部类根据定义的位置和访问权限可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类是定义在类的内部且与类的实例相关联的类;局部内部类是定义在方法或作用域内的类;匿名内部...

    JAVA语法总结 - 内部类

    内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。 几种内部类的共性: A、内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。 B、内部类不能...

    类的私有成员实现从外部访问

    利用自定义数据可以把单个的私有成员打包,然后将外部变量的地址指向类内部的私有成员数据地址,就可以实现修改外部变量的同时,类内部的私有成员数据也发生了变化。从而实现了类内部私有成员的数据可以直接操作的...

    Java 内部类

    Java 的使用 分别介绍了 成员内部类、方法内部类、静态内部类

    JAVA常用类与内部类

    1、成员内部类:定义在类中的类,属于类的成员,创建成员内部类对象必须依赖外部类对象。 2、静态内部类:定义在类中的类,class 关键字前加入 static 修饰符,创建静态内部类对象不需要外部类对象。 3、局部内部...

    java内部类的使用

    2)当我们建立一个inner class时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的this reference形成的,当内部类的成员方法中访问某个变量/方法时,如果在该方法和内部类中都没有定义过这个变量,...

    java(Day12)---内部类

    成员内部类 定义的位置:类中,方法以外 静态内部类 定义的位置:类中,方法以外 局部内部类 定义的位置:方法中 匿名内部类 定义的位置:值或实参中 1.2成员内部类 定义位置: 在类中方法以外 语法: 访问权限修饰符 ...

    day11 08 成员内部类的定义

    day11_08_成员内部类的定义

    day11 09 成员内部类的使用

    day11_09_成员内部类的使用

    几行代码带你彻底搞懂Java内部类

    内部类基本概述语法格式成员内部类局部内部类匿名内部类静态嵌套类静态嵌套类和非静态嵌套类的区别 内部类 基本概述 当一个类的定义放在另一个类的实体时,则该类叫做内部类,该类所在的类叫做外部类 在一个类体中...

    java内部类学习资料

    java内部类学习资料,包括成员内部类,匿名内部类,以及内部类代码,和内部类相关总结

Global site tag (gtag.js) - Google Analytics