一.匿名对象和匿名对象类
堆中存放具体数据 栈中存放你所命名的变量名字
既然叫匿名函数 自然没有名字 所以这就是在堆里有具体数据 而栈中没有名字指向这个数据
A a = new A();
//1.a存放在栈上,new A()产生的对象在堆上
//2.a存放的是new出来的对象在堆内存中的地址
//3.是栈上的这个a是指向新new出来的对象的
//4.a是new出来的对象的引用。
//匿名对象:在堆上生成了对象,但是在栈上没有某个变量指向它。
二.内部类
1.成员内部类
可以访问外部类的所有成员变量和方法(无论静态、非静态)
自身没有静态成员
|–外部类里面创建成员内部类的实例:this.new Innerclass();
|–在外部类之外创建内部类的实例:new Outerclass().new Innerclass();
|–在内部类里访问外部类的成员:Outerclass.this.member
|–在内部类里访问内部类的成员:this.member
2.静态内部类
|–成员内部类没有静态成员;
|–静态内部类只能访问外围类的静态成员
OuterClass.InnerClass inner = new OuterClass.InnerClass();// 里面的类不用new
3.局部内部类(在方法体里面)
|-只能访问方法中定义的final类型的局部变量(初始化之后便不能更改)
4.匿名内部类(在方法体里面)
参考:https://www.cnblogs.com/tigerlion/p/11182838.html
5.接口作为方法的参数和返回值
作为参数
//测试类
public class Test{
public static void main(String[] args) {
Student s = new Student(); //改成多态调用:Smoking s = new Student();
smoking(s); //打印结果:Students are not allowed to smoke!
}
public static void smoking(Smoking s) { //接口作为参数。
s.smoking();
}
}
作为返回值,必须返回这个接口的一个实现类
//测试类
public class Test {
public static void main(String[] args) {
Smoking s = smoking(); //相当于Smoking s = new Student();
s.smoking(); //打印结果:Students are not allowed to smoke!
}
public static Smoking smoking() {
return new Student();//返回接口实现类的对象。
}
}
参考:https://blog.csdn.net/qq_41378597/article/details/95081122