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.作为实参传递给一个方法调用
构造方法(constructor)
在创建对象时给对象进行初始化操作
// 构造方法的结构
public 类名(参数) { 方法体 }
类中若没有写任何构造方法时, java会自动添加一个缺省的构造方法(无参构造方法, 与所属类的修饰符一样)
若存在任意构造方法时, java将不会再自动添加缺省构造方法
特点:
1.需要与类名相同
2.不能被修饰词修饰
3.不能声明返回值类型, 不能有return语句
4.不可以像普通方法一样随意调用
5.构造方法可以重载
在上面的Phone类中添加构造方法
// 无参构造方法, 最重要的构造方法
public Phone() {
// 构造器的连环调用, 使用this(参数1...);
// 调用全参构造, this必须放在有效代码的第一行
this("xiaomi", 1999.0, "black");
System.out.println("Phone对象创建中...");
}
// 有参构造方法
// 当构造方法的参数与本类的所有属性一致并为所有的成员变量进行赋值,称其为满(全)参构造
public Phone(String brand, double price, String color) {
this.brand = brand;
this.price = price;
this.color = color;
}
JavaBean
JavaBean是指符合如下标准的Java类:
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的geter和setter方法
import
import的作用是把其他包中的类导入进来
import 包名.类名
不进行import时需要使用全路径访问
// System 是 java.lang 包下的类
// java.lang 和 同一个包下的类的不需要使用全路径
java.util.Scanner s = java.util.Scanner(System.in);
使用全路径访问交麻烦,使用import如下
import java.util.Scanner;
Scanner s = new Scanner(System.in);
注意:
若在一个类中使用不同包下 相同类名的类 仅有一个可以进行导包, 另一个只能使用全路径访问