2021-04-06 类基础

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接口

总的来说,创建一个类时可以包含以下:

  1. public, private等修饰符
  2. 类名
  3. 父类名以及extends
  4. 接口名,可以实现多个接口(使用逗号隔开)
  5. 类的主体

创建类内变量

一般来说,有三种变量,

  1. 方法内的变量 - local variable 本地变量
  2. 方法声明内的变量 - parameters 参量
  3. 类内的变量 - filed 域

比如在上篇文章内创建的Bicycle类,便创建了三个域

public int cadence = 0;
public int speed = 0;
public int gear = 1;

而创建域时,包含以下内容:

  1. 修饰符(不必须) public,private等
  2. 域的类型
  3. 域名

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个部分:

  1. 修饰符private, public
  2. 返回值或不返回,使用void关键词来声明没有返回值
  3. 方法名
  4. 参量,使用逗号隔开,并带有类型 e,g. int number
  5. 例外列表 exception list
  6. 方法主体

方法签名
方法的签名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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值