Java——匿名内部类

博客主要介绍了匿名内部类,它是内部类的简化写法。前提是内部类可继承或实现外部类、接口,格式为 new 外部类名或接口名并覆盖代码。还提到匿名内部类是带内容的子类匿名对象,且定义方法最好不超3个,最后给出改写示例及测试题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

匿名内部类:

  • 就是内部类的简化写法。
  • 前提:

          • 内部类可以继承或实现一个外部类或者接口。

  • 格式为:

        • new 外部类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容)}

  • 简单理解:

        • 就是建立一个建立一个带内容的外部类或者接口的子类匿名对象。

 

匿名内部类:

1,匿名内部类其实就是内部类的简写格式。

2,定义匿名内部类的前提: 内部类必须是继承一个类或者实现接口。

3,匿名内部类的格式:new 父类或者接口(){定义子类的内容}

4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。 可以理解为带内容的对象。

5,匿名内部类中定义的方法最好不要超过3个。

类型1:

//1.内部类,继承父类
class Father
{
	public void show()
	{
		System.out.println("Father::show()");
	}
}
class Outer
{
	class Inner extends Father
	{
		public void show()
		{
			System.out.println("Inner::show()");
		}
		public void sleep()
		{
			System.out.println("Inner::sleep()");
		}
	}

}
public class TestDemo0
{
	public static void main(String[] args)
	{
		new Outer().new Inner().show();
		new Outer().new Inner().sleep();
	}
}
/*
Inner::show()
Inner::sleep()
*/

 

 改写成匿名内部类:

//1.改写成匿名内部类
class Father
{
	public void show()
	{
		System.out.println("Father::show()");
	}
}
class Outer
{
	public void function()
	{
		Father f = new Father()
		{
			public void show()
			{
				System.out.println("Inner::show()");
			}
			public void sleep()
			{
				System.out.println("Inner::show()");
			}
		};
		f.show();
//		f.sleep();//Father类中不存在sleep()
	}
}
public class TestDemo0
{
	public static void main(String[] args)
	{
		new Outer().function();
	}
}
/*
Inner::show()
*/

类型2:

//2.静态内部类,继承父类
class Father
{
	public void show()
	{
		System.out.println("Father::show()");
	}
}
class Outer
{
	static class Inner extends Father
	{
		public void show()
		{
			System.out.println("Inner::show()");
		}
		public void sleep()
		{
			System.out.println("Inner::sleep()");
		}
	}
}
public class TestDemo0
{
	public static void main(String[] args)
	{
		new Outer.Inner().show();
		new Outer.Inner().sleep();
	}
}
/*
Inner::show()
Inner::sleep() 
 */

改成匿名内部类:

class Father
{
	public void show()
	{
		System.out.println("Father::show()");
	}
}
class Outer
{
	public static void function()
	{
		Father f = new Father()
		{
			public void show()
			{
				System.out.println("Inner::show()");
			}
			public void sleep()
			{
				System.out.println("Inner::sleep()");
			}
		};
		f.show();
//		f.sleep();//Father类中不存在sleep()
	}
}
public class TestDemo0
{
	public static void main(String[] args)
	{

		Outer.function();
	}
}
//Inner::show()

类型3:

//3.静态内部中有静态方法,继承父类
class Father//一般类不能定义为静态类,只有内部类可以定义为静态类
{//只能在静态类型或者顶级类型中才能声明静态方法
	public static void show()//show()处在顶级类型中
	{
		System.out.println("Father::show()");
	}
}
class Outer
{
	static class Inner extends Father
	{
		public static void show()
		{
			System.out.println("Inner::show()");
		}
		public static void sleep()
		{
			System.out.println("Inner::show()");
		}
	}	
}
public class TestDemo0
{
	public static void main(String[] args)
	{
		Outer.Inner.show();
		Outer.Inner.sleep();
	}
}
/*
Inner::show()
Inner::sleep()
*/

改成匿名内部类:

class Father//一般类不能定义为静态类,只有内部类可以定义为静态类
{//只能在静态类型或者顶级类型中才能声明静态方法
	public static void show()//show()处在顶级类型中
	{
		System.out.println("Father::show()");
	}
}
class Outer
{	
	public static void function()
	{
		Father f = new Father()//Father类不能声明为静态类,所以其内不能存在静态方法
		{
			public static void show()//此静态方法不能隐藏Father中的实例方法
			{//只能在静态类型或者顶级类型中才能声明静态方法
				System.out.println("Inner::show()");
			}
			public static void sleep()
			{//只能在静态类型或者顶级类型中才能声明静态方法
				System.out.println("Inner::show()");
			}
		};
		f.show();
//		f.sleep();//Father类中不存在sleep()
	}
}
public class TestDemo0
{
	public static void main(String[] args)
	{
		Outer.function();
	}
}
/*
 不能转换为匿名内类,只能在静态类型或者顶级类型中才能声明静态方法。
匿名类Father不是静态类,所以其内不能定义静态方法。
 */

类型4.

//4.内部类,继承接口
abstract class Abstract
{
	void show() {};
}

class Outer
{
	class Inner extends Abstract
	{
		public void show()
		{
			System.out.println("Inner::show()");
		}
		public void sleep()
		{
			System.out.println("Inner::sleep()");
		}
	}
}

class  TestDemo0
{
	public static void main(String[] args) 
	{
		new Outer().new Inner().show();
		new Outer().new Inner().sleep();
	}
}
/*
 Inner::show()
Inner::sleep()
 */

转换为内部类:

abstract class Abstract
{
	void show() {};
}

class Outer
{
	public void function()
	{
		Abstract ab = new Abstract()
		{
			public void show()
			{
				System.out.println("Inner::show()");
			}
			public void sleep()
			{
				System.out.println("Inner::sleep()");
			}
		};
		ab.show();
//		ab.sleep();
	}
}

class  TestDemo0
{
	public static void main(String[] args) 
	{
		new Outer().function();
	}
}
//Inner::show()

类型5:

interface Abstract
{
	public abstract void show();
}
class Outer
{
	class Inner implements Abstract
	{
		public void show()
		{
			System.out.println("Inner show()");
		}
		public void sleep()
		{
			System.out.println("Inner sleep()");
		}
	}
}

public class TestDemo0
{
	public static void main(String[] args)
	{
		new Outer().new Inner().show();
		new Outer().new Inner().sleep();
	}
}
//Inner show()
//Inner sleep()

转换为匿名类:

interface Abstract
{
	public abstract void show();
}
class Outer
{
	public void function()
	{
		Abstract ab = new Abstract()
		{
			public void show()
			{
				System.out.println("Innre show()");
			}
			public void sleep()
			{
				System.out.println("Innre sleep()");
			}
		};
		ab.show();
//		ab.sleep();
	}
}

public class TestDemo0
{
	public static void main(String[] args)
	{
		new Outer().function();
	}
}
//Inner show()

 

类型6:

interface Abstract
{
	public abstract void show();
}
class Outer
{
	static class Inner implements Abstract
	{
		public void show()
		{
			System.out.println("Inner show()");
		}
	}
	static Inner function()
	{
		return new Inner();
	}
}

public class TestDemo0
{
	public static void main(String[] args)
	{
		Outer.function().show();
	}
}
//Inner show()

转换为匿名类:

interface Abstract
{
	public abstract void show();
}
class Outer
{
	static Abstract function()
	{
		return new Abstract()
				{
					public void show()
					{
						System.out.println("Inner show()");
					}
				};
	}
}

public class TestDemo0
{
	public static void main(String[] args)
	{
		Outer.function().show();
	}
}
//Inner show()

 

测试题:通过匿名类补足代码

interface Inter
{
    void method();
}
class Test
{
    //补足代码,通过匿名内部类
}
class InnerClassTest
{
    public static void mian(String[] args)
    {
        Test.function().method();
    }
}

参考答案及分析:

interface Inter
{
    void method();
}
class Test
{
    //补足代码,通过匿名内部类
    /*
    //内部类方法实现
    static class Inner implements Inter
    {
        public void method()
        {
            System.out.println("method run");
        }
    }
    static Inter function()
    {
        return new Inner();
    }
    */
    //使用匿名内部类来实现
    static Inter function()
    {
        return new Inter()
        {
            public void method()
            {
                System.out.println("method run");
            }
        };
    }
}
class InnerClassTest
{
    public static void mian(String[] args)
    {
        //Test.function():Test类中有一个静态的方法function()
        //.method():function这个方法运算后的结果是一个对象,而是一个Inter类型的对象
        //因为只有是Inter类型的对象,才可以调用method方法。
        //Inter in = Test.function();
        //in.method();
        Test.function().method();
        
 /*       
        show(new Inter()
        {
			public void method()
			{
				System.out.println("method show run");
			}
		});

	}
	public static void show(Inter in)
	{
		in.method();
	}
 */
 
}
/*
method run
*/

 

### Java匿名内部类的用法和特性 #### 创建方式与基本概念 在Java中,匿名内部类是指一种没有名称的内部类,在创建对象的同时定义该类。这种机制允许程序员快速实现接口或扩展抽象类而不必事先声明完整的类[^3]。 #### 特性概述 - **无显式名字**:由于其特殊性质,此类无法被直接引用。 - **单次使用**:适合仅需一次性使用的场合。 - **简化编码**:减少了不必要的命名负担,使代码更加简洁紧凑[^1]。 #### 实现形式 可以基于已有的类或者接口来构建匿名内部类: ##### 基于已有类的情况 当希望从某个具体类派生新功能而又不想正式定义子类时,可以选择这种方式。下面的例子展示了如何利用匿名内部类继承`Person`抽象类并覆盖其中的方法: ```java abstract class Person { String name; Person(String name) { this.name = name; } abstract void introduce(); } public class Example { public static void main(String[] args) { // 使用匿名内部类继承抽象类并提供构造函数参数 Person person = new Person("John Doe") { @Override void introduce() { System.out.println("Hello, my name is " + name); } }; // 调用匿名内部类的方法 person.introduce(); } } ``` 此段程序会打印出:“Hello, my name is John Doe”。这里的关键在于通过`new Person()`语句不仅实例化了一个新的对象,同时也定义了这个对象所属的独特类型——即所谓的“匿名内部类[^4]。 ##### 针对接口的情形 对于那些只需要部分成员变量或方法的不同版本而言,采用匿名内部类可以直接针对所需修改的部分进行定制,无需额外建立整个独立的新类文件。比如要让某个组件响应特定事件,则可以通过如下方式轻松达成目的: ```java button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Button clicked!"); } }); ``` 上述片段中的`ActionListener`是一个监听器接口;借助于此种模式可以在不增加复杂度的前提下灵活处理各种交互逻辑[^5]。 #### 应用场景分析 - 当需要临时性的行为改变而不需要长期保存相应类型的定义时; - 对象只会在一处地方创建并且立即使用的情况下更为合适; - 减少因频繁创建小型辅助类所带来的维护成本及潜在混乱。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值