Java面向对象

面向对象(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.作为实参传递给一个方法调用