`
zhenzhujeromemessage
  • 浏览: 16388 次
文章分类
社区版块
存档分类
最新评论

各内部类的修饰和各种访问形式

 
阅读更多

一:总结

A成员内部类:相当于类的成员1.修饰: 有private protected public final abstract等修饰。
但是成员内部类中,不能定义静态static成员
2.访问:(1)内部类调用外部类,访问外部类中与内部类同名的实例变量用 外部类名.this.变量名

若不同名可以直接访问。
(2) 从外部类内调用内部类:外部类的非静态方法访问成员内部类
public void outer_f3(){
Inner inner = new Inner();
inner.inner_f1();
}

外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一样
public static void outer_f4(){
// step1 建立外部类对象
Outer out = new Outer();
// step2 根据外部类对象建立内部类对象
Inner inner = out.new Inner();
// step3 访问内部类的方法
inner.inner_f1();
}
(3)在外部类外部访问内部类成员,与外部类的静态方法访问成员内部类一样


B静态内部类:相当于类的静态成员:1.修饰:静态内部类可以用public,protected,private修饰
静态内部类中可以定义静态或者非静态的成员
2.访问:(1)内部类调用外部类,静态内部类只能访问外部类的静态成员,
包括静态变量和静态方法
System.out.println("Outer.i"+i);
(2)外部类访问内部类的静态成员:内部类.静态成员
外部类访问内部类的非静态成员:实例化内部类即可
Inner inner = new Inner();
inner.inner_f2();
(3)在外部类外部方法静态内部类的对象可以直接生成:
Outer.Inner in=new Outer.Inner();
class Robot extends People implement Machine.
此时都有的run()不可直接实现。
用接口不能完全地实现多继承,用接口配合内部类才能实现真正的多继承。


C局部内部类:相当于类方法内的成员变量1.修饰: 没有修饰,class inner。
但其局部类中,不能定义静态static成员。
2.访问:(1)内部类调用外部类,有同名,外部类名.this.内部类变量名 访问的是外部类变量
若没同名的可以直接调用。
(2) 从外部类调用内部类: new Inner(k);写在该方法内。
(3)不可以在在外部类外直接访问内部类对象,只能调用方法,屏蔽了内部类。
D匿名内部类:
匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。
IA被定义为接口。
IA I=new IA(){};
匿名内部类的特点:
1,一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖。
2,只是为了获得一个对象实例,不许要知道其实际类型。
3,类名没有意义,也就是不需要使用到。
1.修饰:没有修饰,不能定义静态static成员
2.访问:(1)内部类调用外部类,有同名,外部类名.this.内部类变量名 访问的是外部类变量
若没同名的可以直接调用。
(2) 从外部类调用内部类: new Inner(k);写在该方法内。
(3)不可以在在外部类外直接访问内部类对象,只能调用方法,屏蔽了内部类。

二:参考详见:

内部类:

1,概述
内部类是指在一个外部类的内部再定义一个类。
内部类作为外部类的一个成员,并且依附于外部类而存在的。
内部类可为静态,可用PROTECTED和PRIVATE修饰。(而外部类不可以:外部类只能

使用PUBLIC和DEFAULT)。

2,分类
成员内部类、
局部内部类、
静态内部类、
匿名内部类(图形是要用到,必须掌握)。

3,使用方法

A,成员内部类:
作为外部类的一个成员存在,与外部类的属性、方法并列。

public class Outer {
private static int i = 1;
private int j = 10;
private int k = 20;
public static void outer_f1(){

}
public void outer_f2(){

}

// 成员内部类中,不能定义静态成员
// 成员内部类中,可以访问外部类的所有成员
class Inner{
// static int inner_i = 100;//内部类中不允许定义静态变量
int j=100; //内部类和外部类的实例变量可以共存
int inner_i = 1;
void inner_f1(){
System.out.println(i);
System.out.println(j);//在内部类中访问内部类自

己的变量直接用变量名
System.out.println(this.j);//或者用this.变量名
System.out.println(Outer.this.j);//在内部类中

访问外部类中与内部类同名的实例变量用 外部类名.this.变量名
System.out.println(k);//如果内部类中没有与外部

类同名的变量,则可以直接用变量名访问外部类变量
outer_f1();
outer_f2();

}
}
// 外部类的非静态方法访问成员内部类
public void outer_f3(){
Inner inner = new Inner();
inner.inner_f1();
}

//外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一


public static void outer_f4(){
// step1 建立外部类对象
Outer out = new Outer();
// step2 根据外部类对象建立内部类对象
Inner inner = out.new Inner();
// step3 访问内部类的方法
inner.inner_f1();
}

public static void main(String[] args) {
outer_f4();
}

}

成员内部类的优点:
⑴内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声

明为PRIVATE,但是对于处于其内部的内部类还是可见的。)
⑵用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的

private还要小的访问权限。
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。
对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现

outer.class和outer$inner.class两类。

注意:当Outer是一个private类时,外部类对于其外部访问是私有的,所以就无法

建立外部类对象,进而也无法建立内部类对象。


B,局部内部类
在方法中定义的内部类称为局部内部类。
与局部变量类似,在局部内部类前不加修饰符public和private,其范围为定义它的

代码块。

public class Outer {
private int s = 100;
private int out_i = 1;
public void f(final int k){
final int s = 200;
int i = 1;
final int j = 10;
class Inner{//定义在方法内部
int s = 300;//可以定义与外部类同名的变量
//static int m = 20;//不可以定义静态变量
Inner(int k){
inner_f(k);
}
int inner_i = 100;
void inner_f(int k){
System.out.println(out_i);//如果内部类

没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量
System.out.println(k);//可以访问外部类

的局部变量(即方法内的变量),但是变量必须是final的
// System.out.println(i);
System.out.println(s);//如果内部类中有

与外部类同名的变量,直接用变量名访问的是内部类的变量
System.out.println(this.s);//用this.变

量名 访问的也是内部类变量
System.out.println(Outer.this.s);//用

外部类名.this.内部类变量名 访问的是外部类变量
}
}
new Inner(k);
}

public static void main(String[] args) {
//访问局部内部类必须先有外部类对象
Outer out = new Outer();
out.f(3);
}

}

注意:
在类外不可直接生成局部内部类(保证局部内部类对外是不可见的)。
要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部

类。
通过内部类和接口达到一个强制的弱耦合,用局部内部类来实现接口,并在方法中返

回接口类型,使局部内部类不可见,屏蔽实现类的可见性。

C,静态内部类:(注意:前三种内部类与变量类似,所以可以对照参考变量)
静态内部类定义在类中,任何方法外,用static定义。

public class Outer {
private static int i = 1;
private int j = 10;
public static void outer_f1(){

}
public void outer_f2(){

}
// 静态内部类可以用public,protected,private修饰
// 静态内部类中可以定义静态或者非静态的成员
static class Inner{
static int inner_i = 100;
int inner_j = 200;
static void inner_f1(){
System.out.println("Outer.i"+i);//静态内部类只

能访问外部类的静态成员
outer_f1();//包括静态变量和静态方法
}
void inner_f2(){
// System.out.println("Outer.i"+j);//静态内部类不

能访问外部类的非静态成员
// outer_f2();//包括非静态变量和非静态方法
}


}

public void outer_f3(){
// 外部类访问内部类的静态成员:内部类.静态成员
System.out.println(Inner.inner_i);
Inner.inner_f1();
// 外部类访问内部类的非静态成员:实例化内部类即可
Inner inner = new Inner();
inner.inner_f2();

}
public static void main(String[] args) {
new Outer().outer_f3();
}

}


生成(new)一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区

别。静态内部类的对象可以直接生成:
Outer.Inner in=new Outer.Inner();
而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类。
静态内部类不可用private来进行定义。例子:
对于两个类,拥有相同的方法:
People
{
run();
}
Machine{
run();
}
此时有一个robot类:
class Robot extends People implement Machine.
此时run()不可直接实现。
注意:当类与接口(或者是接口与接口)发生方法命名冲突的时候,此时必须使用内

部类来实现。
用接口不能完全地实现多继承,用接口配合内部类才能实现真正的多继承。

D,匿名内部类
匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。
IA被定义为接口。
IA I=new IA(){};

匿名内部类的特点:

1,一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖。
2,只是为了获得一个对象实例,不许要知道其实际类型。
3,类名没有意义,也就是不需要使用到。

public class Outer {
private static int i = 1;
private int j = 10;
public static void outer_f1(){

}
public void outer_f2(){

}
// 静态内部类可以用public,protected,private修饰
// 静态内部类中可以定义静态或者非静态的成员
static class Inner{
static int inner_i = 100;
int inner_j = 200;
static void inner_f1(){
System.out.println("Outer.i"+i);//静态内部类只

能访问外部类的静态成员
outer_f1();//包括静态变量和静态方法
}
void inner_f2(){
// System.out.println("Outer.i"+j);//静态内部类不

能访问外部类的非静态成员
// outer_f2();//包括非静态变量和非静态方法
}
}

public void outer_f3(){
// 外部类访问内部类的静态成员:内部类.静态成员
System.out.println(Inner.inner_i);
Inner.inner_f1();
// 外部类访问内部类的非静态成员:实例化内部类即可
Inner inner = new Inner();
inner.inner_f2();

}
public static void main(String[] args) {
new Outer().outer_f3();
}

}

注:一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没

有类名,根据多态,我们使用其父类名。
因其为局部内部类,那么局部内部类的所有限制都对其生效。
匿名内部类是唯一一种无构造方法类。
大部分匿名内部类是用于接口回调用的。
匿名内部类在编译的时候由系统自动起名Out$1.class。
如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。
因匿名内部类无构造方法,所以其使用范围非常的有限。
当需要多个对象时使用局部内部类,因此局部内部类的应用相对比较多。匿名内部类

中不能定义构造方法。如果一个对象编译时的类型是接口,那么其运行的类型为实现

这个接口的类。
因匿名内部类无构造方法,所以其使用范围非常的有限。

分享到:
评论

相关推荐

    C#帮助文档

    protected 修饰符表示保护成员,该类内部和继承类中可以访问;public 修饰符表示公共成员,完全公开,没有访问限制;internal 修饰符表示在同一命名空间内可以访问。 2. ASP.NET 页面之间传递值的几种方式 在 ASP...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    11.3.3 protected:仅对子类和同包的类可见 300 11.3.4 默认控制符:仅在本包中可见 301 11.3.5 private:仅对本类可见 303 11.3.6 理解4个访问控制符 304 11.3.7 访问控制符可见性汇总 306 11.3.8 访问控制符...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    11.3.3 protected:仅对子类和同包的类可见 300 11.3.4 默认控制符:仅在本包中可见 301 11.3.5 private:仅对本类可见 303 11.3.6 理解4个访问控制符 304 11.3.7 访问控制符可见性汇总 306 11.3.8 访问控制符...

    疯狂JAVA讲义

    学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 使用内部类 208 学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在...

    java_oop_review

    •private =只能在类内部访问。封装。 •protected =可以在包内的任何位置访问。 继承不言自明•extended =允许子类从超类继承•super()=允许子类继承构造函数属性。 POLYMORPHISM利用继承,这将使我们能够创建...

    JAVA面试题最全集

    要掌握Collection相关的接口和类的使用 56.使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的destroy()方法有什么后果? 58.多线程,用什么关键字修饰同步方法?stop()和suspend()方法...

    突破程序员基本功的16课.part2

    2.1.1 实例变量和类变量的属性 2.1.2 实例变量的初始化时机 2.1.3 类变量的初始化时机 2.2 父类构造器 2.2.1 隐式调用和显式调用 2.2.2 访问子类对象的实例变量 2.2.3 调用被子类重写的方法 2.3 父子实例的...

    scala从入门到精通技术教学视频

    03.创建类和对象的简写形式 04.定义和访问成员变量 05.使用下划线初始化成员变量 06.定义和访问成员方法 07.访问权限修饰符 08.主构造器 09.辅助构造器 10.定义单例对象 11,在单例对象中定义方法 12.如何...

    java经典面试2010集锦100题(不看你后悔)

    C) 内部类的访问权限可以被定义为public、protected、private和default。普通类也可以定义上面四种访问权限,但是通常我们只应用public和default两种访问权限。 题目16:c 程序如下:  abstract class MineBase { ...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    5.6.6 为取值方法和赋值方法指定访问修饰符 160 5.6.7 属性作为虚字段使用 161 5.6.8 属性和方法调用不允许作为ref或out参数值使用 163 5.7 构造器 164 5.7.1 构造器的声明 164 5.7.2 默认...

    javaSE代码实例

    第6章 对象和类——Java世界的细胞 77 6.1 面向对象概述 77 6.1.1 面向对象程序设计思想的诞生 77 6.1.2 面向过程与面向对象思想的对比 78 6.1.3 面向对象技术的背景和特点 79 6.2 类的定义与对象的创建...

    java 面试题 总结

     final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的...

    C#中事件的定义和使用

    2.在类的内部利用event关键字声明事件,并且在类中定义调用事件的方法,也可以定义一个处理事件消息的方法。  声明一个事件的基本形式有两种:  修饰符 event 类型 标识符  修饰符 event 类型 标识符{get{...

    net学习笔记及其他代码应用

    protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一命名空间内可以访问。 2 .列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString,...

    新手学习C++入门资料

    输入和输出是通过C++类来实现的,cin和cout是这些类的实例,他们是在C++语言的外部实现。 在C++语言中,有了一种新的注释方法,就是‘//’,在该行//后的所有说明都被编译器认为是注释,这种注释不能换行。C++中...

    Java学习笔记(必看经典)

    Private表示该属性(方法)为只有本类内部可以访问(类内部可见)。 (想用private还要用set和get方法供其他方法调用,这样可以保证对属性的访问方式统一,并且便于维护访问权限以及属性数据合法性) 如果没有特殊...

    超级有影响力霸气的Java面试题大全文档

     final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    7.2 数据类型、对象、类和实例 301 7.2.1 类的起源 303 7.2.2 类的操作 303 7.2.3 术语 303 7.3 理解类 304 7.3.1 定义类 304 7.3.2 声明类的对象 305 7.3.3 访问类的数据成员 305 7.3.4 类的成员函数 307 ...

Global site tag (gtag.js) - Google Analytics