面向对象进阶02_03
面向对象进阶
1. 封装private
1.1. 目的
- 保护数据
1.2. 方式
- 权限修饰符private仅类内可见
- getter/setter对外可见
- setter设置接受修改条件
2. this
2.1. 作用
-
- 相当于指向本类的指针(C/C++)
-
- 调用类中的属性
- this.name
-
- 调用类中的方法(包括构造方法)
-
this.getName();
-
this(myName);
-
- 只能放在构造函数的第一个语句
-
- 不能与super同用
-
- 不能与另一个构造函数同用this(myName, myAge)
-
3. static
3.1. 内存方面
-
- 方法区的静态区
-
- 有且只有一份,所有对象公用,实现数据共享
-
- 不依赖对象,但依赖类
-
- 初始化时间点在对象之前
- 静态不能访问非静态,非静态可以访问静态
3.2. 使用方面
-
- static修饰的成员变量
- 在类加载时初始化
- 只能被静态方法访问,不能被普通方法或者对象访问
-
- static修饰的构造代码块
- 在构造器之前调用
-
- static修饰的方法
- 能被类或者对象调用,对象调用时报warning
-
- static修饰的内部类
- 不能访问非静态的成员函数
- 能访问final修饰的成员变量
- 不能访问普通成员变量
4. 代码块
4.1. 普通代码块
- 执行流程中出现的代码块
4.2. 构造代码块
- 在类中的成员代码块,在每个对象创建时构造方法之前执行
4.3. 静态代码块
- 在类中使用static修饰的成员代码块
- 相对于普通的构造代码块,在类加载时执行
- 每次程序启动到关闭,只会执行一次
4.4. 同步代码块
- 多线程
4.5. 执行顺序
- 静态代码块==》构造代码块==》构造方法
5. 包
5.1. 作用
-
- 方便类的查找和使用
- 功能相似或者相关的类或者接口组织在同一个包中
-
- 避免名字冲突
-
不同包中的类名字可以相同
- 同时调用不同包中相同名字的类时,需要加上包名加以区别
-
- 限定访问权限
- 拥有包访问权限的类才能访问某个包中的类
5.2. 使用规则
-
- java文件的首部必须编写类所属包
- package 包名;
-
- 命名规则
- 多个小写字母的单词组成
- 使用<.>隔开
- 一般命名为"com.公司名.项目名.模块名"
5.3. import关键字
- import 包名.类名;
6. 权限修饰符
public
- 全部可见
protected
- 包内/类内/子类可见
default
- 包内/类内可见
private
- 类内可见
修饰符 | 类 | 包 | 子类 | 其他包 |
---|---|---|---|---|
public | ∨ | ∨ | ∨ | ∨ |
protected | ∨ | ∨ | ∨ | × |
default | ∨ | ∨ | × | × |
private | ∨ | × | × | × |
7. main
1. public
- 表示公共部分,可以被所有操作调用
2. static
-
表示方法是静态的,可以由类名直接调用
- java StaticDemo09
3. void
- 表示没有任何的返回值操作
4. main
-
系统规定好的方法名称
-
写错了(相当于没有main方法)
- 报错:NoSuchMethodError: main
5. String[] args
- 接受参数的字符串数组
- 空格分隔
- 带空格的字符串使用双引号包含
8. 单例设计模式
8.1. 特点
- 保证程序在内存种只有一个对象存在(被程序所共享)
8.2. 共2种实现方式
-
- 懒汉式
- 随着类的加载在内存中对象为null
- 当调用getInstance方法时才创建对象(延迟加载)
class Single{
private Single(){}
private static Single s1 = null;
public static Single getInstance(){
if(s1 == null){
s1 = new Single();
}
return s1;
}
}
-
- 饿汉式
- 随着类的加载直接创建对象
- 推荐开发中使用
class Single2{
private Single2(){}
private static Single2 s = new Single2();
public static Single getInstance(){
return s;
}
void print(){
System.out.println("Hello World!");
}
}
8.3. 实现步骤
-
- 保证一个类只有一个实例
- 构造方法私有化
-
- 必须要自己创建这个实例
- 在本类种维护一个本类对象(私有,静态)
-
- 必须像整个程序提供这个实例
- 对外提供公共的访问方式(getInstance方法,静态)