类声明与对象创建
类与对象的关系
类是一类对象的描述;
对象是类的具体实例。
类声明
[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){
//
}
}