Java基础第二遍-06-面向对象
面向对象
- 特点:
- 面向对象是一种常见的思想,符合人们的思考习惯
- 面向对象的出现,将复杂的问题简单化
- 面向对象的出现,让曾经在过程中的执行者,变成了对象中的指挥者
- 特征:
- 继承
- 封装
- 多态
- 对象的创建
- 通过new创建
类
- 对生活中的事物进行表示,在Java中是通过类来描述的
- 怎么描述呢?
- 通常只关注两点,一个是属性,一个是行为
- 对象是类的具体实现(实例)
- 成员变量就是属性,成员变量定义在类中
对象创建过程
成员变量和局部变量的区别
- 成员变量定义在类中,整个类中都可以访问
- 局部变量定义在方法、代码块、语句中,只有所属区域有效
- 成员变量存在于堆内存中
- 局部变量存在于栈内存中
- 成员变量随着对象的创建而存在,对象的消失而消失
- 局部变量随着所属区域的存在而存在,随着所属区域的消失而消失
- 成员变量会有默认初始化值
- 局部变量没有默认初始化值
匿名对象
- 创建:new Car();
- 匿名对象可以作为实际参数进行传递
封装(Encapsulation)
- 封装:隐藏对象的属性和实现细节,仅对外提供公共的访问方式
- 优点:
- 将变化隔离
- 便于使用
- 提高重用性
- 提高安全性
- 封装原则
- 将不需要对外提供的内容隐藏起来
- 将属性隐藏,对外提供公共方法进行访问(get set)已经形成规范
构造函数
- 特点
- 函数名与类名相同
- 不用定义返回值类型
- 没有具体的返回值
- 无参构造默认存在
- 如果手动创建了构造函数,那么默认的无参构造将不存在
- 只在对象创建的时候调用一次
- 可以使用void进行修饰 和 可以使用return进行结束
- 作用
- 给对象进行初始化(对象创建时,就会调用对应的构造函数)
- 注意
- 默认构造函数的特点
- 存在多个构造函数时是以重载的形式体现的
有参构造创建对象内存加载过程
关键字this
- this:代表当前对象,可以用于解决set方法设置属性成员变量和局部变量重名的情况,
- 官方说法:this是所在函数所属对象的引用
- this(name)相当于调用了Person(String name){this.name=name}---可以用于构造函数调用其他构造函数,但是只能定义在构造函数的第一行(因为初始化动作要先执行)
关键字static
- 用于修饰成员(成员变量,成员函数)
- 被修饰后的成员具有以下特点:
- 随着类的加载而加载
- 优先于对象存在
- 被所有对象共享
- 可以直接使用类名进行调用
- 注意
- 静态方法只能访问静态成员
- 静态方法中不能写this,super关键字(因为static于创建对象之前存在)
- 主函数是静态的
- static修饰的成员存在于内存的方法区中的静态方法区
静态变量与成员变量的区别
- 成员变量随着对象的创建而存在,对象的被回收而释放
- 静态变量随着类的加载而存在,随着类的消失而消失
- 成员变量只能被对象调用
- 静态变量可以使用对象和类名进行调用
- 成员变量别名:实例变量
- 静态变量:类变量
- 成员变量存在于堆内存的对象中,所以也叫对象的特有数据
- 静态变量数据存储在方法区中的静态方法区,所以也叫对象的共享数据
- 静态变量前面是类名,类名.静态变量
- 成员变量前面是this,this.成员变量
程序运行内存加载图解
什么时候使用静态修饰符
- 对于变量,不是对象特有的数据时 可以使用static进行修饰
- 对于函数,函数的执行不涉及对象特有的数据时,可以使用static进行修饰
静态代码块
- 定义:static{}
- 特点:随着类的加载而执行,只执行一次
构造代码块(类中)
- 随着对象的创建而加载,可以给所有的对象进行初始化
局部代码块(方法中)
- 用于固定局部变量的生命周期
私有构造函数
- 对于一个类中所有的类都为静态方法,那么就默认他不需要创建对象,可以将其构造函数进行私有化
文档注释
- @author
- @version 1.0
- @param
- @return
- 需要生成文档的类,需要使用public修饰符进行修饰
- 私有权限的方法生成文档的时候不会存在
单例设计模式
- 解决问题:类在内存中的对象唯一性
- 应用场景:必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性
- 自己创建一个静态的对象,并且私有化构造函数其他类创建对象的方式
class S{
private static S s = new S();
private S(){}
public static S getInstance(){
return s;//提供对外访问的方法 可以控制是否返回对象
}
}
- 单例模式-内存图解
- 单例设计模式实现的两种方式(饿汉式 懒汉式)
//单例设计模式---饿汉式
//类一加载对象就存在了
class S1{
private static S1 s1 = new S1();
private S1(){}
public static S1 getInstance(){
return s1;
}
}
//单例设计模式---懒汉式
//特点:类加载的时候不创建对象,调用getIntance方法的时候才创建对象
//多线程并发访问的时候可能会造成不能保证对象唯一性的情况
class S2{
private static S2 s2=null;
private S2(){}
public static S2 getInstance(){
if (s2==null)
s2=new S2();
return s2;
}
}