1.类的基本概念
三种比喻:①类 —— 概念 、对象 —— 具体、消息:调用对象的方法
②类 —— 图纸 对象 —— 产品
③类 —— 数据类型 对象 —— 变量
2.定义类
1)类的一般结构
类修饰符的含义 | |
修饰符 | 含义 |
public | 将一个类声明为公共类,它可以被任何对象访问 |
abstract |
将一个类声明为抽象类,它没有实现方法,需要子类提供方法实现, 所以不能创建该类的实例 |
final | 将一个类声明为最终类即非继承类,表示它不能被其他类所继承 |
缺省 | 缺省修饰符时,则表示只有在相同包中的对象才能使用这样的类 |
2)成员变量
含义:一个类的成员变量描述了该类的内部信息,一个成员变量可以是基本类型变量,也可以是对象、数组等其他引用型数据。
格式:[修饰符] 变量类型 变量名 [ = 初值];
成员变量修饰符的含义 | |
修饰符 | 含义 |
public | 公共访问控制符。指定该变量为公共的,它可以被任何对象的方法访问 |
private | 私有访问控制符。指定该变量只允许自己类的方法访问,其他任何类(包括子类)中的方法均不能访问此变量 |
protected | 保护访问控制符。指定该变量只可以被它自己的类或同一包中的其他子类或同一包中的其他类访问,在子类中可以覆盖此变量 |
缺省 | 缺省访问控制符时,则表示在同一个包中的类可以访问此成员变量,而其他包中的类不能访问该成员的变量 |
final | 最终修饰符。指定此变量的值不能改变 |
static | 静态修饰符。指定该变量被所有对象共享,即所有的实例都可使用该变量 |
transient | 过段修饰符。指定该变量是一个系统保留、暂无特别作用的临时性变量 |
volatile | 易失修饰符。指定该变量可以同时被几个线程控制和修改 |
3)成员方法
类的方法是用来定义对类的成员变量进行操作的,是实现类内部功能的机制,同时也是类与外界进行交互的重要窗口。
声明格式:
成员变量修饰符的含义 | |
修饰符 | 含义 |
public | 公共访问控制符。指定该变量为公共的,它可以被任何对象的方法访问 |
private | 私有访问控制符。指定该变量只允许自己类的方法访问,其他任何类(包括子类)中的方法均不能访问此变量 |
protected | 保护访问控制符。指定该变量只可以被它自己的类或同一包中的其他子类或同一包中的其他类访问,在子类中可以覆盖此变量 |
缺省 | 缺省访问控制符时,则表示在同一个包中的类可以访问此成员变量,而其他包中的类不能访问该成员的变量 |
final | 最终修饰符。指定此变量的值不能改变 |
static | 静态修饰符。指定该变量被所有对象共享,即所有的实例都可使用该变量 |
transient | 过段修饰符。指定该变量是一个系统保留、暂无特别作用的临时性变量 |
volatile | 易失修饰符。指定该变量可以同时被几个线程控制和修改 |
4)成员变量与局部变量的区别
①从语法形式上看,成员变量是属于类的,而局部变量是在方法中定义的变量或是在方法的参数;成员变量可以被public、private、static等修饰符
所修饰,而局部变量则不能被访问控制修饰符及static所修饰;成员变量和局部变量都可以被final所修饰。
②从变量在内存中的存储形式方式上看,成员变量是对象的一部分,而对象是存在于堆内存的,而局部变量是存在于栈内存的。
③从变量在内存中生存的时间上看,成员变量是对象的一部分,它随对象的创建而存在,而局部变量随着方法的调用而产生,随着方法调用结束而自动消失。
④成员变量如果没有被赋初值,则会自动以类型的默认值赋值(有一种情况例外,被final修饰但没有static修饰的成员变量必须显示地赋值);而局部变量则
不会自动赋值,必须显式地赋值后才能使用。
3.对象的创建与使用
1)创建对象:由于对象是类的实例,所以对象是属于某个已知的类,因此要创建属于某个类的对象,可通过以下两个步骤完成:
①声明指向“由类所创建的对象”的变量;
②利用 new 运算符创建新的对象,并指派给前面所创建的对象。
例如:
Cylinder volu; //声明指向对象的变量 voiu volu = new Cylinder //利用 new 创建新的对象,并让变量 volu 指向它
成员变量的初始值 | |
成员变量 | 初始值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0D |
char | '\u0000'(表示为空) |
boolean | false |
所有引用类型 | null |
2)对象的使用
①格式:对象名 . 对象成员
volu.radius = 2.8; //将对象volu的半径赋值为2.8 volu.height = 5; //把高赋值为5
例子:同时创建多个圆柱体类Cylinder的对象,并修改其中一个对象的成员变量 pi 的值。
class Cylinder { double radius; int height; double pi = 3.14; void area(){ System.out.print("底面积 = "+pi * radius * radius); } double volume() { return (pi * radius * radius) * height; } } public class { public static void main(String [] arges){ Cylinder volu1,volu2; volu1 = new Cylinder(); volu2 = new Cylinder(); volu1.radius = volu2.radius = 2.5; volu2.pi = 3; System.out.println("圆柱1底面半径 = "+volu1.radius); System.out.println("圆柱2底面半径 = "+volu2.radius); System.out.println("圆柱1的 pi 值 = "+volu1.pi); System.out.println("圆柱2的 pi 值 = "+volu2.pi); System.out.println("圆柱1"); volu1.area(); System.out,print("圆柱2"); volu2.area(); } }
3)在类定义内调用方法
以圆柱体类Cyinder 为例来介绍在类内部调用自己的方法
class Cylinder{ //定义Cylinder类 double radius; int height; double pi = 3.14; double area(){ //定义返回值为double型的方法area(),计算底面积 return pi * radius * radius; } double volume(){ //定义返回值为double型的方法volume(),计算体积 return area() * height; //在类内调用area()方法 } } public class{ //定义公共类 public static void main(String[] args) Cylinder volu; volu = new Cylinder(); //创建新的对象 volu.radius = 2.8; //赋值圆柱 volu 的底半径 volu.height = 5; //1赋值圆柱 volu 的高 System.out.println("底面半径 = "+volu.radius); System.out.println("圆柱的高 = "+volu.height); System.out.print(“圆柱”); System.out.println("底面积 = "+volu.area()); System.out.println("圆柱体体积 = "+volu.volume()); } 运行结果: 底面半径 = 2.8; 圆柱的高 = 5; 圆柱底面积 = 24.6176; 圆柱体体积 = 123.088;
注意: 成员通过对象来访问,类内使用 this 访问
4)参数的传递
①以变量为参数调用
调用方法:a.函数名、实参(实赋形);b.转去执行函数体;c.返回
以圆柱体类Cylinder 为例来介绍用变量调用方法
class Cylinder{ double radius; int height; double pi; void setCylinder(double r,int h,double p){ pi = p; radius = r; height = h; } double area(){ return pi * radius * radius; } double volume(){ return area() * height; } } public class{ public static void main(String[] args){ Cylinder volu = new Cylinder(); volu.setCylinder(2.5,3.14); System.out.println("底面半径 = "+volu.radius); System.out.println("底面半径 = "+volu.height); System.out.println("圆周率pi = "+volu.pi); System.out.print("圆柱"+); System.out.println("底面积 = "+volu.area()); System.out.println("圆柱体体积= "+volu.volume()); } } 底面半径 = 2.5; 圆柱的高 = 5; 圆周率pi = 3.14; 圆柱底面积 = 19.625; 圆柱体体积 = 98.125;
注意:setCylinder()的方法中参数变量 r 、 h 和 p均是局部变量,它们的作用范围仅限于setCylinder()方法内部。一旦离开此方法,它们就会失去作用。
说明:若通过方法调用,将外部传入的参数赋值给类的成员变量,方法的形式参数与类的成员变量同名时,则需用 this 关键字来标识成员变量。如例子
中的方法setCylinder().
class Cylinder{ double radius; . . . void setCylinder(double radius){ radius = radius; } . . . }
4)以数组作为参数或返回值的方法调用
a.传递数组
public class{ //定义主类 public ststic void main(String[] args){ int [] a={8,3,7,88,9,23}; //定义一个一维数组a LeastNumb minNumber = new LeastNumb(); minNumber.least(a); //将一维数组 a 传入 least()方法 } } class LeastNumb{ //定义另一个类 public void least (int [] arry){ //参数array接收一维整型数组 int temp = array[0]; for(int i=1;i<arry.lenght;i++){ if(temp>array[i]) temp = array[i]; System.out.println("最小的数为:"+temp); } } } 运行结果: 最小的数为:3
b.返回值为数组类型的方法
例子:将一个矩阵转置后输出
public class{ public static void main(String[] args){ int [][] a ={{1,2,3,},{4,5,6},{7,8,9}}; //定义二维数组 int [][] b = new int[3][3]; Trans pose = new Trans; //创建Trans类的对象 pose b = pose.transpose(a); //用数组 a 调用方法,返回值赋给数组 for(int i = 0;i<b.lenght;i++){ //输出数组的内容 for(int j = 0;j<b[i].lenght;j++) System.out.print(b[i][j]+" "); System.out.print("\n"); } } } class Trans{ int temp; int [] []transpose(int [] [] array){ //返回值和参数均为二维整型数组的方法 for(int i = 0;i<b.lenght;i++){ //矩阵转置 for(int j = 0;j<b[i].lenght;j++){ temp = array[i][j]; //将二维数组的行与列互换 array[i][j] = array[i][j]; array[j][i] = temp; } temp array; //返回二维数组 } 运行结果: 1 4 7 2 5 8 3 6 9 }
5)匿名对象
当一个对象被建立之后,在调用该对象的方法时,也可以不定义对象的引用变量,而直接调用这个对象的方法,这样的对象成为匿名对象。
Cylinder volu = new Cylinder(); volu.setCylinder(2.5,5,3.14); 改写为: new Cylinder().setCylinder{2.5,5,3.14}; //new.Cylinder().setCylinder(2.5,5,3.14)就是匿名对象
使用匿名对象通常有两种情况:
①如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
②将匿名对象作为实参传递给一个方法调用。如有一个程序中有一个getSomeOne方法要接收一个MyClass类对象作为参数。
public static void getSomeOne(MyClass c){ } 可用以下方法调用: getSomeOne(new MyClass ())