面向对象(OOP)和面向过程
OOP: Object Oriented Programming
面向过程: procedure oriented programing
两者都是一种思想, 面向对象是相对于面向过程而言的。面向过程强调的是功能行为; 面向对象则是将功能封装进对象,强调具备了功能的对象
面向过程的三大特征
- 封装(Encapsulation)
- 继承(Inheritance)
- 多态(Polymorphosm)
类和对象
类(class)和对象(Object)是面向对象的核心概念, 万事万物皆对象
类是对现实中一类事物的抽象描述,现实事物都具有属性和行为
类的成员变量描述事物的属性,类的成员方法描述事物的行为
对象则是实际存在的该类的一个个体, 是根据类的描述而创建出来的具体实例(instance)
定义类
public class Phone {
// 成员变量
String brand;
double price;
String color;
// 成员方法
public void call(){
// 方法中未定义变量时, 会在成员变量中寻找对应的变量
System.out.println(brand + " " + color + " " + price +"元的手机打电话了");
}
public void sms() {
System.out.println(brand + " " + color + " " + price +"元的手机发短信了");
}
}
创建对象
public class Demo {
public static void main(String[] args) {
// 创建对象, 依据是类模板
Phone p1 = new Phone();
Phone p2 = new Phone();
// 对象属性的访问, 对象.属性
p1.brand = "xiaomi";
p1.color = "blue";
p1.price = 1999.9;
// 对象方法的访问 对象.方法名(参数)
p1.call();
p1.sms();
// 每个对象都有自己的属性 且互不干扰
p2.brand = "huawei";
p2.color = "black";
p2.price = 2399.9;
p2.call();
p2.sms();
}
}
成员变量的默认值
JVM会自动对成员变量进行初始化
成员变量的默认值(隐式赋值)
int 0
double 0.0
char \u0000
boolean flase
引用类型 null
成员变量的显式赋值
public class Car {
String brand = "leinuo";
String color;
double price = 9999.9;
}
属性私有化
防止在其它类中对成员变量直接的修改, 对数据进行一定的保护, 此时可以使用修饰符private
public: 该属性可以被该类以外的方法访问
private: 被修饰的成员变量/方法仅可以在本类中访问
public class Phone {
// 成员变量
private String brand;
private double price;
private String color;
}
setter和getter
在本类中给添加新的方法, 用于间接的访问私有属性
// Phone Class
// 给属性赋值使用的方法被称为set方法, 有参无返回
// 可以在set方法中对值的合法性做判断, 从而保护数据
public void setPrice(double p) {
if (price < 0 || price > 30000) {
return ; // 提前弹栈
}
price = p;
}
// 获取属性值的方法被称为get方法, 无参有返回
public double getPrice() {
return price;
}
public void setBrand(String b) {
brand = b;
}
public String getBrand() {
return brand;
}
public String getColor() {
return color;
}
public void setColor(String c) {
color = c;
}
// Demo Class
Phone p1 = new Phone();
p1.setBrand("huawei");
p1.setColor("black");
p1.setPrice(2399.9);
System.out.println(p1.getBrand() + " " + p1.getColor() + " " + p1.getPrice());
在idea中可以使用alt+insert -> Getter and Setter快速创建getter和setter
关键字 – this
上面的代码中的形参 a、b、c 不易区分
若修改为与成员变量相同, 由于就近原则(优先访问距离最近的)会导致成员变量没有接收到值
public void setColor(String color) {
// 自己的值赋给自己
color = color;
}
则需要对成员变量和局部变量加以区分,使用this关键字
this表示对象, this.color就是对象的color属性
public void setColor(String color) {
this.color = color;
}
匿名对象
没有对象名的对象, 调用结束后空间会被立即回收
new Phone().call();
使用情况:
1.当一个对象只需要进行一次方法调用时;
2.作为实参传递给一个方法调用