----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
Java内部类(Inner Class)
1)定义:一个类中(Outer)还包含着另外一个类(Inner),那么这个Inner就是Outer的内部类或者内置类。
2)动机:内部类可以让我们将逻辑上相关的一组类组织起来,并由外部类(outer class)来控制内部类的可见性。当我们建立一个inner class时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的this reference形成的,使得内部类对象可以随意的访问外部类中的成员。
3)使用场景:案例:如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类而心脏又在人体当中,正如同是内部类在外部内当中
4)代码案例:
a:内部类的基本结构:package lq.javatigao;
class Outer {//外部类
private String message = "hehe";
class Inner {//内部类
//private class Inner {私有的内部类
public void show() {
System.out.println(message);
}
}
}
public class Demo {
public static void main(String[] args) {
Outer out = new Outer();
Outer.Inner inner = out.new Inner();
inner.show();
/*
Outer.Inner inner = new Outer().new Inner();
inner.show();
*/
}
}
运行结果:hehe
小结:
内部类的好处:内部类可以随意访问外部类的成员变量(包括私有)而不用生成外部类的对象。
使用场景:如果不想对外提供方法来访问内部类,则可以把内部类定义为私有的,这样一来,只能在Outer对象里,来new Inner()的实例。
一般来说,内部类与外部类有附属关系。不希望别人随便来调用。例如:我的心脏只能由我的身体控制,其他人无法直接访问它。这种在开发里最常见
注意:Outer.Inner inner = new Outer().new Inner();这句话有两个小知识点:
1.左边的Outer是为了标明需要生成的内部类对象在哪个外部类当中,Outer.Inner为内部类的全称
2.右边说明必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变量
b: 内部类中的变量访问形式package lq.javatigao;
class Outer2 {
private String massage = "hehe";
class Inner {
private String massage = "haha";
public void show() {
String massage = "ouou";
System.out.println("局部变量:" + massage);
System.out.println("内部类变量:" + this.massage);
System.out.println("外部类变量:" + Outer2.this.massage);
}
}
}
public class Demo2 {
public static void main(String[] args) {
new Outer2().new Inner().show();
}
}
/*输出:
局部变量:ouou
内部类变量:haha
外部类变量:hehe
*/
小结:当局部变量与全局变量名字一致时,局部变量会覆盖全局的,所以要想访问方法以外的变量就要加上标记说明要访问哪一个.
这里的message就是方法的局部变量,而this.message就是指内部类Inner的。Outer.this.message则是外部类的。
Outer.this表示是外部类的。在a例中,缺省了Outer.this
c:局部内部类:
package lq.javatigao;
//外部类
class Outer {
private String message = "hehe";
public void show(){
final int num = 1;
//局部内部类
class Inner {
public void show() {
System.out.println("num="+num);
}
}
new Inner().show();
}
}
public class Demo {
public static void main(String[] args) {
new Outer().show();
}
}
// 输出:num=1
小结:在外部类的方法内部定义一个内部类,即为局部内部类。局部内部类在访问局部变量时或者传入方法的形参,变量要加上final修饰符。
问题:为什么要加上final修饰符呢?
转载自:http://blog.csdn.net/edisonlg/article/details/7183373
摘要:
局部变量的生命周期与局部内部类的对象的生命周期的不一致。局部变量当所处的函数执行结束后就已经死亡了,不存在了,但是局部内部类对象还可能一直存在(只要有人还引用该对象),这是就会出现了一个悲剧的结果,局部内部类对象访问一个已不存在的局部变量。
Java为了避免上述情况,才发明了该机制,偷偷地将局部变量的引用放在内部类对象的成员变量中。
二:匿名内部类:
匿名也就是没有名字。正因为没有名字,所以不能引用他,匿名内部类只能使用一次,它通常用来简化代码编写
定义匿名内部类的格式如下:
new 父类构造器(实参列表) | 实现接口()
{
//匿名内部类的类体部分
}
从上面定义可以看出,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口
代码示例:
package lq.javatigao;
abstract class Animal {
public abstract void say();
}
public class Demo3 {
public static void main(String[] args) {
new Animal() {
public void say() {
System.out.println("汪汪汪");
}
}.say();
}
}
//输出:汪汪汪
注意:在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。 因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块,
通过实例初始化块来完成构造器需要完成的事情。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
. 匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。因此不允许将匿名内部类
定义成抽象类。
---- ASP.Net+Android+IOS开发、.Net培训、期待与您交流!--------详细请查看:http://edu.csdn.net------