面向对象
- 面向对象编程OOP:Object Oriented Programming
- 面向对象设计OOD:Object Oriented Design
- 面向对象技术OOT:Object Oriented Technology
面向对象基础概念
- 真实世界对象的两大共同特征:状态和行为
- 观察身边真实世界的物体(对象),问自己两个问题:
- 这个对象可能处于什么状态
- 这个对象可以执行什么可能的行为
- 编程中的对象与真实世界一样
- 状态:用变量表示存储
- 行为:用方法公开表达行为
什么是类
- 类是创建单个对象的蓝图(blueprint)
- 类是用来造对象的
- 用类的好处
- OOP 最基本构建模块,不同组件不同类,好划分,好维护,好更改
- 如何写一个类
- 类的名字
- 状态:用变量表示存储
- 行为:用方法公开表达行为
public class Car {
// 属性/字段/状态/成员变量 (静态数据) fields
int topSpeed;
String color;
int totalSeats;
// 方法(动态行为) method
void drive() {
System.out.println("Starting driving...");
}
void speedUp() {}
void speedDown() {}
String display(String context) {
return context;
}
public static void main(String[] args) {
// 创建对象(最常用)
Car car = new Car();
// 用对象(实例)变量调用
System.out.println("Top speed: " + car.topSpeed);
System.out.println("Color: " + car.color);
car.drive();
System.out.println(car.display("I love you!!!"));
}
}
构造器/构造函数(Constructor)
- 一个类至少有一个构造器,可以有多个构造器
- 名字必须和类名完全一样
- 可视为特殊方法,没有返回值
- 如果没有定义任何构造器,该类会自动生成一个默认无参构造器
- 无参构造器 V.S 有参数的构造器
- 无参构造器:
Car() { System.out.println("This is car constructor"); this.topSpeed = 200; this.color = "black"; this.totalSeats = 2; }- 有参构造器:
Car(String colorToSelect) { this.topSpeed = 150; this.color = colorToSelect; this.totalSeats = 4; } Car(int speed, int seats, String colorToSelect) { this.topSpeed = speed; this.color = colorToSelect; this.totalSeats = seats; } - 如果一个类定义了构造器并且这些构造器都有参数,那么不会生成默认无参构造器
尽量不要将方法放入构造器内,会影响运行性能
包(Package)
- 命名空间 ->
name space(本质:文件夹) - 把功能相似或相关的类或接口组织在同一个包中
- 在不同的包里可以用一样的名字
- 包有访问权限
重载(Overload)
- 只体现在方法上(方法重载和构造器重载)
- 方法名字一样,但参数列表不同
重点:只关注参数类型
// void speedUp()
void speedUp() {
System.out.println("speed 10");
}
// void speedUp(int)
void speedUp(int speedToUpdate) {
System.out.printf("speed %d\n", speedToUpdate);
}
// void speedUp(String)
void speedUp(String speed) {}
// void speedUp(String, int)
void speedUp(String speed, int speedToUpdate) {}
// void speedUp(int, String)
void speedUp(int speedToUpdate, String speed) {}
// void speedUp(int, int)
void speedUp(int currentSpeed, int speedToUpdate) {}
常量 Constant
- 用关键字
final来定义一个常量 - 常量被初始化后不能更改
- 常量命名一般用全部大写字母表示
- 在类中定义常量一般和
static一起使用 - 一般定义在类里,不定义在函数里
- 相关文章:(详解Java 中 static 的作用 - 知乎 (zhihu.com))
public class ConstantDemo {
static final int NUM = 100;
public static void main(String[] args) {
int num = 100;
System.out.println("num: " + num);
num = 1000;
System.out.println("num: " + num);
System.out.println("NUM: " + NUM);
}
}
static 关键字(属于类)
- static 属性和方法属于类,生命周期和类相同
- static 成员变量只有一份
- static 属性/方法可以被该类的所有对象实例共享使用
- static 方法不能调用非 static 方法,反过来可以
- 调用方法
- 属性:className.field
- 方法:className.method
public class StaticDemo {
int id;
static String name;
public StaticDemo(int id) {
this.id = id;
}
static void printInformation(String msg) {
System.out.println("Information: " + msg);
}
void printObjectInformation() {
System.out.println("Print this: " + this);
printInformation("Info");
}
public static void main(String[] args) {
StaticDemo demo1 = new StaticDemo(10);
printInformation("Welcome");
System.out.println("demo id1: " + demo1.id);
demo1.printObjectInformation();
StaticDemo demo2 = new StaticDemo(15);
printInformation("Goodbye");
System.out.println("demo id2: " + demo2.id);
demo2.printObjectInformation();
System.out.println("Static demo Name: " + name);
}
}
- 静态代码块:
// 静态代码块用于类的初始化
static {
name = "STATIC JAVA";
System.out.println("Init static demo with static block");
printInformation("hello");
String[] args = new String[1];
// main方法一样可以被静态代码块调用
main(args);
}
Import 关键字 - 导入类
-
要使用其他包的类,需用
import -
Java 默认导入
java.lang包下的所有类 -
难题:在一个类里面要用同名类则么办?
- 用
pacakage + className来表示
- 用
-
如何导入 static 相关
import static + 详细路径