Java 内部类

在Java中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类。
内部类分为:

成员内部类:

定义:在一个类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。

说明:在成员内部类中,可以访问外部类的所有成员,包括成员变量和成员方法;在外部类中,通过创建内部类对象,可以访问成员内部类的变量和方法。
创建内部类对象的具体语法格式如下:

外部类名.内部类名 变量名 = new 外部类名().new 内部类名(); 

举例:

public class Outer
{
int num=10;
public static void main(String [] args)
{//成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。
Outer.Inner oi=new Outer().new Inner();//创建一个内部类对象,这种创建内部类对象方法可以不在Outer类中创建。但可以访问其以及内部类成员
oi.inMethod();
Outer ou=new Outer();
ou.outMethod();

}
public void outMethod()//定义外部类方法,访问内部类变量和方法
{
System.out.println("out");
//在外部类想要调用内部类的成员,必须要在外部类中的方法中创建内部类的对象,用对象调用成员。内部类相当于外部类的一个成员
Inner in=new Inner();
in.inMethod();

}
class Inner{//
int innum=12;
public void inMethod()
{
System.out.println(num);//可以使用外部类的属性
System.out.println("in");
//outMethod();//在内部类中调用外部类的方法

}
       }//

}

内部类与外部类区别:

内部类是可以直接访问外部类成员的,虽然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲了。在外部类中如果要访问成员内部类的成员,需要先创建内部类对象,通过对象调用的形式访问成员.

局部内部类(了解并不常用)

定义:

局部内部类,也叫做方法内部类,就是定义在某个局部范围中的类,它和局部变量一样,都是在方法中定义的,其有效范围只限于方法内部。
说明:

在局部内部类中,局部内部类可以访问外部类的所有成员变量和方法,而局部内部类中的变量和方法却只能在创建该局部内部类的方法中进行访问。
注意:

局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

静态内部类:(了解并不常用)

定义:

所谓静态内部类,就是使用static关键字修饰的成员内部类。
说明:

静态内部类在成员内部类前增加了static关键字,在功能上,静态内部类中只能访问外部类的静态成员,同时通过外部类访问静态内部类成员时,可以跳过外部类从而直接通过内部类访问静态内部类成员。

创建静态内部类对象的具体语法格式如下:

外部类名.静态内部类名 变量名 = new 外部类名.静态内部类名();

匿名内部类:(重点掌握)

定义:

匿名内部类其实就是没有名称的内部类。
说明:

在调用包含有接口类型参数的方法时,通常为了简化代码可以直接通过匿名内部类的形式传入一个接口类型参数,在匿名内部类中直接完成方法的实现。
注意:
从JDK 8开始,允许在局部内部类、匿名内部类中访问非final修饰的局部变量,而在JDK 8之前,局部变量前必须加final修饰符,否则程序编译报错。
创建匿名内部类对象的具体语法格式如下:

 new 父接口(){
        // 匿名内部类实现部分
    }

举例:

public Interface Animal//动物接口
{
void eat();//抽象方法
}
public class Dog implements Animal//狗类实现动物接口
   {//
public void eat()//重写方法
{
System.out.println("狗吃骨头");
 }

  }//
  
public class Master{
public void feed(Animal a)//传一个接口
{
a.eat();
}

}
public class Test//测试类
{
public static void main(String []args)
{
Master m=new Master();
m.feed(new Animal(){//本来应该传new Dog(),但这里运用匿名内部类new 父类名字或者接口的名字,所以按照这样写,需要实现接口中的方法.
public void eat()
{
System.out.println("狗吃骨头");
}

});
}

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值