2021-04-06
Declare(创建)类
创建一个类的语法为:
class MyClass {
// field, constructor, and
// method declarations
}
在类的主体内含有对象的域(或变量),constructor(用于初始化类的对象)和方法。而这所有的加起来便是宣告了一个类 class declartion
创建类的子类的方法为:
class MyClass extends MySuperClass implements YourInterface {
// field, constructor, and
// method declarations
}
以上代码创建了MyClass
做为MySuperClass
的子类,并实现了YourInterface
接口
总的来说,创建一个类时可以包含以下:
- public, private等修饰符
- 类名
- 父类名以及extends
- 接口名,可以实现多个接口(使用逗号隔开)
- 类的主体
创建类内变量
一般来说,有三种变量,
- 方法内的变量 - local variable 本地变量
- 方法声明内的变量 - parameters 参量
- 类内的变量 - filed 域
比如在上篇文章内创建的Bicycle类,便创建了三个域
public int cadence = 0;
public int speed = 0;
public int gear = 1;
而创建域时,包含以下内容:
- 修饰符(不必须) public,private等
- 域的类型
- 域名
Public Private 修饰符
当创建域时,若使用public
修饰符声明,将会使创建的域在任何类内均可访问, 而使用private
修饰符时则会使域仅在当前类内访问
一般来说,为了封装encapsulation的目的,会将域声明为private。而需要其值时,可以使用其他方式(比如写一个public method)
例:
public class Bicycle {
private int cadence; //declaring fields
private int gear;
private int speed;
public Bicycle(int startCadence, int startSpeed, int startGear) //constructor{
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
public int getCadence() {//method
return cadence;
}
public void setCadence(int newValue) {
cadence = newValue;
}
public int getGear() {
return gear;
}
public void setGear(int newValue) {
gear = newValue;
}
public int getSpeed() {
return speed;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
}
命名
一般来说,命名变量时,一般首字母不写,而后面的每一个单词首字母大写,例:gearRatio
, currentAge
若储存的为固定值并且不再变化,则将所有单词大写,使用下划线隔开 NUM_GEARS
, INITIAL_PRICE
创建方法
常见的方法声明:
public double calculateAnswer(double grossDomesticProduct, int population,
double averageIncome, double grossNationalProduct) {
//do the calculations here
}
总的来说,声明一个方法包含6个部分:
- 修饰符
private
,public
- 返回值或不返回,使用
void
关键词来声明没有返回值 - 方法名
- 参量,使用逗号隔开,并带有类型 e,g.
int number
- 例外列表 exception list
- 方法主体
方法签名
方法的签名signature为方法名加上参量类型,之前的method签名便为:
calculateAnswer(double, int, double, int)
命名
命名方法和命名变量类似,但是命名方法时,将由小写动词开始
eat
, eatUntillFull
,setVariable
方法重载Overloading Methods
在一个类内,其实可以创建多个同名的方法,前提为他们的方法签名不同。
public class DataArtist {
...
public void draw(String s) {
...
}
public void draw(int i) {
...
}
public void draw(double f) {
...
}
public void draw(int i, double f) {
...
}
}
比如在上面的类,写了四个名字为draw的方法,但是每一个draw的签名都不同,所以在使用draw方法时,java会判断传入的参量签名,并使用相对应的方法内。
不建议经常使用重载,因为会使得代码可读性降低
Constructor 构造函数
在前文提到过,创建类时需要一个构造函数constructor。而构造函数则是用于创建并初始化实例的, 语法如下:
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
若想要创建并初始化一个Bicycle类的实例名为myBike,语法如下
Bicycle myBike = new Bicycle(30, 0, 8);
构造函数也可以不带任何参量,如
public Bicycle() {
gear = 1;
cadence = 10;
speed = 0;
}
于是便可以直接初始化实例如Bicycle yourBike = new Bicycle()
在一个类内,可以有多个构造函数(类似方法重载),但是参数列表不能相同。
当然,也可以不提供任何构造函数,对于无构造函数的类,编译器会自动创建一个默认的构造函数(无参量)。而当该类的父类需要一个无参量的构造函数。详见https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
与变量方法相同,构造函数也可以使用修饰符来声明。若private则其他类不能使用来创建实例。
将信息传入方法,构造函数内
当创建一个类时,构造函数括号内的变量被称为参量 parameter,而参量可以被传入构造函数或者方法内。参量的类型可以是主数据类型,对象和数组等等
例:
public double computeSum(
double num1,
double num2,
double num3){
answer = num1 + num2 + num3;
return answer;
}
可变参数
当想传入不定量的参量时,可以使用varargs,可变参量。将最后一个参量以 类型... 参量名
来指定不定参量,而该参量将会在方法或构造函数内以数组方式处理
public Polygon polygonFrom(Point... corners) {
int numberOfSides = corners.length;
double squareOfSide1, lengthOfSide1;
squareOfSide1 = (corners[1].x - corners[0].x)
* (corners[1].x - corners[0].x)
+ (corners[1].y - corners[0].y)
* (corners[1].y - corners[0].y);
lengthOfSide1 = Math.sqrt(squareOfSide1);
// more method body code follows that creates and returns a
// polygon connecting the Points
}
而使用可变参数时,可以传入数组或者不定量数据
Reference
https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html