类声明与对象创建

类与对象的关系

类是一类对象的描述;
对象是类的具体实例。

类声明

[public][abstract | final] class 类名称
[extends 父类名称]
[implements 接口名称列表]
{
	数据成员声明及初始化;
	方法声明及方法体;
}

class:表明其后面声明的是一个类;
extends:如果所声明的类是从某一父类派生而来,那么父类的名字应卸载extends之后;
implements:如果所声明的类要实现某些接口,那么接口的名字应卸载implements之后;
public:表示此类为公有类;
abstract:表示此类为抽象类;
final:表示此类为终结类。

对象引用声明

语法:
类名 引用变量名;

例:
Clock是已经声明的类名,声明引用变量aclock,用于存储该类对象的引用:
Clock aclock;

声明一个引用变量时并没有生成对象。

对象的创建

语法形式:
new <类名>()
new关键字,动态内存分配的运算
例如:
aclock=new Clock()
在运行时分配内存空间,用于存放一个Clock类型的对象
new的作用:在内存中为Clock类型的对象分配内存空间,返回对象的引用。
引用变量可以被赋以空值;
aclock=null;

数据成员

数据成员

表示对象的状态,可以是任意的数据类型。
用来存放整个类中所有对象之间要共享的数据。

数据成员声明

语法形式

[public | protected | private]
[static][final][transient][volatile]
数据类型 变量名1[=变量初值],变量名2[=变量初值],…;

public、protected、private为访问控制符,用来控制对类成员的访问权限。
static指明这是一个静态成员变量(类变量)。
final指明变量的值不能被修改。
transient指明变量是不需要序列化的。
volatile指明变量是一个共享变量。

实例变量

属于对象的属性
没有static修饰的变量(数据成员)称为实例变量
存储所有实例都需要的属性,不同实例的属性值可能不同

访问实例属性的值:
<实例名(对象名)>.<实例变量名>

例:

public class Circle{
	int radius;
}
public class ShapeTester{
	public static void main(String[] args){
		Circle x;		//定义一个圆类的引用x
		x = new Circle();		//用new运算获得一个新的圆对象,把它的引用赋给x
		System.out.println(x);
		System.out.println("radius+"+x.radius);
	}
}

编译后运行的结果:
Circle@26b249
radius=0
说明:
所有的类里面都有一个默认的toString()方法:
getClass().getName()+"@"+Integer.toHexString(hashCode())
先取得这个类的类名,然后把这个对象的hash码转成16进制输出
可以自己写一个toString()来覆盖这个原有的toString()

类变量(静态变量)

是为整个类的对象共享的数据
用static修饰;
在整个类当中只有一个值;
类初始化的同时就被赋值;

适用情况:

类中所有对象都相同的属性;
	经常需要共享的属性;
	系统中用到的一些常量值。

引用格式:
<类名|实例名(对象名)>.<类变量名>
没有实例名(对象名)也可以.

public class Circle{
	static double PI=3.14159265;
	int radius;
}

当我们生成Circle类的实例时,在每一个实例中并没有储存PI的值,PI的值存储在类中。

public class ClassVariableTester{
    public static void main(String[] args){
        Circle x=new Circle();
        System.out.println(x.PI);
        System.out.println(Circle.PI);
        Circle.PI=3.14;
        System.out.println(x.PI);
        System.out.println(Circle.PI);
        x.PI=3.14159;
        System.out.println(x.PI);
        System.out.println(Circle.PI);
    }
}

运行结果:
3.14159265
3.14159265
3.14
3.14
3.14159
3.14159

方法成员

语法形式:
[public | protected | private]
[static][final][abstract][native][synchronized]
返回类型 方法名([参数列表])[throws exceptionList]
{
方法体
}

public、protected、private用来控制访问权限;
static指明这是一个类方法(静态方法);
final指明这是一个终结方法;
abstract指明这是一个抽象方法;
native用来继承java代码和其他语言的代码;
synchronized用来控制多个并发线程对共享数据的访问。

返回类型

方法返回值类型可以是任意的Java数据类型;
当不需要返回值时返回类型是void。

参数类型

简单数据类型、引用类型(数组、类或接口);
可以有多个参数,也可以没有参数,方法声明时的参数称为形式参数;

方法体

方法的实现;
包括局部变量的声明以及所有合法的Java语句;
局部变量的作用域只在该方法内部。

throws exceptionList:

抛出异常列表

实例方法

表示特定对象的行为;
声明时前面不加static修饰符

实例方法调用:使用对象的某个行为/功能:调用对象的某个方法。

实例方法调用格式:
<对象名>.<方法名>([实参列表])
<对象名>为消息接收者

参数传递:
值传递:参数类型为基本数据类型
引用传递:参数类型为对象类型或数组时

public class Circle{
    static double PI=3.14159265;
    int radius;
    public double circumference(){
        return 2*PI*radius;
    }
    public void enlarge(int factor){
        radius*=factor;
    }
    public boolean fitsInside(Rectangle r){
        return (2*radius<r.width)&&(2*radius<r.height);
    }
}
public class Rectangle {
    int width=10;
    int height=5;
}
public class InsideTester {
    public static void main(String[] args) {
        Circle c1 = new Circle();
        c1.radius=8;
        Circle c2 = new Circle();
        c2.radius=15;
        Rectangle r= new Rectangle();
        r.width=20;
        r.height=30;
        System.out.println(c1.fitsInside(r));
        System.out.println(c2.fitsInside(r));
    }
}

输出:
true
false

类方法(静态方法)

声明前需要加static修饰,不能被声明为抽象的,可以类名直接调用,也可以实例调用。

可变长参数:

可变长参数使用省略号表示,其实质就是数组。
例如,"String…s"表示"String[] s"
对于具有可变长参数的方法,传递给可变长参数的实际参数可以是零个到多个对象。
static double maxArea(Circle c,Rectangle... varRec){
	Rectangle[] rec = varRec;
	for (Rectangle r: rec){
		//
	}
}