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

黑马程序员-- 五、内部类

2014-01-12 17:40 316 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

内部类定义:

内部类是指在一个外部类的内部再定义一个类,内部类可作为外部类的一个成员,并且依附于外部类的一个成员。内部类可为静态,可用protected和private修饰,而外部类只能使用public 和缺省的的包默认访问权限。

为什么需要内部类

           典型的情况是,内部类继承自某个类或者实现某个接口,内部类的代码操作创建其的外围类的对象,所以你可以认为内部类提供啦某种进入其外围类的窗口,使用内部类最吸引人的原因是:每个内部类都能独立的继承自一个(接口的)实现,,所以无论外围是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的能力,一些设计与编程问题就很难解决,所以,从这个角度看,内部类使得多重继承的解决方案变得完整,接口解决啦部分问题,而内部类有效的实现啦“多重继承”。

java中根据位置的不同,内部类分为啦四种:

静态内部类:

1.使用static 修饰,声明在类体中。

2.静态内部类可以访问外部类的静态成员。

成员内部类:
 1.声明在类体中,不使用static,具有类的成员特征,也就是,必须具有类的实例才能创建内部类的实例。
 2.内部类实例可以访问共享外部类的成员变量(很常用)
特点:

 当内部类定义在外部类的成员位置上时,可以用成员修饰符修饰,遵循修饰符的规则,即具备成员的特性,又具备类的特性,可以继承和被继承。 

局部内部类

把类声明在方法中就是局部内部类,类似于局部变量。

特点:

定义在局部,不可以被成员修饰符修饰,遵循局部顺序调用规则,遵循局部生命周期,具备类的特性,可以继承和被继承。

访问规则:

访问规则:当访问局部的变量时,局变量必须被final修饰。因为局部内部类的成员比就不变量的生命周期长。

匿名内部类

1.匿名类,非常常见,可以写在任何地方,就像一般的语句。

2.语法更像是创建对象,Date d = new Date();

3.匿名类是对原类的一个继承,同时创建了实例,{}就是继承以后的类体,类体中可使用所有类的语法。

4.匿名类不能写构造器。

5.匿名类可以从抽象类或者接口继承,必须提供抽象方法的实现。

 

详解:

|---外部类访问规则:

1、 内部类可以直接访问外部类的成员,包括私有成员:(外部类.this.)成员,

|---内部类中有同名成员的情况:

|---调用内部类成员:this.成员。

|---调用外部同名成员:外部类.this.成员。

|---原理:内部类持有外部类的引用。

2、 外部类要访问内部类的非静态成员,必须建立内部类的对象才能访问。

|---原因:内部类成员被封装在类中,想要访问必须通过对象访问。

import org.junit.Test;

public class ClassDemo {

String s = "外部类成员";

class Inner{

String s = "内部类同名成员";

void show(){

<
4000
p>String s = "局部同名成员";
System.out.println(s);//此处调用的是局部的

System.out.println(this.s);//此处调用的是内部类的

System.out.println(ClassDemo.this.s);//访问外部类成员,省略ClassDemo.this

}

}

@Test

void test(){

new Inner().show();//访问内部类成员

}

}

|---外部其他类访问规则:

1、 当成员内部类非私有时,可以直接在外部其他类中直接建立对象使用。外部类.内部类 标识符 = new 外部类().new 内部类();

2、 当内部类访问外部其他类时,和普通一样需要建立外部其他类对象访问。

|---使用:当描述事物时,该事物的内部还有事物,内部的事物用内部类描述。

import org.junit.Test;

class Onter {

class Inner{

String s = "内部类成员";

void show(){

System.out.println(s);//此处调用的是局部的

}

}

}

public class ClassDemo{

@Test

public void test(){

System.out.println("外部其他类访问内部类成员");

new Onter().new Inner().show();//外部其他类访问内部类成员

}

}

注:内部类有静态成员,内部类也必须是静态的,遵循静态的规则,静态只能访问静态。局部内部类不具备成员特性,不能被成员修饰符修饰,所以局部内部类不能有静态成员。

 

|---匿名内部类:必须继承类或实现接口,匿名内部类实质是匿名子类的对象。

|---定义格式:new 父类(){定义子类内容}。

|--特点:同普通对象相同,可以赋值给父类引用,可以定义自己的方法并调用。

|---定义位置:常用于方法体中、方法实参处。

注:匿名内部类厂用于定义临时的功能,用过后销毁,所以通常不会给父类引用赋值,直接调用方法使用,所以定义的方法最好不超过三个。

|---源码示例:

import org.junit.Test;

public class  ClassDemo{

@Test

public void test(){

new Inner(){//匿名内部类继承内部类Inner

void show(){

System.out.println("匿名内部类重写的方法");

}

}.show();

new Onter(){//匿名内部类继承外部其他类Onter

}.show();

new Inter(){//匿名内部类实现内部接口

@Override

public void show() {

// TODO Auto-generated method stub

System.out.println("实现内部接口中的方法");

}

}.show();

inter(new Inter() {//调用方法,参数为匿名内部类

@Override

public void show() {

// TODO Auto-generated method stub

System.out.println("参数位置匿名内部类实现内部接口中的方法");

}

});

}

void inter(Inter in){

in.show();

}

class Inner{//内部类

void show(){

System.out.println("内部类");

}

}

interface Inter{

void show();

}

}

class Onter{//外部其他类

void show(){

System.out.println("外部其他类");

}

}

 

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