类与对象
文章目录
1.1类的定义
类定义的语法格式:
[修饰符] class 类名 [extends 父类名][implements 接口列表]{
... //类体部分
}
例如:
public class Sum{
...
}
【说明】
- 修饰符有访问控制修饰符(public protected default private) 和 类修饰(如 abstract 、interface 、final )。
- 类名首字母通常要大写。
- 关键字extends引导该类要继承的父类。
- 关键字implements引导该类所实现的接口列表。
类的成员属性的定义格式:[修饰符] 类型 变量名;
类的成员方法的定义格式:
[修饰符] 返回值类型 方法名([参数列表])[throws 异常列表]{
...//方法体
}
【注意】当一个以上的修饰符修饰类或类中的域、方法时,这些修饰符之间用空格分割,且无排列次序要求。
【例】表示点的Point类
public class Point {
private int x; //x坐标
private int y; //y坐标
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
@Override
public String toString() { //对象的字符串描述
return "Point{" +
"x=" + x +
", y=" + y +
'}';
}
}
【补充】IDEA自动生成有参、无参构造方法以及getter、setter、toString方法:
右键代码区
选择Generate…
按住shift可多选
1.2对象的创建与引用
1.2.1创建对象及访问对象成员
实例化对象格式:类型 引用变量名 = new 类型([参数]);
public static void main(String[] args) {
Point p1 = new Point();
Point p2 = new Point();
Point p3 = p1;
p1.setX(5);
p1.setY(8);
p2.x = 12;
System.out.println("p1"+p1); //p1Point{x=5, y=8}
System.out.println("p2"+p2); //p2Point{x=12, y=0}
System.out.println("p3的属性值"+p3.getX()); //p3的属性值5
}
【说明】
- x和y是成员变量,没有手动赋初始值,系统会默认将x、y赋值为0
- p1、p2、p3是引用类型,
Point p3 = p1;
实际上表示p1、p3两个变量引用同一个对象,指向同一块内存。
1.2.2对象的初始化和构造方法
在创建对象时,要给对象的属性成员分配内存空间,并进行初始化。如果定义属性成员时没有指定初值,则系统按默认规则设定初值。特别地,引用类型地成员默认初值为null。
构造方法是给对象设置初值的规范方式,它是根据参数来给对象属性赋值。
public Point(){ //无参构造方法
}
public Point(int x1 , int y1){ //有参构造方法
x = x1;
y = y1;
}
定义构造方法时需要注意:
- 构造方法明必须与类名一致。
- 构造方法没有返回类型。
- 一个类可以提供多个构造方法,这些方法的参数不同.在创建对象时,系统自动调用能满足参数匹配的构造方法为对象初始化
- 如果没有自定义构造方法,那么系统会自动提供一个无参的构造方法。但是一旦自定义了构造方法,系统将不再提供无参的构造方法。
【例如】使用构造方法给变量p4赋值:
Point p4 = new Point(4,5); //x=4,y=5
1.3变量作用域
根据变量在程序中声明的位置,可以将变量分为以下4种类型;
- 成员变量:作用域是整个类体。成员变量定义时系统会默认赋初值。
- 局部变量:方法体内定义的局部变量在整个方法内部有效,循环内定义的局部变量在循环内有效。
- 方法参数:作用域是整个方法。
- 异常处理参数:作用域是cache后面跟随的异常处理块。
【例如】`
try{
int x = 5/0;
}
cache(ArithmeticException e){ //异常处理参数e的有效范围
System.out.println("产生异常"+e)
}
1.4类变量和静态方法
1.4.1类变量
用static修饰符修饰的属性是仅属于类的静态属性,相应的成员变量也称类变量或者静态变量。
1.类变量的访问形式
- 通过类名作前缀访问,如 A.k++。(推荐使用)
- 通过对象作前缀访问,如 x1.k++。
- 通过变量名直接访问,如 k++。
public class Point {
static int k = 3;//类变量
public static void main(String[] args) {
Point x1 = new Point();
x1.k++; //k=4
Point x2 = new Point();
x2.k = 5; //k=5
k++; //k=6
System.out.println("k="+Point.k);//k=6
}
}
【说明】静态变量在存储上归属类空间,不依赖任何对象,通过对象去访问静态变量实质上还是访问类空间的那个变量,也就是说它们实际上都是同一个内存空间下的。
1.4.2静态方法
用static修饰的方法称为静态方法,也叫类方法,在static方法中能处理类变量,也可以访问其它static方法,但不能访问任何归属对象空间的变量或方法(普通可访问静态,静态不可访问普通)
静态方法的调用形式
- 用类名做前缀,如A.sum()。(推荐使用)
- 通过对象名调用,如x1.sum()。
【例如】 求10~100之间的所有素数
public class Point {
public static boolean prime(int n){
for (int k = 2;k <= Math.sqrt(n);k++){
if (n % k ==0)
return false;
}
return true;
}
public static void main(String[] args) {
for (int m = 10; m <=100; m++){
if (prime(m))
System.out.println(m+",");
}
}
}
在这里不能将 prime()方法的static修饰符去掉,否则无法在main()方法中调用prime()方法。(静态不能访问非静态)
1.5this
this出现在类的实例方法或构造方法中,静态方法中不能用this。
this的用途:
- 在实例变量和局部变量名称相同时,用this作前缀来特定访问实例变量。如 this.实例变量
- 把当前对象的引用作为参数传递给另一个方法。如this.成员方法(参数)
- 在一个构造方法中调用同类的另一个构造方法,注意,用this调用构造方法的时候,该语句必须是方法体中的第一个语句。
【例如】Point类
public class Point{
private int x,y;
public Point(int x, int y1){//有参构造
this.x = x; //在这里this用于访问实例变量
this.y = y1; //也可以写y=y1
}
public Point(){//无参构造
this(0, 0)//在这里this用于调用有参构造,将0,0赋值给x,y。必须是方法内的第一个语句
}
public double distance(Point p){//求当前点与P点距离
return Math.sqrt((this.x-p.x))*(x-p.x)+(y-p.y)*(y-p.y)) ////在这里this用于访问实例变量,这里的this.可以不写。
}
public double distance2(Point p){//p到当前点的距离
return p.distance(this);//在这里this用于把当前对象作为参数传递给另一方法。这里this就是p
}
}
1.6使用包组织类
1.6.1Java API简介
Java系统提供的类库也称为Java API,它是系统提供的已实现的标准类的集合。根据功能不同,Java类库按其用途被划分为若干个不同的包,每个包都有若干个具有特定功能和关系的类和接口。
导包:
【例如】import java.util.Date;
1.6.2建立包
在默认情况下,系统会为每一个源文件创建创建一个无名包,这个源文件中定义的所有类都隶属于这个无名包。但是无名包中的类不能被其他包中的类引用(不知道包名),因此要尽量建立有名的包。
用关键字package来创建包。
1.6.3包的引用
用import语句加载整个包,用*代替类名,它便会加载保重所有类。如:import java.util.*;