Skip to content

Latest commit

 

History

History
executable file
·
304 lines (198 loc) · 9.92 KB

File metadata and controls

executable file
·
304 lines (198 loc) · 9.92 KB
title Java语言面向对象

[TOC]

对象的定义和使用

在程序中创建对象的目的是使用对象。
==创建一个对象就要为对象的各个成员变量分配存储空间。==

创建对象

  • 创建一个类,就创建了一种新的数据类型。
  • 创建对象也称为类的实例化。

创建对象包括两个步骤:声明对象引用变量(即对象名)和__实例化对象__(即为对象分配存储空间)或者将两个步骤合二为一。

声明对象

类名 对象名表;

其中:

  • 类名是指对象所属类的名字,它是在声明类时定义的;
  • 对象名表是指一个或多个对象名,若为多个对象名时,对象名之间用半角逗号进行分隔。

注意: ==声明对象实质上是声明了对象引用变量,而并没有为对象开辟内存空间,对象引用变量存放对象的内存单元起始地址。==

为对象分配内存空间

使用new运算符和类的构造方法为声明的对象分配内存空间,如果类中没有显式定义构造方法,系统会调用默认的无参构造方法。

为对象分配内存空间的格式有如下两种方式:

  • 方式1

对象名 = new 构造方法([实参列表]);

	circleOne = new Circle(); 
	// 此时circleOne引用被分配内存空间的真实地址
	circleTwo = new Circle(2.0);

-方式2

类名 对象名 = new 构造方法([实参列表]);

	Circle circleTwo = new Circle(2.0);

或者

// EmpInfo.java
public class EmpInfo {
	String name;         // 雇员的姓名
	String designation;  // 雇员的职务
	String department;   // 雇员的部门

	// 带参数的构造方法
	public EmpInfoC(String name,String desi,String depa) {
		this.name=name;
		this.designation=desi;
		this.department=depa;
	} 

	void print() { // 成员方法
		System.out.println(name + " is " + designation + " at " + department); 
	}

	public static void main(String argv[]){   
		EmpInfoC employee = 
		new EmpInfoC("Robert Javaman ","Manager","Coffee Shop"); 
		employee.print();         // 调用方法print()
	}
}

运行结果如下:

Robert Javaman is Manager at Coffee Shop

对象的使用

==创建一个对象就要为对象的各个成员变量分配存储空间。==

可以通过引用对象的成员来使用对象,对象成员变量的引用方式如下: 

对象名.成员变量名

对象成员方法的引用方式如下: 

对象名.成员方法名(实参列表)

对象的清除

  • Java运行时系统通过垃圾自动回收机制周期性地释放无用对象所使用的内存,完成垃圾的自动回收。

  • 当一个对象的引用为空时,该对象称为一个无用对象。

  • Java的垃圾收集器自动扫描对象的动态内存区,对被引用的对象加标记,然后把没有引用的对象作为垃圾收集起来并释放。

垃圾收集器作为一个线程运行,当系统的内存用尽或程序中调用System.gc()要求进行垃圾收集时,垃圾收集线程与系统同步运行,否则垃圾收集器在系统空闲时异步地执行。
在对象作为垃圾被收集器释放前,Java运行时系统会自动调用对象的方法finialize(),使它清除自己所使用的资源。

  • 垃圾收集器以较低优先级在系统空闲周期中执行,一次垃圾的收集速度比较慢,在某些情况下,我们也可以通过调用System类的gc()方法,即调用System.gc()显示执行垃圾收集。

  • 析构方法finalize()
    垃圾收集器自动调用对象的finalize(),释放当前对象所使用的资源。
    gc()方法调用finalize()。
    在类的定义中,除了必须定义创建类实例的方法外,还可以在定义中提供用于对象清除的方法finialize(),它的格式如下:

protected void finalize() throws Throwable{ //撤销对象 }

finalize()方法是类java.long.Object中最基本的方法。
然而,在某些情况下,当一个类被破坏后,需要亲自执行一些垃圾收集器不能处理的特殊清理工作。

方法的参数传递

进行方法调用时,需要提供实参,他们必须与方法定义中所对应的形参次序相同,这叫做__参数顺序匹配__。
==实参必须与方法头中的形参在次序上和数量上匹配,在类型上兼容。==
类型兼容是指不需要经过显式的类型转换,实参的值就可以传递给形参。
例如将int型的实参值传递给double型形参。

方法调用的格式有以下3种形式:

  • 形式一:成员方法名(实参列表)
  • 形式二:表达式.成员方法名(实参列表)
  • 形式三:类名.静态成员方法名(实参列表)

在Java的方法调用中,==方法中的参数是以传值的形式进行的,不管它是什么数据类型。==
如果是基本数据类型,则将实参的值传递给形参,改变方法内部的形参的值不会影响方法外部的实参值。
无论形参在方法中如何改变,实参均不受影响。
如果是类类型,则传入的是引用的一个拷贝。

如同可以给方法传递基本数据类型一样,也可以向方法传递类类型的对象,称其为引用传递。
引用传递传入的是引用的一个拷贝,归根结底还是传的值。

Example 1
public static void tripleValue(double x) {
	x = x*3;
}
double percent = 20;
tripleValue(percent);
  • x被初始化为percent的一个拷贝,x=20;
  • x = x * 3, x=60;
  • 结束tripleValue方法后,x不再使用;
Example 2
class Employee {
	private int salary = 0;
	public void raiseSalary(int number) {
		salary = salary + number;
	}
}
public static void tripleValue(Employee x) {
	x.raiseSalary(200);
}
Employee harry = new Employee();
tripleValue(harry);
  • x被初始化为harry的一个拷贝,这里是一个对象的引用;
  • x和harry同时引用的那个Employee对象.salary提高了200元;
  • 结束tripleValue方法后,x不再使用,但是harry继续引用那个salary提高了200元的Employee对象;

变量与方法

在类的数据成员和方法成员前用__static__关键字修饰的分别称为类变量和类方法,也称为静态变量和静态方法,非静态的又分别称为实例变量和实例方法。
在生成每个类的实例对象时,Java运行时系统为每个对象分配一块内存,然后可以通过对象引用变量来访问这些对象的实例变量。
不同对象的实例变量是不同的。

类变量可用来在实例对象之间进行通信或跟踪该类实例的数目。
对于不是private类型的类变量,建议通过类名直接访问类变量,而不像实例变量那样需要通过实例对象才能访问。

注意

  • (1)Java中没有全局变量,但类变量是在一个类的所有实例对象中都可以访问的变量,在一定程度上类似于其他语言中的全局变量。
  • (2)实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,但类方法不能访问实例变量。

实例方法的调用形式如下:

对象名.实例方法名(实参列表);

类方法由类名直接调用,其调用形式如下:

类名.类方法名(实参列表);

关于类方法的使用,有如下一些限制:

  • 在类方法中没有__this__关键字,不能访问所属类的实例变量和实例方法,只能访问方法体内定义的局部变量、该方法的形式参数和类变量;
  • 在类方法中不能使用__super__和__this__关键字;
  • main()方法是一个静态方法。因为它是程序的入口点,这可以使JVM不创建实例对象就可以运行该方法。

变量的作用域

==实例变量和类变量的作用域是整个类,它们可以在类中任何位置说明。==
在方法中说明的变量称为局部变量,局部变量的作用域从声明它的位置开始到包含它的块尾。
类的实例变量和类变量只能声明一次,但是局部变量可以在互不嵌套的块内多次声明,在同一嵌套块中只能声明一次。

变量的初始值

如果没有对类的成员变量赋初值,则Java会对其赋默认值,对不同类型的成员变量赋以不同的默认值,如下所示:

引用类型 null
数值类型 0
boolean false
char '\u0000'

注意:
对于方法体内的局部变量,Java不提供初始值。
程序员必须对其赋初值,否则会出现编译错误。

this关键字

关键字__this__用来指向当前对象或类的实例变量。
如果局部变量与实例变量重名,则局部变量优先,同名的实例变量或类变量被隐藏。

用“类名.类变量名”可以访问隐藏的类变量,用this关键字可以访问隐藏的实例变量。

例:

class TestThis{
	int day = 1;	// 实例变量day
	
	void setDay(int day){
		this.day = day;
	}
}

当一个构造方法需要调用本类的另一个构造方法时,可以使用this关键字,同时这个调用语句应该是整个构造方法的第一个可执行语句。

例:

public class Circle {
	private double radius;
 	
 	public Circle(double radius) {
		this.radius = radius;	
	}
	
	public Circle() {
		this(1.0);
	}
	
	public double findArea() {
			return Math.PI * radius * radius;	}
}

每个对象的每个实例方法都拥有一个this变量指向对象自己,供自己的方法内部代码中使用,可以通过this,获得当前对象的属性值,也可以调用自身对象的其它方法


本文档 Github : https://github.com/bushehui/Java_tutorial

<script type="text/javascript" async src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"> </script> <script type="text/x-mathjax-config"> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}}); </script>