- 整理了一些Java面向对象的笔记,记录在这里 @Zeii
构造方法
构造方法是创建对象时,自动调用的方法
语法:
public 类名(){
}
- 构造方法没有返回类型,名字与类名相同
- 使用new创建对象时,会自动调用
public class Car {
// 成员变量
String color;
int speed;
int seats = 5;
// 构造方法,创建对象时自动调用
// 系统默认给一个无参的构造方法
// 当你创建了自己的构造方法时,会将系统的构造方法覆盖掉
public Car(String color, int speed) {
this.color = color;
this.speed = speed;
}
// 成员方法
public void run() {
System.out.println("跑起来了");
System.out.println(this.color);
System.out.println(this.speed);
System.out.println(this.seats);
}
public static void main(String[] args) {
Car c = new Car("红色", 180);
// c.color = "红色";
// c.speed = 120;
// c.seats = 5;
c.run();
}
}
构造方法的作用:在创建对象时,对对象成员变量进行初始化
构造方法的重载
重载:类的方法名相同,参数不同,称为重载
构造方法也可以重载,即写多个参数不同的构造方法,很实用,用于创建不同的对象
public Car(String color, int speed){
this.color = color;
this.speed = speed;
}
// 构造方法重载
public Car(String color, String name, int speed){
this.color = color;
this.name = name;
this.speed = speed;
}
注意
两个构造方法中,都有color和speed属性,代码有重复。这种情况可以在第二个构造方法中使用this,调用第一个构造函数对相同的成员变量进行赋值。
public Car(String color, int speed){
this.color = color;
this.speed = speed;
}
// 构造方法重载
public Car(String color, String name, int speed){
this(color, speed); // 调用被重载的构造方法
this.name = name;
}
这时的this不再是调用对象的成员变量,而是调用构造方法
注意this的用法是this(); 而不是this.color
访问权限
- public, 公共的,所有人都可以访问
- private, 私有的,只有在类内部可以访问
- default, 又叫friendly, 在同一个包内可以访问
- protected, 在同一包内或子类可以访问
-
注意
(1) 一个java文件里,只能有一个public类,这个类的类名必须与文件名相同,其他的类不能加public
(2)private变量或方法只能在类内部访问,一旦实例化对象后,对象无法访问或调用
成员变量初始值
Java中的变量必须先声明,赋值,才能使用。
对于类的成员变量,在创建对象时,所有成员变量首先会进行初始化,如果类中没有给出赋值,则系统默认:
- 基本数据类型初始为0。(boolean --> false)
- 引用数据类型(类)初始为null
小练习-对象之间的交互:模拟植物大战僵尸
Unit类
用来创建plant和zombie对象
成员变量 | 成员方法 |
---|---|
name | injure |
hp | – |
damage | – |
Client类
用于plant和zombie的交互
成员变量 | 成员方法 |
---|---|
– | fight |
把plant和zombie的战斗动作放在fight里完成,不要在plant或zombie的内部做,尽量减少类之间的耦合
- Unit
public class Unit {
// plant和zombie的成员变量和方法都是一样的,所以一个Unit类就够了
// 如果有不同,也可以从Unit类中分别继承
// 成员变量
String name;
int hp;
int damage;
//构造方法
public Unit(String name, int hp, int damage) {
this.name = name;
this.hp = hp;
this.damage = damage;
}
// 成员方法,只需要受伤就够了
public void injure(int damage) {
this.hp -= damage;
}
}
- Client
public class Client {
// 让fight的动作在Client中进行,而不是直接写在plant或zombie中
// 这样可以降低plant和zombie的耦合度,即数据与表现分离
// Unit单元只需要做出受到伤害后的动作即可,即减血
public static void fight(Unit plant, Unit zombie) {
zombie.injure(plant.damage);
System.out.println(plant.name+"揍了"+zombie.name+"一下");
System.out.println(zombie.name+"还有"+zombie.hp+"点血");
}
public static void main(String[] args) {
Unit plant = new Unit("豌豆", 100, 5);
Unit zombie = new Unit("梯子僵尸", 200, 10);
fight(plant, zombie);
fight(zombie, plant);
}
}