一般在编写代码时可能会遇到这样的场景——在某些时候,我需要定义很多个类,创建很多个对象,这样会使程序运行变慢。而且某个类只会使用这一次,或者是某个类的对象只会使用一次,为它们专门取名会显的很麻烦。为了应对这种情况,Java中允许使用匿名对象和匿名内部类的方式来解决这个问题。匿名创建那些只会用到一次的类或对象,在使用一次后jvm的中的垃圾回收器会自动回收。
匿名对象【重点】
匿名对象就是没有对象名的对象。
匿名对象只能使用一次,使用完后会被jvm的垃圾回收器从内存中清理掉。
如果一个程序中创建了多个对象,程序的运行会很慢,这时,如果有的对象在程序运行过程中只会使用一次,就可以使用匿名对象
匿名对象通常被作为方法的参数进行传递。
案例:
用匿名对象实现下面案例。
定义一个Boy男生类,定义一个Girl女生类,它们都拥有:String name。
要求:给男生类一个行为 :追求女生的行为:pursue(Girl g) 在pursue()中,输出女生的姓名
package com.woniuxy.oop2;
public class Boy {
private String name;
public Boy() {
}
public Boy(String name) {
this.name = name;
}
public void pursue(Girl g) {
System.out.println(this.name+"追的女孩叫"+g.getName());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.woniuxy.oop2;
public class Girl {
private String name;
public Girl() {
}
public Girl(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.woniuxy.oop2;
public class BoyGirlTest {
public static void main(String[] args) {
// 使用构造方法来给创建的两个匿名对象赋值
new Boy("小明").pursue(new Girl("小红"));
}
}
内部类
内部类就是在一个类中,再编写另一个类
内部类的种类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
使用内部类编写的代码,可读性很差,能不用尽量不用。其他的内部类简单了解,匿名内部类用的最多,最重要。
匿名内部类(重点)
没有名字的内部类,只能被使用一次
我们可以使用匿名内部类类创建子类
最终会创建接口的子类对象
不建议使用匿名内部类,为什么?
因为一个类没有名字,没有办法重复使用。另外代码太乱,可读性太差。
学习匿名内部类主要是让大家以后在阅读别人的代码时,能够看懂,理解。但并不代表以后要这样写,因为匿名内部类有两个缺点:
1.太复杂,太乱,代码可读性差。
2.类没有名字,以后想重复利用,不能用。
package com.woniuxy.oop3;
public interface Animal {
void eat();
}
package com.woniuxy.oop3;
public class Test {
public static void main(String[] args) {
/**
* 匿名内部类的创建语法
* new 父类/父接口{
* 方法重写
* }
* 如果一个子类只需要使用一次,建议使用匿名内部类创建
*/
/**
* 解读:
* 创建一个内部类会自动创建一个对象,
* 此处的dog为创建的内部类的对象名
* 大括号内的内容才是匿名内部类,属于Animal接口的一个子类
*/
Animal dog = new Animal() {
@Override
public void eat() {
System.out.println("狗喜欢吃骨头");
}
};
//匿名内部类的对象调用eat方法
dog.eat();
}
}