类是定义对象形式的模板,指定了数据以及操作数据的代码。
Java中使用类的规范来构造对象,而对象是类的实例。
类是逻辑抽象的,只有类的实例——对象才是内存中的物理表示。
类一般都包含方法和变量,通过class创建类。
这是简单的Rectangle类,包含了方法和变量:
class Rectangle{
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
private double length;
private double width;
public double getArea() {
return length * width;
}
public void show() {
System.out.println("length = " + length + " width = " + width);
}
}
对于Rectangle类我们可以写一个程序来使用:
//This is a simple class
public class ClassTest {
public static void main(String[] args) {
Rectangle r = new Rectangle(1,1);
r.show();
}
}
class Rectangle{
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
private double length;
private double width;
public double getArea() {
return length * width;
}
public void show() {
System.out.println("length = " + length + " width = " + width);
}
}
输出结果如下:
length = 1.0 width = 1.0
保存这个文件的文件名应该是ClassTest.java。因为main()方法在名为ClassTest类中。
Rectangle r = new Rectangle(1,1);
这段代码的含义是:先声明一个名为r的Rectangle类型的变量,它现在只是一个可以引用对象的变量,而没有指明什么对象,再new一个实例对象,并将引用赋给r。
new运算符为对象动态分配内存(即运行时分配),并返回一个对它的引用。
该引用是由new分配的对象在内存中的地址。
在赋值运算中,对象引用赋值与基本类型变量赋值的工作方式不同,从以下例子中将能看出:
将Rectangle类进行改进:
class Rectangle{
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
private double length;
private double width;
public void setLength(double length) {
this.length = length;
}
public void setWidth(double width) {
this.width = width;
}
public double getArea() {
return length * width;
}
public void show() {
System.out.println("length = " + length + " width = " + width);
}
}
此时使用ClassTest.java程序来验证:
//This is a simple class
public class ClassTest {
public static void main(String[] args) {
Rectangle r = new Rectangle(1,1);
r.show();
Rectangle r1 = r;
r1.setLength(2);
r.show();
r1.show();
}
}
class Rectangle{
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
private double length;
private double width;
public void setLength(double length) {
this.length = length;
}
public void setWidth(double width) {
this.width = width;
}
public double getArea() {
return length * width;
}
public void show() {
System.out.println("length = " + length + " width = " + width);
}
}
输出结果如下:
length = 1.0 width = 1.0
length = 2.0 width = 1.0
length = 2.0 width = 1.0
此时的r和r1都指向同一个对象,从而导致输出结果相同。
这些都属于改进Rectangle类的方法:
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
public void setLength(double length) {
this.length = length;
}
public void setWidth(double width) {
this.width = width;
}
public double getArea() {
return length * width;
}
public void show() {
System.out.println("length = " + length + " width = " + width);
}
通过方法,就可以操作类中的数据,在程序中,也主要通过类的方法来与类进行交互。
引起方法返回的条件有两个:
在以下几个方法中都有它们的返回:
public void setLength(double length) {
this.length = length;
}
public void setWidth(double width) {
this.width = width;
}
public double getArea() {
return length * width;
}
public void show() {
System.out.println("length = " + length + " width = " + width);
}
然而返回值的种类有两种:无返回值和有返回值。
当遇到return语句,使得方法返回时,有两种形式:
实参:向方法传递的值称为实参。
形参:在方法中接受实参的变量称为形参。
public void setLength(double length) { //传递给length的值为实参,length作为方法的形参。
this.length = length;
}
一个方法可以有多个形参,在声明的时候只需用逗号隔开即可,形参的类型可相互不同。
public int myMeth(int a, double b, char c){
//...
}
构造函数是在创建对象得时初始化对象,它的名称与类名相同,语法与方法相似,且没有显式的返回类型。
例如:
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
所有类都具有自己的构造函数,如果没有显式的定义出来,Java自动为类提供一个默认的构造函数来初始化所有的成员变量,其默认值为0、null和false,一旦自己定义了构造函数,将不会使用默认的构造函数。
Java的垃圾回收系统会自动回收无用对象,主要工作方式是:当不存在对某对象的任何引用时,该对象就被认定没有存在的必要了,它所占用的内存就要被释放。
垃圾回收只是在程序执行的过程中偶然发生,满足两个条件将运行:
当调用一个方法时,会向它自动传递一个隐式实参,它是对调用对象(即调用方法的对象)的一个引用,这个引用叫做this。
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
public void setLength(double length) {
this.length = length;
}
public void setWidth(double width) {
this.width = width;
}
this的主要用途:当发生局部变量名隐藏实例变量时,通过this引用它,得到隐藏实例变量的访问权。