类与对象的概念
类 (Class) 和对象 (Object) 是面向对象程序设计方法中最核心的概念。
类是对某一类事物的描述(共性),是抽象的、概念上的定义;而对象则是实际存在的属该类事物的具体的个体(个性),因而也称为实例(Instance) 。所谓“道生一,生万物”,所谓类就是“道”,其“万物”为对象。
面向对象程序设计思想的重点是类的设计,而不是对象的设计。
类的构成
类主要由数据成员(属性,Field)与函数成员(方法,Method)封装而成。
如下抽象定义:
[类修饰符] class 类名称
{
[修饰符] 数据类型 属性名;// 属性
[修饰符] 类名称 (形参列表) {…} // 构造方法
[修饰符] 返回值类型 方法名(形参列表){…} // 方法
}
定义类的语法格式
定义类
类修饰符可以是 public、abstract、final,类修饰符也可以省略
类名只要是合法的标识符即可(推荐驼峰规则)
类体可以由属性、方法、构造方法组成
属性的语法格式
定义属性:
语法格式:[修饰符] 属性类型 属性名 [= 默认值];
修饰符包括:public、private、protected、final、static 等
属性类型可以是基本数据类型或者引用数据类型
属性名遵守驼峰规则(第一个单词首字母小写,后面每个单词首字母大写)
默认值可以是基本数据类型字面值,也可以是对象
用 static 关键字修饰的属性被称为类属性,否则被称为实例属性
方法的语法格式
定义方法
语法格式:[修饰符] 返回值类型 方法名(形参列表) {方法体}
方法的修饰符可以是 public、protected、private、static、final、abstract 等
方法名推荐用驼峰规则(同属性)
返回值类型可以是基本类型或引用类型。如果无返回值,要用 void 来声明
形参列表,可以由零个或多个组成,彼此用逗号(“,”)隔开
用 static 关键字修饰的方法被称为类方法,否则被称为实例方法
构造方法的语法格式
构造方法
语法格式:[修饰符] 类名(形参列表) {构造方法体}
修饰符可以是 public、protected、private
构造方法名必须和类名相同
构造方法没有返回值
如果程序员没有为 Java 类提供任何构造方法,则系统会默认为这个类提供一个无参的构造方法,一旦程序员提供了自定义的构造方法,则系统不再提供默认的构造器
例子:
定义圆柱体类型
class Cylinder{ //定义圆柱体类 Cylinder
private double radius; //声明属性 radius
private double height; //声明属性 height
private double pi=3.14; //声明属性 pi 并赋初值
public Cylinder(){ // 构造方法
radius = 1.0;
height = 1.0;
}
public double area( ) { //定义方法 area(),用来计算底面积
return pi*radius* radius;
}
public double volume( ) { //定义方法 volume(),用来计算体积
return (pi*radius* radius)*height;
}
}
UML 图
UML 图 (Unified Modeling Language Diagram,UML) 称为统一建模语言或标准建模语言,是一个支持模型化和软件系统开发的图形化语言。
例子:定义一个圆柱体类 Cylinder,并创建相应对象,然后计算圆柱体的底面积和体积
// 定义一个圆柱体类 Cylinder,并创建相应对象,然后计算圆柱体的底面积和体积
class Cylinder {
double r;
double h;
double dimMianJi() {
return r * r * Math.PI;
}
double tiJi() {
return dimMianJi() * h;
}
}
public class App {
public static void main(String[] args) {
Cylinder Cylinder = new Cylinder();
Cylinder.r = 2.8;
Cylinder.h = 5;
System.out.println("Area: " + Cylinder.dimMianJi());
System.out.println("Volume: " + Cylinder.tiJi());
}
}
对象的产生和使用
创建对象(实例)的方法:new 操作符
语法格式:类名 x = new 类名(实参列表)
x 是一个引用,关联到对象 new 类名(实参列表)
对于实例属性和实例方法,只能通过对象来调用
调用方式:x.实例属性名,x.实例方法名(实参列表)
对于静态属性和静态方法,即可以通过类调用,也可以通过对象调用
调用方式1:类名.静态属性名,类名.静态方法名(实参列表)
调用方式2:x.静态属性名,x.静态方法名(实参列表)
例子:同时创建多个圆柱体的实例
class Cylinder {
double r;
double h;
double dimMianJi() {
return r * r * Math.PI;
}
double tiJi() {
return dimMianJi() * h;
}
}
public class App {
public static void main(String[] args) throws Exception {
Cylinder c1 = new Cylinder();
Cylinder c2 = new Cylinder();
c1.h = 1;
c1.r = 2;
c2.h = 3;
c2.r = 4;
System.out.println("c1.r = " + c1.r);
System.out.println("c2.h = " + c2.h);
}
}
this 引用
每个实例方法和构造方法中均包含一个隐含形参:this 引用
this 引用指向当前对象,三种应用场景
第一,访问实例方法或实例属性,尤其是当形参与实例属性同名是,用 this 引用来区分形参和实例属性(this.实例属性名 = 形参名)// Cylinder(double radius, double height) {this.radius = radius; this.height = height;}
第二,返回当前对象:return this;
第三,调用其他构造方法:this(其他构造方法的形参列表)
static 方法中没有 this 引用
实例方法可以直接调用其他的实例方法,也可以调用其他的静态方法
例子:
public class App {
double r;
double h;
public App setr(double r) {
this.r = r;
return this;
}
public App seth(double h) {
this.h = h;
return this;
}
public void setdh(double r, double h) {
seth(h).setr(r);
}
public static void main(String[] args) throws Exception {
App a = new App();
a.setdh(2, 3);
System.out.println(a.h + " " + a.r);
}
}
方法扩展
方法的所属性
方法不能独立定义,必须定义在类中
方法不能独立执行:静态方法可以用类或者对象调用,实例方法只能用对象调用
方法的参数传递机制:值传递:基本数据类型,引用传递:引用类型
数组作为形参,数组作为返回值例子:
找数组最小值
public class App {
public static int min(int[] nums) {
int result = nums[0];
for (int i = 1; i < nums.length; i++) {
if (result > nums[i])
result = nums[i];
}
return result;
}
public static void main(String[] args) throws Exception {
int[] a = new int[] { 1, 2, 3, 4, 5 };
System.out.println("min = " + min(a));
}
}
数组作为返回值:将一个矩阵转置后输出
public class App {
static void daying(int[][] a) {
for (int[] row : a) {
for (int shu : row) {
System.out.print(shu + "\t");
}
System.out.println();
}
}
static int[][] diaohuan(int[][] b) {
int[][] result = new int[b[0].length][b.length];// 注意行列的数量
for (int i = 0; i < b.length; i++) {
for (int j = 0; j < b[0].length; j++) {
result[j][i] = b[i][j];
}
}
return result;
}
public static void main(String[] args) {
int[][] mat = new int[][] { { 1, 2, 3 }, { 4, 5, 6 } };
daying(mat);
System.out.println();
daying(diaohuan(mat));
}
}
可变形参
定义方法时,在最后一个形参的类型后增加三点“…”(String… strs),多个参数值被当成数组存入strs中。
递归调用:在方法中调用自己
属性扩展
成员变量(属性):在类范围里定义的变量;
局部变量:在方法或者代码块内部定义的变量。
不管是成员变量还是局部变量都遵守相同的命名规则(驼峰规则)。
成员变量分为类成员变量(类属性)和实例成员变量(实例属性)。类属性被所有对象共享,实例属性属于特定的对象
当类被加载时,类成员变量就在内存中分配一块内存空间
当对象被创建时,实例成员就在内存中分配一段内存空间
访问方法:实例变量只能通过实例来访问;类变量既可以通过实例访问,也可以通过类访问
局部变量可分为三种:① 形参② 方法局部变量③ 代码块局部变量
除了形参外,其他局部变量都必须显式地初始化
Java 里允许局部变量和成员变量重名。这时需要用 this 引用或者类名来区分两者。
局部变量仅在方法或者代码块内有效
当方法执行完成时,局部变量会自动销毁。