一,匿名对象
1.什么是匿名对象以及匿名对象的使用环境
平常我们所实例化的对象可以重复使用,但是匿名对象,因为没有变量名所以只能使用一次,总的来说,匿名对象真实存在,但我们却无法明确的指出他来,所以他只能在创建之初使用一次。
使用环境:当我们想要通过一个对象仅仅调用一次某个方法时我们就可以使用匿名对象,局限性较大,用的不好就会造成代码量比不用还多的情况
2.格式(通过代码来看看使用正常对象和匿名对象之间的不同之处)
package it.cast.demo10; public class Rain { public void sos() { System.out.println("七月的风,八月的雨"); } } package it.cast.demo10; public class Test { public static void main(String[] args) { new Rain().sos(); //这是匿名后 Rain s=new Rain(); s.sos(); //这是没有使用匿名 } }
3.谈谈对于匿名对象的理解吧。。。
从上面代码可以看出一个匿名对象的格式是 : new 类名(),他只与我们正常实例化差一个变量名,其实在这个过程中,系统已经完成了在堆内存中对于这个对象的开辟,该对象在堆内存也有地址,指向这个对象,这点和正常对象是一样的,并且他们在堆内存中所拥有的内容也一样,所以他可以调用方法。
但是我们应该知道变量名是存在于栈内存中的,且这个变量名存储对象的地址,我们调用时也是通过这个地址在堆内存中找这个对象数据的,但是现在对于匿名对象来说他仅仅拥有地址,却没有存储他地址的变量,也就是说没有可以指向他堆内存的东西,所以他只能在出生时使用一次,也只有这次可以说清楚他的地址。(自己想的,可能有很大纰漏,但我觉得是有一定合理性的。。。。)
二.内部类
一.成员内部类
1. 定义:在一个类中,将另一个类定义在外部成员位置,另一个类就叫成员内部类
2.性质
1.可以使用成员修饰符
2.拥有类的特性,可以实现接口,继承
3.可以使用外部类成员,包括私有的成员
3.实例化公式
new 外部类名().new 内部类名().方法(参数)
4.成员内部类的同名变量调用(通过代码看吧。。)
public class Demo { private int a=6; class Demo1{ int a=7; public void function() { int a=8; System.out.println(a); System.out.println(this.a); System.out.println(Demo.this.a); //输出外部类的a } } } public class Test1 { public static void main(String[] args) { new Demo().new Demo1().function(); //调用内部类方法 } } 结果: 8 7 6
二.局部内部类
1.局部内部类定义
在一个外部类中,将一个类定义在其方法中,成为局部内部类
2.性质
1.同上
2.可以定义重名的局部内部类(把它看成局部变量就可以很好地理解了)
3.局部内部类的调用(通过代码来说明)
public class Outer { public void out() { class Inner{ public void inner() { System.out.println("局部内部类方法"); } } new Inner().inner(); } } public class Test { public static void main(String[] args) { new Outer().out(); } }
这块一定要注意我们需要实例化一下内部类,并且其位置是在类之外,方法之中。 理解的话。。。。我是把外层方法看做main方法了,对于这个局部内部类,他是存在于方法内部的,
且其位置是方法套方法这种,无法直接调用,所以需要先实例化一下。 然后其实外部方法里面的类都是没有实际意义的,因为他并不是真实存在的,只有实例化之后才能真正算作方法的内容。
三.匿名内部类
1.匿名内部类的定义
其实就是对于子类继承(接口实现)并且实例化的过程的一个简化。
2.使用条件
一定要有子类继承或者接口实现这种情况才可以使用匿名内部类
3.格式
new 父类类名(){
重写方法
};
4.实现过程(同样是用代码来实现)
public abstract class Men { public abstract void somking(); } public class Test { public static void main(String[] args) { new Men(){ public void somking() { System.out.println("我喜欢吸烟"); } public void eat() { System.out.println("我喜欢吃饭"); } }.somking();; } }
原文地址:https://www.cnblogs.com/roseneverdie/p/10124771.html