您的位置:首页 > 职场人生

黑马程序员 JAVASE——内部类

2013-11-04 20:38 246 查看
----------- 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
4000
= 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修饰符。
[b]问题:为什么要加上final修饰符呢?[/b]
转载自: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。

 ·只能创建匿名内部类的一个实例。
    ·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

 ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

    . 匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。因此不允许将匿名内部类

定义成抽象类。

---- ASP.Net+Android+IOS开发.Net培训、期待与您交流!--------详细请查看:http://edu.csdn.net------ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息