内部类

8.6内部类
在Java中,还可以在类的内部定义类。这种在类,的内部定义的类,称为内部类。
内部类所在的类称为外部类
特点:
(1)独立的一个Class文件
(2)同样需要编译
(3)同样可以产生对象

局部内部类特例: 匿名内部类.
局部内部类,同样跟局部变量一样,不能添加访问修饰符,
局部内部类,无法被方法外部访问
局部内部类,内部无法访问外部类的成员,(此时的this.代表的是局部内部类的实例)

成员内部类特例: 静态内部类
成员内部类的地位:等同于全局变量的地位
成员内部类,内部可以使用外部类所定义的所有的成员(成员变量,成员方法)

兄弟类:访问修饰符:只能是默认
还可以用final来修饰

java文件如果内部包含了多个类,产生类文件的特点:
1,java文件中,包含几个类,就对应的产生几个相应的类文件
2, java文件的名称,不一定和类文件的名称保持一样,
兄弟类,类文件的命名规则就是“兄弟类.class”
成员内部类,类文件的命名规则就是”外部类 .class, 内 部 类 . c l a s s ” 局 部 内 部 类 , 类 文 件 的 命 名 规 则 就 是 ” 外 部 类 内部类出现的次数+内部类.class”
3,1个java文件,只允许出现一个外部public修饰的外部类,
其他的而外部类都是 default
Java中的内部类可以分为四种分别是:
(1)静态内部类、
(2)成员内部类、
(3)局部内部类、
(4)匿名内部类。

类型 说明
静态内部类 作为类的静态成员,存在于某个类的内部
成员内部类 作为类的成员,存在于某个类的内部
局部内部类 存在于某个方法内部的类
匿名内部类 存在于某个类的内部,但是无类名的类

(#)兄弟类:↓

8.6.1静态内部类

静态内部类虽然是外部类的成员,但是在未创建外部类的对象的情况下,
可以直接创建静态内部类的对象。
此外,静态内部类可以引用外部类的静态成员变量和静态方法,
但是不能引用外部类的普通成员。
静态内部类的定义方法如下:
class Outer {
static class Inner {
}
}
8.6.2成员内部类
class Outer {
class Inner {
}
}
27: /* 代码清单8.15 InnerDemo.java
演示成员内部类的使用
*/

public class InnerDemo {
static int a = 10; //
int b = 20;
void f() {
System.out.println(“我在成员方法f()中”);
}

class Inner { //定义一个成员内部类
int c = 30;
public void g() {
b = 100; //调用 Outer类的普通成员变量
f(); //调用Outer类的方法f()
System.out.println(a+” ” +c); //调用Outer类的静态成员变量
}
}

public static void main(String[] args) {
InnerDemo out = new InnerDemo (); //实例化一个InnerDemo类的对象
Inner in = out.new Inner(); //Inner类的对象通过外部类的对象创建
in.g();
System.out.println(out.b);
}
}

8.6.3局部内部类
局部内部类是在类的方法内部定义的类。
局部内部类只能在方法内部中使用。
一旦方法执行完毕,局部内部类就会从内存中被清除。

21: /*代码清单8.16 LocalDemo.java
演示局部内部类的使用
*/

public class LocalDemo {
int a = 10;
void f() {
class Inner {
int b = 20;
void g() {
System.out.println(a);
System.out.println(b);
}
}
Inner in = new Inner();
in.g();
}

public static void main(String[] args) {
LocalDemo local = new LocalDemo();
local.f();
}
}

8.6.4匿名内部类
匿名内部类是为唯一对象而定义的类。

new后面是一个类或者接口
大括号中是匿名内部类的主体,这个主体就是类或者接口的实现。
如果是类,那么匿名内部类是该类的子类。
如果是接口,匿名内部类需要完成对接口的实现。
new 类或者接口的名字() {
//匿名内部类的主体
}

24: 25: 26: /*代码清单8.17 NoNameDemo.java
演示匿名内部类的使用
*/
class Person {
public void show(Message msg) {
msg.show();
}
}

class Message {
public void show(){
System.out.println(“在成员内部类中”);
}
}

public class NoNameDemo {
public static void main(String[] args) {
Person p = new Person();
p.show(new Message(){
public void show(){
System.out.println(“在匿名内部类中”);
}
}
);
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值