概述
Java学习日记13——内部类和匿名类、以及垃圾回收机制
对象清楚和垃圾回收机制
Java具有自动的垃圾回收机制和对象清楚管理,所以基本不需要手动进行操作,也不需要使用delete语句删除对象,Java会自动分辨对象是否被使用,从而做到自动释放内存。另外,如果执行的程序或者线程太多,那么可能需要使用System.gc()方法建议系统进行垃圾回收和清理,当然这里的gc()方法仅仅只是建议系统进行,实在系统有能力实现的情况下自动进行,也不是手动进行释放。
内部类
Java的内部类,即是在类中再定义类,那么这样定义的内部类,在整个类中是可以直接读取和使用的,如果在类的外部进行调用,那么就需要使用类名.内部类的形式进行调用。如果是调用内部类的方法或者变量呢?就需要使用类名.内部类.内部类的方法名/变量名的形式进行调用。
举个例子:
class insideclass {
private int a = 1010;
public class inside {
int a
= 1111;
public void say(int a ) {
System.out.println("类的变量a为:"+insideclass.this.a);
System.out.println("内部类的a为:"+this.a);
System.out.println("方法局部变量a为:"+a);
}
}
public static void main(String[] args) {
inside i = new insideclass().new inside();
i.say(1100);
}
}
程序的执行结果是:
类的变量a为:1010
内部类的a为:1111
方法局部变量a为:1100
通过上述也可以看出,如果要创建一个内部类的对象,则需要用到
inside i = new insideclass().new inside(); 的形式。这里用到了两个new。
注意:无论是类的成员还是内部类的成员,都是属于这个类的,都可以被各种修饰词所修饰。但是static修饰的内部类尤其需要注意,因为一旦内部类被static修饰,那么代表这个类实际是一种外部类。因为按照static的特性,被修饰的类将会变成与外部类的实例无关的类,就意味着一个外部类。所以也有人将这种被static修饰的内部类成为嵌套类(nested class)。
在使用static内部类时需要注意的事项:
1.实例化static类时,在new前面不需要用对象实例变量;
2.static类中不能访问其外部类的非static字段及方法,即只能访问static成员;
3.static方法中不能访问非static的域和方法,也不能不带前缀的new一个非static部内类。
另外,如果用static修饰的内部类需要创建实体对象时:可以直接使用外部类.内部类的格式进行,不需要像前面那么复杂,还要使用双new。例如:
class insideclass {
private int a = 1010;
static class inside {
int a
= 1111;
public void say(int a ) {
//这个方法体不能再用this来访问外部类的数据了,因为非static外部类变量不能被访问
System.out.println("内部类变量a为:"+this.a);
System.out.println("方法局部变量为:"+a);
}
}
public static void main(String[] args) {
insideclass.inside i = new insideclass.inside();//注意这里与上面程序的不同
i.say(1100);
}
}
程序的执行结果是:
内部类变量a为:1111
方法局部变量为:1100
观察程序可以发现:这个方法体不能再用this来访问外部类的数据了,因为非static外部类变量不能被访问。只能访问当前内部类的变量。
局部类
简言之,局部类就是在方法体里面定义的类,称为局部类(local class)。其实也算内部类的一种特殊情况。
1.在这种情况下和局部变量相似,都是不能被public等修饰词修饰,只能被final和abstract修饰。
2.这样的类可以访问外部类的成员,但是不能访问当前方法的普通局部变量,仅能访问final修饰的局部变量(因为final修饰的局部变量可以理解为全局变量)。
匿名类
因为有些局部类实际上是只执行一次,通常也可以不为他命名,就直接使用父类或者接口的名字,编译器在编译时会自动生成xxxx$1之类的名字,这样的类直接在定义时就创建了实体。创建的公式如下:
new 类名或者接口名(){…}
不使用class关键字,也不使用extends以及implements。
如果需要定义匿名类的构造方法,使用父类的构造方法,因为这个匿名类本身没有名字,如果new一个新对象,需要直接带参数,则使用父类构造方法。
匿名类的应用
典型的应用可以是注册事件的监听器。当按钮被按下时,需要执行相应的语句,那么可以直接使用匿名类作为响应,这样在一定程度上可以增加代码的阅读性。
例如:
SymAction
buttonAction = new SymAction();
btnNew.addActionListener(buttonAction);
btnNew.addActionListener(new ActionListener(){//这里是new一个接口名字,在定义类的时候同时new
public void actionPerformed(ActionEvent event)
{
btnNew_ActionPerformed(event);
}
});
如果你对Java有兴趣,可以了解一下前面几期的基础知识!下面附上链接:
Java编程基础认知:Java学习日记1——基础认知
Java面向对象编程认识:Java学习日记2——面向对象编程认知
Java程序的基本结构认识:Java学习日记3——程序类型与构成认知
Java的输入输出方法总结:Java学习日记4——Java输入输出方法总结
Java的数据类型、变量、常量、运算符:Java学习日记5——数据类型、变量、常量、运算符、数组
Java学习日记6——类、字段、方法、this的使用:Java学习日记6——类、字段、方法、this的使用
Java学习日记7——类的继承、super使用规则:Java学习日记7——类的继承、super使用规则
Java学习日记8——修饰符:Java学习日记8——public、static、private、final、abstract、protected
Java学习日记9——接口(长文预警):Java学习日记9——接口(长文预警)
Java学习日记10——Java中的变量及其传递:Java学习日记10——Java中的变量及其传递
Java学习日记11——多态和虚方法调用:Java学习日记11——多态和虚方法调用
Java学习日记12——构造方法及其初始化、构造方法的执行过程——Java学习日记12——构造方法及其初始化、构造方法的执行过程
最后
以上就是坦率招牌为你收集整理的Java学习日记13——内部类、局部类、匿名类、以及垃圾回收机制的全部内容,希望文章能够帮你解决Java学习日记13——内部类、局部类、匿名类、以及垃圾回收机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复