Java-4-class

Introduction

在面向对象编程里面, 类是一个很重要的概念,它可以用来抽象化事物的特性并封装到一个类,就比如猫这个类可以有像是颜色,年龄等等特点以及像是跑,跳等行为动作。 在类里面我们可以把它的特点描述成class member参数而动作等可以描述成函数/方法。
而面向对象的编程主要有3个特性:

  • 封装性: 即把一个对象的所以特性都抽象化参数化并用一个类去描述
  • 继承: 一个类可以从另外一个类里面继承得到一些特征和函数,像是猫这类可以继承哺乳动物这类的一些特征,比如体温恒温,有四肢等。 通俗来说就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
  • 多态: 多态是指同一个行为具有多个不同表现形式或形态的能力,同一个接口,使用不同的实例而执行不同操作

    Java OOD

    Class Member and Object

Class Method

Constructor

在类中除了成员方法之外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。构造方法的特点如下∶

  • 构造方法没有返回类型,也不能定义为void。
  • 构造方法的名称要与本类的名称相同。
  • 构造方法的主要作用是完成对象的初始化工作,它能把定义对象的参数传给对象成员。
  • public 修饰时是可以让构造函数在对象创建时被调用

例子:

1
2
3
4
5
public class Bird{
public Bird(){

}
}

另外也可以将构建函数设计成有输入参数,并对成员变量进行初始化。

1
2
3
4
5
class Book {
public Bird(int args){ //有参构造方法
//对成员变量进行初始化
}
}

keywords

在面向对象编程里面,有些关键词也是很重要的

  • this

    • 在类对象里面, this 关键词代指目前这个实例对象本身,然后在method里面可以通过this关键词去调用这个对象的参数. 当使用 this.var = … 来给类参数赋值,就是对类的成员对象进行赋值。如果没有this,只是var=… 那么就只是给一个变量进行赋值而不是成员变量赋值

    • 其实,this关键字除了可以调用成员变量或成员方法之外,还可以作为方法的返回值。例如,在项目中创建一个类文件,在该类中定义Book类型的方法,并通过过this关键字进行返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BorrowABook2 { // 创建借书类
String name; // 属性:书名
public BorrowABook2(String name) { // 参数为name的构造方法
this.name = name; // 将参数name的值付给属性name
}
public void borrow() { // 借书方法
System.out.println("请前往借阅登记处领取" + name + "。"); // 输出借出的书名
}
public static void main(String[] args) {
// 创建参数为“《战争与和平》”的借书类对象,
BorrowABook2 book = new BorrowABook2("《战争与和平》");
book.borrow(); // 调用借书方法
}
}
1
2
3
4
5
6
7
// 通过this返回book的引用
//之后用返回的引用对book进行操作
public class Book{
public getBook(){
return this; //返回Book类引用
}
}
  • static
    很多时候,不同的类之间需要对同一个变量进行操作,比如一个水池,同时打开入水口和出水口,进水和出水这两个动作会同时影响到水池中的水量,此时水池中的水量就可以认为是一个共享的变量。在Java程序中,如果把共享的变量用static修饰,那么该变量就是静态变量。

Static Method

  1. Static method
    如果想要使用类中的成员方法,需要先将这个类进行实例化,但有些时候不想或者无法创建类的对象时,还要调用类中的方法才能够完成业务逻辑,这种情况下就可以使用静态方法.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Pool { // 创建水池类
public static int water = 0; // 初始化静态变量之水池中的水量为0
public static void outlet() { // 放水,一次放出2个单位
if (water >= 2) { // 如果水池中的水量大于等于2个单位
water = water - 2; // 放出2个单位的水
} else { // 如果水池中的水量小于2个单位
water = 0; // 水池中的水量为0
}
}
public static void inlet() { // 注水,一次注入3个单位
water = water + 3; // 注入3个单位的水
}
public static void main(String[] args) {
System.out.println("水池的水量:" + Pool.water); // 输出水池当前水量
System.out.println("水池注水两次。");
Pool2.inlet(); // 调用静态的注水方法
Pool2.inlet(); // 调用静态的注水方法
System.out.println("水池的水量:" + Pool.water); // 输出水池当前水量
System.out.println("水池放水一次。");
Pool2.outlet(); // 调用静态的放水方法
System.out.println("水池的水量:" + Pool.water); // 输出水池当前水量
}
}
  1. Static block
    1
    2
    3
    4
    public class StaticTest { 
    static {// 此处编辑执行语句
    }
    }

Main Method

主方法是类的入口点,它指定了程序从何处开始,提供对程序流向的控制。Java编译器通过主方法来执行程序。

主方法的语法如下∶

1
2
3
public static void main(String[] args){
// 方法体
}

在主方法的定义中可以看到主方法具有以下特性∶

  • 主方法是静态的,所以如要直接在主方法中调用其他方法,则该方法必须也是静态的。
  • 主方法没有返回值。和C/C++一样。
  • 主方法的形参为数组。其中 args[0]~args[n] 分别代表程序的第一个参数到第n+1个参数,可以使用 args.length 获取参数的个数。

Coding Practice

  • 练习1:设计加油站类和汽车类,加油站提供一个给车加油的方法,参数为剩余汽油数量。每次执行加油方法,汽车的剩余汽油数量都会加 2。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Car{
    public Car(){
    this.remaining_gas =0
    }
    }

    class GasStation{
    public GasStation(){}
    public void charge(Car c){
    c.remaining_gas += 2;
    }
    }
  • 练习2:智能手机的默认语言为英文。,但制造手机时可以将默认语言设置为中文。编写手机类, 无,参构造方法使用默认语言设计,利用有参构造方法修改手机的默认语言。

    1
    2
    3
    4
    5
    6
    class SmartPhone{
    String language = "Chinese";
    public SmartPhone(){
    this.language = "English";
    }
    }
  • 练习3:张三去KFC买可乐,商家默认不加冰块。但是张三可以要求加 3 个冰块。请利用有参构造方法实现上述功能。

    1
    2
    3
    4
    5
    6
    class Cola{
    int ice_cube = 0;
    public Cola(int num){
    this.ice_cube = num;
    }
    }
  • 练习4:创建教师类,类中有姓名、性别和年龄三个属性,在构造方法中使用 this 关键字分别为这三个成员属性赋值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Enum  Gender {Male, Female};
    class Teacher{
    String name;
    int age;
    Gender gender;
    public Teacher(String name, int age, Gender g){
    this.name = name;
    this.age = age;
    this.gender = g;

    }
    }
  • 练习5:一只大熊猫,长 1.3 米,重 90千克。在自定义方法中使用this关键字调用类的成员变量并在控制台输出这只大熊猫的信息。

    1
    2
    3
    4
    5
    6
    7
    class Panda{
    double tall = 1.3; // meter
    double weight = 90; //kg
    void printInfo(){
    System.out.println("Panda info: Tall: "+ this.tall + " weight: "+this.weight);
    }
    }
  • 练习6:创建信用卡类,有两个成员变量分别是卡号和密码,如果用户开户时没有设置初始密码,则使用”123456”作为默认密码。设计两个不同的构造方法,分别用于用户设置密码和用户未设置密码两种构造场景。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class CreditCard{
    int password;
    public CreditCard(){
    this.password = "123456";
    }
    public CreditCard(String pw){
    this.password = pw;
    }
    }

Reference

[1] Datawhale: https://github.com/datawhalechina/team-learning-program/blob/master/Java/5.%E7%B1%BB%E4%B8%8E%E6%96%B9%E6%B3%95.md

[2] Runoob教程: https://www.runoob.com/java/java-inheritance.html
[3] Java tutorial: https://www.liaoxuefeng.com/wiki/1022910821149312/1023442583285984

Comments