Skip to content

Commit e6912a6

Browse files
committed
knowledge on oriented object
1 parent cc076ee commit e6912a6

5 files changed

Lines changed: 212 additions & 8 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
nas

languages/java/basic/JavaSE(一).md

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,29 @@ private final static Integer UER_NAME_LENGTH = "shadow".length();
122122

123123
所以推荐常量使用enum,不用整个再次编译(有待证实,没有部署图床,所以没写代码)
124124

125+
### 2.4 字面量与引用(JVM中有详细解释)
126+
127+
* 字面量(literal)
128+
129+
就是字面的意思,字面量是对int、float、double、boolean、char、String字符串和null的
130+
131+
```java
132+
int i = 1;把整数1赋值给int型变量i,整数1就是Java字面量,
133+
String s = "abc";//中的abc也是字面量。
134+
Object o = null;//null是字面量
135+
```
136+
137+
* 符号引用(Symbolic References)
138+
139+
* 类和接口的全限定名(Fully Qualified Name)
140+
* 字段的名称和描述符(Descriptor)
141+
* 方法的名称和描述符
142+
* 直接引用
143+
144+
* 直接指向目标的指针(比如,指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的指针)
145+
* 相对偏移量(比如,指向实例变量、实例方法的直接引用都是偏移量)
146+
* 一个能间接定位到目标的句柄
147+
125148
---
126149

127150
## 3 修饰符
@@ -231,6 +254,23 @@ abstract对于接口来说是多余的,一般不这么使用
231254

232255
在高并发与多线程中
233256

257+
3.5.5 this与super
258+
259+
* this指的是类创建的`实例对象`,即这个对象在堆上的`内存地址`,super是`父类的地址`,所以子类实例化时父类也会被实例化;
260+
* this是指对象而不是类,所以static修饰的方法或变量,不能被引用
261+
* 如果父类构造器是带有参数,那么子类的构造器必须显示的指明构造器的参数;如果父类是无参构造,则子类会自动调取父类构造器,不用指明super
262+
* 类的构造函数可以不写,但系统会给你默认是无参构造
263+
* 类的初始化顺序:
264+
265+
1. 父类静态成员和静态初始化块
266+
2. 子类静态成员和静态初始化块
267+
3. 父类实例成员和实例初始化块
268+
4. 父类构造方法
269+
5. 子类实例成员和实例初始化块
270+
6. 子类构造方法
271+
272+
---
273+
234274
## 4 运算符
235275

236276
### 4.1 关系运算符
@@ -245,7 +285,6 @@ abstract对于接口来说是多余的,一般不这么使用
245285
| 名称 ||| 异或 | 取反 | 左移 | 右移 | 无符号右移 |
246286
| 按位操作 | 都是1置1 | 都是0置0 | 不同置1 | 取反 | 5<<2左移两位,类似于乘法5*4 | 5>>2右移两位,除法 | 5>>>2,无符号右移两位 |
247287

248-
249288
* ">>>"
250289

251290
无符号右移,移动之后由0填充
@@ -258,8 +297,6 @@ abstract对于接口来说是多余的,一般不这么使用
258297

259298
有符号左移,移动之后右边末尾由0填充
260299

261-
262-
263300
### 4.3 instanceof 运算符
264301

265302
用于判断一个对象是否是一个特定的类型`( Object reference variable ) instanceof (class/interface type)`

languages/java/basic/code-design.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,5 @@
2424
《设计模式》
2525

2626
《Effective Java》
27+
28+
《代码重构》
Lines changed: 168 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,177 @@
1-
## 面向对象
1+
Java中把一切都看做对象,所以是"面向对象设计",面向对象有三种基本特性`继承、封装和多态`
22

3+
# 1 继承
34

4-
### 继承
5+
* 继承其实就是把代码分层、提炼,继承能够使子类拥有父类的实例域与方法;
6+
* 子类会继承父类除private的属性和方法,且可以对父类拓展;子类可以继承default方法,但必须在同一包下面
7+
* Java只支持单一继承(防止不同的方法名混乱重复),但可以多重继承
8+
* 子类不继承父类的构造器
59

6-
方法和变量必须要继承吗
10+
# 2 重写(Override)与重载(Overload)
711

12+
## 2.1 重写(Override)
813

9-
implement
14+
子类对父类或接口允许访问(public、protected和default)的方法进行重写,但是有规则进行重写
1015

11-
接口的方法必须要实现吗
16+
1. 重写的方法名、形参和返回值都不变
17+
2. 返回类型与重写的方法可以不同,但必须是父类返回值的派生
18+
3. final和static不能被重写
19+
4. 访问修饰符一定要大于父类的访问修饰符,如父类protected -> 子类public
20+
5. 重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
1221

22+
## 2.2 重载(Overload)
23+
24+
1. 指在一个类里面,方法名字相同,但参数类型不同,返回类型也是可以相同也可不同
25+
2. 重载的方法的参数列表必须不同,不然就是重写了
26+
3. 可以修改访问修饰符,如private或public等
27+
4. 子类继承父类的方法后,子类定义相同方法名和不同参数类型的方法,这也是重载
28+
5. 一般用在构造函数上,重载不同的构造函数
29+
30+
2.3 区别
31+
32+
33+
| 区别 | 重载 | 重写 |
34+
| ---------- | ---------- | ------------------------------------------------ |
35+
| 参数列表 | 必须修改 | 一定不能修改,参数变量名可修改 |
36+
| 返回类型 | 可修改 | 一定不能修改 |
37+
| 异常 | 可修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
38+
| 访问权限 | 可修改 | 降低限制 |
39+
40+
# 3 多态
41+
42+
java中多态就是一个事物有多种形态,类似于一个抽象类,多个不同的具体对象。所以从本质来讲,没有继承就没有多态,多态可以消除类型之间的耦合;
43+
44+
程序中定义的引用变量具体指向那个实例对象或者调用的那个方法,都是在运行时才会确定,这样在不修改程序就能让变量绑定不同的类实现上,这就是多态性。
45+
46+
1. 多态存在有三个必要条件:
47+
48+
* 继承
49+
* 重写
50+
* 父类引用指向子类对象
51+
52+
父类指向子类,可以让父类使用子类拓展的功能,但是会丢失子类的独有的属性和方法
53+
54+
2. 多态实现方式
55+
56+
* 重写
57+
58+
对父类的重写,多个子类可以对父类的同一方法表现出不同的行为
59+
60+
* 接口
61+
62+
3. 编译时多态(overload)
63+
64+
+ 一是指方法的重载,因为在编译时能够通过方法的`参数类型、个数和次序` 来确定执行重载方法中的哪一个
65+
+ 二是当一个对象的引用指向的是当前对象所属类的对象时,为编译时多态 如`Sun sun = new Sun(); sun.say();`
66+
4. 运行时多态(override)
67+
指的是父类引用指向子类,需要在运行时向上查找对象,确定到底是执行子类的重写方法,还是继承的方法
68+
69+
70+
# 4 封装
71+
72+
就是包装的意思,将代码私有化,减少耦合;提供getter和setter方法,隐藏信息,实现细节
73+
74+
```java
75+
public class Shadow{
76+
private int age;
77+
private string name;
78+
public void setAge(int age){
79+
this.age = age;
80+
}
81+
public string getAge(){
82+
return this.age;
83+
}
84+
}
85+
```
86+
87+
## 4.1 接口的方法必须要实现吗
88+
89+
不是必须的,static不需要实现;default默认的方法,子类可以实现也可不实现;普通方法和abstract方法必须实现
90+
91+
# 5 内部类
92+
93+
内部类看起来是外部类的一个成员,所以内部类拥有private、public等访问权限,也可以用static修饰,成员内部类可以分为:
94+
* 静态成员内部类
95+
96+
静态类只有内部类才可以,静态类的创建不需要依赖外部类,所以它不能访问外部类的非静态属性和方法
97+
98+
```java
99+
public class Test{
100+
101+
static class InnerClass {
102+
static String test = "test";
103+
int a = 1;
104+
static void fun1() {}
105+
void fun2() {}
106+
}
107+
108+
}
109+
```
110+
111+
112+
113+
* 非静态成员内部类
114+
115+
成员内部类中不能存在任何static的变量和方法,因为内部类需要依赖外部类,而外部类不能static,所以需要等外部类初始化才可以
116+
117+
```java
118+
public class Test{
119+
private int i = 1;
120+
121+
class InnerClass {
122+
String test = "test";
123+
int a = 1;
124+
void fun1() {
125+
System.out.println(i);//外部类的成员变量
126+
}
127+
void fun2() {}
128+
}
129+
130+
}
131+
```
132+
133+
* 使用场景
134+
135+
+ 静态内部类实现单例
136+
137+
外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化INSTANCE,故而不占内存。即当SingleTon第一次被加载时,并不需要去加载SingleTonHoler,只有当getInstance()方法第一次被调用时,才会去初始化INSTANCE,第一次调用getInstance()方法会导致虚拟机加载SingleTonHoler类,这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。
138+
139+
140+
```java
141+
142+
public class SingleTon{
143+
private SingleTon(){}
144+
145+
private static class SingleTonHoler{
146+
private static SingleTon INSTANCE = new SingleTon();
147+
}
148+
149+
public static SingleTon getInstance(){
150+
return SingleTonHoler.INSTANCE;
151+
}
152+
}
153+
```
154+
155+
+ 匿名内部类
156+
157+
>匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
158+
159+
```java
160+
public class Demo {
161+
private Runnable runnable = new Runnable() {
162+
@override
163+
public void run() {}
164+
}
165+
}
166+
```
167+
168+
169+
https://blog.csdn.net/liuxiao723846/article/details/108006609
13170

14171
**Open Closed Principle** 开放关闭准则
172+
173+
174+
175+
# 6 反射
176+
177+
类这个模板定义了这个类的所有元信息,通过这些信息我们就可以实例化出对象,而Class信息在类加载过程中,会被存储到内存模型中的方法区中,也是我们使用反射时获取的数据来源。

philosophy/blog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
一直以来不愿承认孤独,却又一直孤独;如果孤独是常态,那么就去接受他吧,利用孤独,打造自己的世界

0 commit comments

Comments
 (0)