import java.time.LocalDate;
/*
* 对象:
* 1 代码角度:new的一个实例,封装了特有的数据
* 2 数据角度:封装数据和逻辑的一种方式
* 3 现实角度:对象就是某一个具体的东西,一切皆对象
* 4 设计角度:从实际的实体中抽象出来某些属性的一种实体表示
*
* 封装:将一类实体的公共的属性和方法封装在一个类中,将属性私有化,通过get/set方法对类中数据进行访问,
* 尽可能少暴露类中数据给外部访问,保证安全性。
* 类:
* 概念:我们在思想上对某个事物/东西/的唯一性标识
* 对某个事物的一个界定(定义)
* 对客观事物描述的一个标准,一个模板
* 根据具体的事物/需求 抽象出来的属性特征
*
* 通过不同的属性,划分不同的类,通过不同的属性值,划分不同的个体
* 类是引用数据类型
*
* 属性分两种:
* 1 静态属性:类的行为和功能
* 2 动态属性:类对象的行为和功能
*
* 代码角度:类和对象都是保存数据的一种手段
*
* 类中可以包含如下(构成):
* 1 main:入口方法只要该类不是启动类,就可以没有
* 2 成员变量:每个对象共有的属性,属性值可以相同也可以不同
* 3 静态变量:每个对象共有的属性和值(保存在方法区)
* 4 局部变量:栈帧私有化,栈帧独享
* 5 成员方法
* 6 静态方法:静态方法可以使用对象调用,在编译阶段,会把对象引用变量转换成对应的类名去调用
* 7 构造方法
* 8 抽象方法
* 9 静态语句块
* 10 动态语句块
* 11 this
* 12 super
*
* 实例化:
* 类 变量 = new 构造方法(参数)
* 1 加载类到静态区
* 2 调用构造方法(栈内存压栈,开辟栈帧),在堆内存开辟空间
* 3 把对应类中的成员属性复制到内存中
* 4 再把堆内存地址赋值给栈内存栈内存变量
*
* 变量分类:
* 1 成员变量:每个对象共有的属性,属性值可以相同也可以不同,类中使用非static修饰
* 2 静态变量:每个对象共有的属性和值(保存在方法区),类中使用static修饰
* 3 局部变量:栈帧私有化,栈帧独享,是方法中声明的变量,作用域为当前方法
*
* 初始化时机: 静态变量:类加载阶段。 成员变量:创建对象时候(调用构造方法)
*
* 应用场景:
* 静态变量:类级别,所有对象共享,比如:一个静态变量 static int age=10 那么所有对象都有这个属性,并且值都是18
* 静态是对象共享数据,即使使用对象去访问,编译时也会转换成类名去访问,正在内存中只有一个副本
* 成员变量:对象和对象之间有相同的属性,但可能有不同的值,非对象共享,存在多个副本
*
* javaBean
* 成员变量私有化,只能在当前类中使用
* 有对应的getter/setter方法,是对外提供的公共方法,便于访问对应的变量
* 对应得构造方法
*
* java.lang.NullPointerException:
* 空指针异常,是运行时异常
* 当使用null值(空的引用)去访问成员属性时,出现空指针异常,即访问一个不存在的属性
*
* Java包机制
* 一般采用公司域名倒置来命名,避免包名冲突。通过包来体现封装性,提升代码的重用性和安全性,可以提高编码效率
*
* 权限修饰符(限定类的使用范围)
* private 私有化权限修饰符,除了当前类之外,都不能访问
* public 公共的权限修饰符,谁都能访问
* default(可不写) 同一类中和同包中使用
* protected 受保护的权限修饰符,要么同类,要么同包,要么有继承关系
*
* JVM特性:
* 跨平台、可移植性、面向对象、多线程、垃圾自动回收机制
* 垃圾:程序执行过程中,如果不再有引用指向这个对象,该对象被视为垃圾数据,等待被回收
* */
public class EmployeeTest {
public static void main(String[] args) {
// 实例化对象数组(创建一个Employee对象数组)
// 创建一个Employee引用类型变量数组(局部变量),取名为staff,保存的是堆内存对象的内存地址
Employee[] staff = new Employee[3];
// 对象数组初始化
staff[0] = new Employee("小明",7500,2015,9,12);
staff[1] = new Employee("小红",5000,2016,8,2);
staff[2] = new Employee("小芳",6000,2017,6,20);
// staff[0]: com.tianl.oop.core_java.Chapter04_ObjectAndClass.Employee@1b6d3586 是一个内存地址
System.out.println(staff[0]);
for (Employee e : staff) {
e.raiseSalary(10);
}
for (Employee e : staff) {
System.out.println("name:"+e.getName()+", salary:"+e.getSalary()+", hireDay:"+e.getHireDay());
}
}
}
class Employee{
// 默认值:整数为0,小数位0.0,字符为\u0000,引用为null,字符串也是引用类型
private String name;
private double salary;
private LocalDate hireDay;
// public Employee() {
// }
// 显示构造器
public Employee(String name, double salary, int year, int month, int day) {
this.name = name;
this.salary = salary;
this.hireDay = LocalDate.of(year,month,day);
}
// 获取私有属性
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public LocalDate getHireDay() {
return hireDay;
}
// 涨薪
public void raiseSalary(double byPercent){
double raise = salary * byPercent / 100;
salary += raise;
}
}
Java面向对象
最新推荐文章于 2022-03-07 11:35:54 发布