Loading

类与对象定义、引用传递分析、垃圾产生分析

1.0 类与对象

1.1 面向对象简介:

面向对象三个主要特征:

  • 封装性:内部的操作对外部而言不可见:当内部的操作都不可以直接使用的时候才是安全的;
  • 继承性:在已有结构的基础上继续进行功能的扩充;
  • 多态性:是在继承性的基础上扩充而来的概念,指的是类型的转换处理。

在进行面向对象程序的开发之中一般还有三个步骤:

  • OOA:面向对象分析

  • OOD:面向对象设计

  • OOP:面向对象编程

1.2 类与对象简介:

类是对某一类事物的共性的抽象概念,而对象描述的是一个具体的产物。

在类之中一般都会有两个组成:

  • 成员属性(Field):有时候为了简化称其为属性

​ 一个人的年龄、姓名都是不同的,所以这些对于整体来讲就成为属性;

  • 操作方法(Method):定义对象具有的处理行为

    ​ 这个人可以唱歌、跳舞、游泳、运动

1.3 类与对象的定义:

范例:定义一个类

class Person {	//定义一个类
	String name; 	//人员的姓名
	int age;	//人的年龄
	public void tell() {
		System.out.print("姓名:" + name + "、年龄:"  +  age);
	}
}

在这个类之中定义有两个数属性(name、age)和一个方法(tell()),现在有了类之后,如果想使用类,那么就必须通过对象来完成,而如果要产生对象,那么必须使用如下的语法格式来完成:

  • 声明并实例化对象:类名称 对象名称 = new 类名称();

  • 分步骤完成:

    ​ 声明对象:类名称 对象名称 = null;

    ​ 实例化对象:对象名称 = new 类名称()

当获取了实例化对象之后,那么就需要通过对象进行类中的操作调用,此时有两种调用方式:

  • 调用类中的属性:实例化对象.成员属性 ;

  • 调用类中的方法:实例化对象.方法名称()

范例:使用对象操作类

class Person {	//定义一个类
	String name; 	//人员的姓名
	int age;	//人的年龄
	public void tell() {
		System.out.print("姓名:" + name + "、年龄:"  +  age);
	}
}
public class JavaDemo {
	public static void main(String args[]) {
		Person per = new Person(); //声明并实例化对象
		per.name = "张三";
		per.age = 18;
		per.tell(); //进行方法的调用
	}
}

1.4 对象内存分析

如果要进行内存分析,那么首先给出两块最常用的内存空间:

​ 堆内存:保存的是对象的具体信息。

​ 栈内存:保存的是一块堆内存的地址,即:通过地址找到内存,而后找到对象内容。

image-20210224114322892

注意:所有的对象在调用类中的属性或方法的时候必须要实例化后才可以执行。

范例:错误的代码

public class JavaDemo {
	public static void main(String args[]) {
		Person per = null; //声明对象
		per.name = "张三";
		per.age = 18;
		per.tell(); //进行方法的调用
	}
}

输出结果:

Exception in thread "main" java.lang.NullPointerException
	at JavaDemo.main(JavaDemo.java:11)

代码之中只是声明了对象,但是并没有为对象进行实例化,所以此时无法调用。而此时程序中出现的NullPointerException(空指向异常)就是没有在堆内存开辟后时所产生的问题,并且只有引用数据类型存在有此问题。

1.5 引用传递分析

类本身属于引用数据类型,既然是引用数据类型,那么久牵扯到内存的引用传递,所谓的引用传递的本质: 同一块堆内存之间可以被不同的栈内存所指向,也可以更换指向。

范例:定义一个引用传递的分析程序

public class JavaDemo {
	public static void main(String args[]) {
		Person per1 = new Person(); //声明并实例化对象
		per1.name = "张三";
		per1.age = 18;
		Person per2 = per1; //引用传递
		per2.age = 80;
		per1.tell(); //进行方法的调用
	}
}

输出结果:

姓名:张三、年龄:80
image-20210224122411948

这个时候的引用传递是直接在主方法之中定义的,也可以通过方法实现引用传递处理。

范例:利用方法实现引用传递处理

public class JavaDemo {
	public static void main(String args[]) {
		Person per = new Person(); //声明并实例化对象
		per.name = "张三";
		per.age = 18;
		change(per); //等价于Person temp = per;
		per.tell(); //进行方法的调用
	}
	public static void change(Person temp) {
		temp.age = 80;
	}
}

输出结果:

姓名:张三、年龄:80

与之前的差别最大的地方在于,此时的程序是将Person类的实例化对象(内存地址、数值)传递到了change()方法之中,由于传递的是一个Person类型,那么change()方法接收的也是Person类型

image-20210224123518321

引用传递可以发生在方法上,这时候一定要观察方法的参数类型,同时也要观察方法的执行过程。

1.6 引用与垃圾产生分析

一个栈内存只能够保存有一个堆内存的地址数据,如果发生更改,则之前的地址数据将从此从栈内存中彻底消失。

image-20210224123904658

所谓的垃圾空间指的就是没有任何栈内存所指向的堆内存,所有的垃圾都将被GC(Garbage Collector、垃圾收集器)不定期进行回收,并且释放无用内存空间,但是如果垃圾过多,一定影响GC的处理性能,从而降低整体的程序性能,那么在实际的开发之中,对于垃圾的产生应该越少越好

posted @ 2021-02-25 11:18  北络  阅读(84)  评论(0编辑  收藏  举报