java day07 类的内部类,方法的内部类,匿名内部类

1 内部类

定义

一个类定义在另一个类里面,作为外部类的一个成员,
内部类可以被 private 修饰——当且仅当该类为内部类时

访问规则

1 内部类可直接访问外部类的所有类型成员

  • 访问格式 外部类名.this.成员名

2 外部类想访问内部类成员,需要在访问前先建立内部类的对象

3 不能在 外部类外 直接建立内部类的对象,因为内部类基于外部类的存在而存在

  • 在外部类访问内部类对象的格式
    外部类名.内部类名 内部类的对象=new 外部类名().内部类名()

4 当内部类中有 静态成员时,该内部类也必须是 静态 的

应用场景

  • 当某个类除了它的外部类,不再被其他的类使用时
  • 待续……

示例代码

class Outer
{
	private int num=4;
	public void method_out()
	{
		System.out.println("Hello Outer");
		//外部类访问内部类,先建立内部类对象
		Inner i=new Inner();
		i.function();
	}
	class Inner
	{
		int num=3;
		void function()
		{
			int num=2;
			//分别输出内部类方法中的变量值,内部类成员属性值,外部类成员属性值		
			System.out.println("Hello Inner "+"\nInner's function's num= "+num
								+"\nInner's num="+this.num
								+"\nOuter's num="+Outer.this.num);
		}
	}
}

class InsideClassDemo
{
	public static void main(String[] args) 
	{
		Outer out=new Outer();
		out.method_out();
		/*
		不能在外部类外直接建立内部类对象
		Inner i=new Inner(); 
		i.function();  x
		*/
	}
}

在这里插入图片描述

2 方法的内部类

修饰符与访问规则

内部类定义在方法内时,

  1. 仍然 可以直接访问外部类中的成员

  2. 不可以被成员修饰符修饰

  3. 不可以访问它所在的方法中的变量。只能访问被final修饰的常量。

示例代码

class Outer
{
	int x = 3;

	void method(final int a)
	{
		final int y = 4;
		class Inner
		{
			void function()
			{
				System.out.println(y+" "+a+" "+);
			}
		}
		new Inner().function();
	}
}
class  InnerClassDemo3
{
	public static void main(String[] args) 
	{
		Outer out = new Outer();
		out.method(7);
		out.method(8);
	}
}

在这里插入图片描述

(方法的)匿名内部类

前提

匿名内部类必须继承一个父类或者实现一个接口,**

说明

  • 匿名内部类是内部类的简写。

  • 因为有时候有的内部类bai只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适,而且也免去了给它取名字的烦恼。【1】

  • 匿名内部类不是抽象类

  • 在匿名内部类中需要
    -实现抽象函数或接口中的所有抽象方法,
    -或者重写普通类中的某些方法。

  • 方法中的内部类的访问规则仍遵循 方法的内部类 的规则

示例代码(重要)

代码中有两种适用匿名内部类的方式
*/

abstract class Demo
{
	abstract void show();
	Demo()
	{
		System.out.println("\nDemo:\nconstructor in abstract class");
	}
	void show1()
	{
		System.out.println("ordinary method in abstract class");
	}
}
class Demo2
{
	Demo2()
	{
		System.out.println("\nDemo2:\nconstructor in ordinary class");
	}
	public void show2()
	{
		System.out.println("ordinary method in ordinary class");
	}
}
class Outer1
{
	public void function()
	{
		final int num=3;
		System.out.print("Hello AnonymousInsideClass  1");

		new Demo()//Demo 是抽象类的名称
		{//体内也可以定义子类特有方法
			void show()
			{
				System.out.println("implement abstract method in abstract class");
				System.out.println("final variable in outer class:  "+num);
			}
			void show1()
			{
				System.out.println("override ordinary method in abstract class");
			}
		}.show1();//.后的方法名在{}中,调用Demo 成员
		new Demo2(){
			public void show2()
			{
				System.out.println("override method in ordinary class");
			}
		}.show2();
	}
}
 class Outer2
{
	public void function()
	{
		final int num=3;
		System.out.print("\nHello AnonymousInsideClass2!");
		Demo d=new Demo()
		{
			void show()
			{
				System.out.println("implement abstract method in abstract class");
			}		
		};
		d.show();
	}
}
class AnonymousInsideClassDemo 
{
	public static void main(String[] args) 
	{
		Outer1 o=new Outer1();
		Outer2 o2=new Outer2();
		o.function();
		o2.function();
	}
}

在这里插入图片描述

应用场景:

  • 线程创建【1】

//第一种
new Thread(){
public void run(){
//你想做的事情
};
}.start();
//第二种:
new Thread(new Runnable() {
public void run() {
//你想做的事情
};
}) {
}.start();
  • 待续……

参考文献

【1】Java匿名内部类怎样创建,有何作用和优点,创建线程怎样使用匿名内部类 nanwang21的回答

​​

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值