JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)

一、构造方法

1、构造方法的定义

在一个类中定义的方法如果同时满足以下三个条件,该方法称为构造方法,具体如下:
方法名与类名相同
在方法名的前面没有返回值类型的声明
在方法中不能使用return语句返回一个值,但是可以单独写return语句作为方法的结束。

class Person {
	//下面是类的构造方法
	public Person() {
		System.out.println("无参的构造方法被调用了、、、");	
	}
}

public class Example05 {
	public static void main(String[] args) {
		Person p1 = new Person(); //实例化Person对象
	}
}

JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第1张图片
2、构造方法的重载
与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以通过调用不同的构造方法来为不同的属性进行赋值。、

class Person {
	String name;
	int age;
	//定义两个参数的构造方法
	public Person(String con_name , int con_age) {
		name = con_name;   //为name属性赋值
		age = con_age;     //为age属性赋值
	}
	//定义一个参数的构造方法
	public Person(String con_name) {
		name = con_name;   //为name属性赋值
	}
	public void speak() {
		//打印name和age的值
		System.out.println("大家好,我叫"+name+",我今年"+age+"岁!");
	}
}

public class Example07 {
	public static void main(String[] args) {
	//分别建立两个对象ps1和ps2
	Person p1 = new Person("焊枪");
	Person p2 = new Person("小樱",27);
	//通过对象ps1和ps2调用speak()方法
	p1.speak();
	p2.speak();
	}
}

JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第2张图片
Person类中定义了两个构造方法,他们构成了重载。在创建p1对象和p2对象时,根据传入参数的不同,分别调用不同的构造方法。从程序的运行结果可以看出,两个构造方法对赋值的情况是不一样的,其中一个参数的构造方法只正对name赋值,这时age的赋值为默认值0.

脚下留心
①在Java中的每个类都至少有一个构造方法,如果在一个类中没有定义构造方法,系统会自动为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,在其方法体中没有任何代码,即什么也不做。
下面程序中Person类的两种写法效果是完全不一样的。
第一种写法:

class Person{
}

第二种写法:

class Person {
	public Person() {
	}
}

对于第一种写法,类中虽然没有声明构造方法,但仍然可以用new Person()语句来创建Person类的实例对象。由于系统提供的构造方法往往不能满足需求,因此,可以自己在类中定义构造方法,一旦为该类定义了构造方法,系统就不在提供默认的构造方法了,具体代码如下所示。

class Person {
	int age;
	public Person (int x) {
		age = x;
	}
}

二、this关键字

例如都声明为age。但是这样做又会导致成员变量和局部变量的名称冲突,在方法中将无法访问成员变量age。为了解决这个问题,Java中提供了一个关键字this来指代当前对象,用于在方法中访问对象的其它成员。
JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第3张图片JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第4张图片JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第5张图片JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第6张图片

三、垃圾回收

在Java中,当一个对象成为垃圾后仍会占用内存空间,时间一长,就会导致内存空间的不足。针对这种情况,Java中引入了垃圾回收机制。有了这种机制,程序员不需要过多关心垃圾对象回收的问题,Java虚拟机会自动回收垃圾对象所占用的内存空间。
一个对象在成为垃圾后会暂时地保留在内存中,当这样的垃圾堆积到一定程度时,Java虚拟机就会启动垃圾回收器将这些垃圾对象从内存中释放,从而使程序获得更多可用的内存空间。除了等待Java虚拟机进行自动垃圾回收外,还可以通过调用System.gc()方法来通知Java虚拟机立即进行垃圾回收。当一个对象在内存中被释放时,它的finalize()方法会被自动调用,因此可以在类中通过定义finalize()方法来观察对象何时被释放。
JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第7张图片JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第8张图片

四、static关键字

1、静态变量

在定义一个类时,只是在描述某类事物的特征和行为,并没有产生具体的数据。只有通过new关键字创建该类的实例对象后,系统才会为每个对象分配空间,存储各自的数据。有时候,开发人员会希望某些特定的数据在内存中只有一份,而且能够被一个类的所有实例对象所共享。例如某个学校所有学生共享同一个学校名称,此时完全不必在每个学生对象所占用的内存空间中都定义一个变量来表示学校名称,而可以在对象以外的空间定义一个表示学校名称的变量,让所有对象来共享。具体内存中的分配情况如下图所示。
JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第9张图片
JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第10张图片
注意
JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第11张图片

2、静态方法
在实际开发时,开发人员有时会希望在不创建对象的情况下就可以调用某个方法,换句话说也就是使该方法不必和对象绑在一起。要实现这样的效果,只需要在类中定义的方法前加上static关键字即可,通常称这种方法为静态方法。同静态变量一样,静态方法可以使用“类名.方法名”的方式来访问,也可以通过类的实例对象来访问。
JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第12张图片
JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第13张图片
注意:在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象

3、静态代码块
在Java类中,使用一对大括号包围起来的若干行代码被称为一个代码块,用static关键字修饰的代码块称为静态代码块。当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块只执行一次。在程序中,通常会使用静态代码块来对类的成员变量进行初始化。
JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第14张图片在这里插入图片描述

五、成员内部类

在Java中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类。根据内部类的位置、修饰符和定义的方式可分为:成员内部类、静态内部类、方法内部类。本小节将针对成员内部类进行讲解。
在一个类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。在成员内部类中,可以访问外部类的所有成员。
如果想通过外部类去访问内部类,则需要通过外部类对象去创建内部类对象,创建内部类对象的具体语法格式如下:
在这里插入图片描述JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第15张图片
JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)_第16张图片

总结:Java中的方法像是c中的函数,Java中有方法的重载,那些调用类的用法有点像c中的指针调用。

你可能感兴趣的:(java软件工程师,笔记,java,编程语言)