Java-4-class
Introduction
在面向对象编程里面, 类是一个很重要的概念,它可以用来抽象化事物的特性并封装到一个类,就比如猫这个类可以有像是颜色,年龄等等特点以及像是跑,跳等行为动作。 在类里面我们可以把它的特点描述成class member参数而动作等可以描述成函数/方法。
而面向对象的编程主要有3个特性:
- 封装性: 即把一个对象的所以特性都抽象化参数化并用一个类去描述
- 继承: 一个类可以从另外一个类里面继承得到一些特征和函数,像是猫这类可以继承哺乳动物这类的一些特征,比如体温恒温,有四肢等。 通俗来说就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 多态: 多态是指同一个行为具有多个不同表现形式或形态的能力,同一个接口,使用不同的实例而执行不同操作
Java OOD
Class Member and Object
Class Method
Constructor
在类中除了成员方法之外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。构造方法的特点如下∶
- 构造方法没有返回类型,也不能定义为void。
- 构造方法的名称要与本类的名称相同。
- 构造方法的主要作用是完成对象的初始化工作,它能把定义对象的参数传给对象成员。
- public 修饰时是可以让构造函数在对象创建时被调用
例子:
1 | public class Bird{ |
另外也可以将构建函数设计成有输入参数,并对成员变量进行初始化。
1 | class Book { |
keywords
在面向对象编程里面,有些关键词也是很重要的
this
在类对象里面, this 关键词代指目前这个实例对象本身,然后在method里面可以通过this关键词去调用这个对象的参数. 当使用 this.var = … 来给类参数赋值,就是对类的成员对象进行赋值。如果没有this,只是var=… 那么就只是给一个变量进行赋值而不是成员变量赋值
其实,this关键字除了可以调用成员变量或成员方法之外,还可以作为方法的返回值。例如,在项目中创建一个类文件,在该类中定义Book类型的方法,并通过过this关键字进行返回。
1 | public class BorrowABook2 { // 创建借书类 |
1 | // 通过this返回book的引用 |
- static
很多时候,不同的类之间需要对同一个变量进行操作,比如一个水池,同时打开入水口和出水口,进水和出水这两个动作会同时影响到水池中的水量,此时水池中的水量就可以认为是一个共享的变量。在Java程序中,如果把共享的变量用static修饰,那么该变量就是静态变量。
Static Method
- Static method
如果想要使用类中的成员方法,需要先将这个类进行实例化,但有些时候不想或者无法创建类的对象时,还要调用类中的方法才能够完成业务逻辑,这种情况下就可以使用静态方法.
1 | public class Pool { // 创建水池类 |
- Static block
1
2
3
4public class StaticTest {
static {// 此处编辑执行语句
}
}
Main Method
主方法是类的入口点,它指定了程序从何处开始,提供对程序流向的控制。Java编译器通过主方法来执行程序。
主方法的语法如下∶
1 | 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
12class 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
6class SmartPhone{
String language = "Chinese";
public SmartPhone(){
this.language = "English";
}
}练习3:张三去KFC买可乐,商家默认不加冰块。但是张三可以要求加 3 个冰块。请利用有参构造方法实现上述功能。
1
2
3
4
5
6class 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
12Enum 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
7class 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
9class 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