Java学习日记13——内部类、局部类、匿名类、以及垃圾回收机制

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学习日记)