对象,类与接口概念

对象,类与接口

内部类

​ 一个类定义在另外一个类的内部,分为成员内部类(定义在外部类的成员位置)和局部内部类(定义在外部类的方法里面)

成员内部类

class Outer{
	class Inner{}
}

成员内部类的特点

1、成员内部类可以直接访问外部类的成员,包括私有的,也可以通过外部类名.this.成员名调用外部成员
2、外部类访问非静态成员内部类的成员,必须要创建成员内部类对象;外部类可以通过类名直接访问静态内部类的静态成员,包括私有的
3、成员内部类和外部类不存在继承关系
4、其他类中生成成员内部类的方式:Outer.Inner oi = new Outer().new Inner();

局部内部类

class Outer{
	public void method(){
		class Inner{}
	}
}

局部内部类特点

1、可以直接访问外部类的成员
2、在局部位置可以创建局部内部类对象,通过对象调用成员
注意:局部内部类在访问局部变量时,被访问的变量必须用 final 修饰,因为局部变量随着方法调用完毕就消失了,而内部类在堆内存中并不会立即消失

匿名内部类
抽象类
接口

java对象生命周期

创建阶段(Created)
为对象分配存储空间
开始构造对象
从超类到子类对static成员进行初始化
超类成员变量按顺序初始化,递归调用超类的构造方法
子类成员变量按顺序初始化,子类构造方法调用
应用阶段(In Use)
至少被一个强引用持有着
不可见阶段(Invisible)
程序块本身不再持有该对象的任何强引用,如超出作用域
不可达阶段(Unreachable)
该对象不再被任何强引用所持有
收集阶段(Collected)
处于“不可达阶段”并且垃圾回收器已经对该对象的内存空间重新分配做好准备。如对象重写了finalize(),则跳过此阶段
终结阶段(Finalized)
对象执行完finalize()方法后仍然处于不可达状态
对象空间重分配阶段(De-allocated)
垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,该对象彻底消失

java类生命周期

初始化
如果一个类被直接引用,就会触发类的初始化。
直接引用的情况有:
通过new关键字实例化对象、读取或设置类的静态变量、调用类的静态方法
通过反射方式执行以上三种行为
初始化子类的时候,会触发父类的初始化
作为程序入口直接运行时(也就是直接调用main方法)
除以上四种情况,其他使用类的方式叫被动引用,不会触发类的初始化
卸载
在类使用完之后,如果满足下面的情况,类就会被卸载
该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收
该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法

匿名对象

没有名字的对象
使用场景
适用于一个对象只使用一次的场景
好处
匿名对象使用完毕就变成垃圾被回收
注意
匿名对象可以作为实际参数传递
用法
new Person().show();
可实例化抽象类或接口

public abstract class Person{
	public abstract void work();
}
new Person(){
	public void work(){
		System.out.println(“work”);
	}
}.work();

成员变量和局部变量的区别

A:在类中的位置不同
	成员变量:在类中方法外
	局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
	成员变量:在堆内存
	局部变量:在栈内存
C:生命周期不同
	成员变量:随着对象的创建而存在,随着对象的消失而消失
	局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
	成员变量:有默认初始化值
	局部变量:没有默认初始化值,必须定义,赋值,然后才能使用

猜你喜欢

转载自blog.csdn.net/mLuoya/article/details/87870322
今日推荐