黑马程序员 JAVASE——内部类

----------- 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。
 ·只能创建匿名内部类的一个实例。
    ·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
 ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

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

---- ASP.Net+Android+IOS开发.Net培训、期待与您交流!--------详细请查看:http://edu.csdn.net------ 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值