面向对象--------匿名内部类(三十)

一.匿名内部类的格式和理解

* A:匿名内部类
    * 就是内部类的简化写法。
* B:前提:存在一个类或者接口
    * 这里的类可以是具体类也可以是抽象类。
* C:格式:
        new 类名或者接口名(){
            重写方法;
        }
* D:本质是什么呢?
    * 是一个继承了该类或者实现了该接口的子类匿名对象。

非匿名内部类:

class Demo1_NoNameInnerClass {
	public static void main(String[] args) {
		Outer o = new Outer();
		o.method();
	}
}

interface Inter {
	public void print();
}

class Outer {
	class Inner implements Inter {
		public void print() {
			System.out.println("print");
		}
	}

	public void method(){
		Inner i = new Inner();
		i.print();
	}
}


匿名内部类:

class Demo1_NoNameInnerClass {
	public static void main(String[] args) {
		Outer o = new Outer();
		o.method();
	}
}

interface Inter {
	public void print();
}

class Outer {
	class Inner implements Inter {
		public void print() {
			System.out.println("print");
		}
	}

	public void method(){
		//Inner i = new Inner();
		//i.print();
		//new Inner().print();
		//Inter i = new Inner();			//父类引用指向子类对象
		
		new Inter() {						//实现Inter接口
			public void print() {			//重写抽象方法
				System.out.println("print");
			}
		}.print();
	}
}

二.匿名内部类重写多个方法调用

class Demo2_NoNameInnerClass {
	public static void main(String[] args) {
		Outer o = new Outer();
		o.method();
	}
}

interface Inter {
	public void show1();
	public void show2();
}
//匿名内部类只针对重写一个方法时候使用,弊端
class Outer {
	public void method() {
		/*new Inter(){
			public void show1() {
				System.out.println("show1");
			}

			public void show2() {
				System.out.println("show2");
			}
		}.show1();

		new Inter(){
			public void show1() {
				System.out.println("show1");
			}

			public void show2() {
				System.out.println("show2");
			}
		}.show2();*/

		Inter i = new Inter(){
			public void show1() {
				System.out.println("show1");
			}

			public void show2() {
				System.out.println("show2");
			}

			/*public void show3() {
				System.out.println("show3");
			}*/
		};

		i.show1();
		i.show2();
		//i.show3();	//匿名内部类是不能向下转型的,因为没有子类类名
	}
}

三.匿名内部类在开发中的应用

匿名内部类在开发中的应用------------当做参数传递

代码如下
        //这里写抽象类,接口都行
        abstract class Person {
            public abstract void show();
        }
    
        class PersonDemo {
            public void method(Person p) {
                p.show();
            }
        }
    
        class PersonTest {
            public static void main(String[] args) {
                //如何调用PersonDemo中的method方法呢?
                PersonDemo pd = new PersonDemo ();
                
            }
        }

 

非匿名内部类:

class Test1_NoNameInnerClass {
	public static void main(String[] args) {
		//如何调用PersonDemo中的method方法呢?
		PersonDemo pd = new PersonDemo ();
		pd.method(new Student());
	}
}
//这里写抽象类,接口都行
abstract class Person {
	public abstract void show();
}

class PersonDemo {
	
	public void method(Person p) {	//Person p = new Student();//父类引用指向子类对象
	p.show();
	
}

class Student extends Person {
	public void show() {
		System.out.println("show");
	}
}


匿名内部类:

class Test1_NoNameInnerClass {
	public static void main(String[] args) {
		//如何调用PersonDemo中的method方法呢?
		PersonDemo pd = new PersonDemo ();
		pd.method(new Person() {
			public void show() {
				System.out.println("show");
			}
		});
		
	}
}
//这里写抽象类,接口都行
abstract class Person {
	public abstract void show();
}

class PersonDemo {
	
	//public void method(Person p) {//Person p = new Student();//父类引用指向子类对象
	/*
	Person p = new Person(){
		public void show() {
			System.out.println("show");
		}
	};
	*/
	
}

class Test1_NoNameInnerClass {
	public static void main(String[] args) {
		//如何调用PersonDemo中的method方法呢?
		/*PersonDemo pd = new PersonDemo ();
		//pd.method(new Student());
		pd.method(new Person() {
			public void show() {
				System.out.println("show");
			}
		});*/

		PersonDemo pd = new PersonDemo();
		//第二种方案 : 匿名内部类的用法:作为参数传递
		pd.method(new MyInter(){
			public void show() {
				System.out.println("这是匿名内部类的show方法...");
			}
		});
		//pd.method(new MyInterImpl());  //Test1_NoNameInnerClass.java:13: 错误: Person是抽象的; 无法实例化
	}
}
//这里写抽象类,接口都行
abstract class Person {
	public abstract void show();
}

class PersonDemo {
	
	//public void method(Person p) {		//Person p = new Student();		//父类引用指向子类对象
	/*
	Person p = new Person(){
		public void show() {
			System.out.println("show");
		}
	};
	*/
	//当你看到一个方法的形式参数是一个类名的时候,这里其实需要的该类的对象
	//补充: 当你看到一个方法的形式参数是一个抽象类类名或者是接口名的时候,这里其实需要的是该抽象类的子类对象或者该接口的实现类对象
	public void method(MyInter p) {
		p.show();
	}
}

class Student extends Person {
	public void show() {
		System.out.println("show");
	}
}

interface MyInter
{
	public abstract void show();
}
//第一种方案
class MyInterImpl implements MyInter
{
	public void show() {
		System.out.println("这是实现类的show方法...");
	}
}

四.匿名内部类的面试题

面试题
        按照要求,补齐代码
        interface Inter { void show(); }
        class Outer {

               //补齐代码

       }
        class OuterDemo {
            public static void main(String[] args) {
                  Outer.method().show();
              }
        }
        要求在控制台输出”HelloWorld”

class Test2_NoNameInnerClass {
	public static void main(String[] args) {
		//Outer.method().show();//链式编程,每次调用方法后还能继续调用方法,证明调用方法返回的是对象
		Inter i = Outer.method();
		i.show();
	}
}
//按照要求,补齐代码
interface Inter { 
	void show(); 
}

class Outer { 
	//补齐代码 
	public static Inter method() {
		//有名字的子实现类 局部内部类
		class InterImpl implements Inter
		{
			public void show(){
				System.out.println("hello world!");
			}
		}
		return new InterImpl();
	}
}
/*
class Outer { 
	//补齐代码 
	public static Inter method() {
		return new Inter() {
			public void show() {
				System.out.println("show");
			}
		};
	}
}*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 面向对象思想是一种将问题抽象为对象,并通过对象的属性和行为来解决问题的思考方式。在Java中,面向对象的设计概念被广泛应用。面向对象的本质是对现实世界的对象进行建模操作,将问题中的实体抽象为对象,并通过定义类来描述对象的属性和行为。\[1\]在Java中,可以使用关键字static来修饰成员变量,使其具有共享的特性。static修饰的成员变量在类加载时就会被加载,并且被类的所有对象共享。\[2\]此外,在Java中还可以使用匿名内部类来创建一个继承了某个类或实现了某个接口的子类匿名对象。这种方式可以在需要使用某个类或接口的地方直接创建对象,并实现其方法。\[3\]总的来说,Java的面向对象特性使得程序开发更加灵活和可扩展,能够更好地解决实际问题。 #### 引用[.reference_title] - *1* [黑马程序员—Java之面向对象](https://blog.csdn.net/lwb0304/article/details/48224447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [黑马程序员--Java面向对象](https://blog.csdn.net/Sherlock_Li/article/details/48108513)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值