Skip to content

Commit 280fc51

Browse files
committed
Java
1 parent d2fba16 commit 280fc51

14 files changed

+864
-61
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# 抽象类和接口
2+
3+
## 抽象类
4+
5+
### 抽象类特点
6+
7+
- 抽象类和抽象方法必须用 abstract 关键字修饰
8+
9+
- 抽象类不一定有抽象方法,有抽象方法的一定是抽象类
10+
11+
- 抽象类不能实例化
12+
13+
- 抽象类的子类:
14+
15+
要么是抽象类;要么重写抽象类的所有抽象方法
16+
17+
### 抽象类成员特点
18+
19+
- 成员变量:可以是常量,也可以是变量
20+
- 构造方法:有构造方法,但是不能实例化(作用:**用于子类访问父类数据的初始化**
21+
- 成员方法:可以有抽象方法和非抽象方法
22+
23+
注意:
24+
25+
- abstract 与 private、final 冲突;
26+
27+
(abstract 修饰的类,必须被继承;abstract 修饰的方法,应被重写。
28+
29+
但是 final 修饰的类、属性、方法不可被更改,所以final 修饰的方法不可以被重写。
30+
31+
private 修饰的类只能是内部类,private 修饰的属性、方法只能在本类中调用。)
32+
33+
34+
- abstract 与 static 放一起是没有意义的。
35+
36+
(static 修饰的方法是静态的,可以直接被类所调用。
37+
38+
但是 abstract 修饰的方法抽象方法,没有方法体不能够被直接调用。)
39+
40+
41+
42+
## 接口
43+
44+
### 接口特点
45+
46+
- 使用 interface
47+
48+
- 类实现接口使用 implements
49+
50+
- 接口不能实例化
51+
52+
- 接口的子类:
53+
54+
要么是抽象类;要么实现接口中所有抽象方法
55+
56+
### 接口成员特点
57+
58+
- 成员变量:只能是常量,默认是 public static final
59+
- 构造方法:无
60+
- 成员方法:都是抽象方法,默认是 public abstract
61+
62+
63+
64+
## 抽象类和接口的区别
65+
66+
- 成员区别
67+
68+
抽象类:常量/变量;有构造方法;有抽象方法和非抽象方法
69+
70+
接口:常量;无构造方法;只有抽象方法
71+
72+
- 关系区别
73+
74+
类与类:继承关系(单继承)
75+
76+
类与接口:实现关系(可以多实现)
77+
78+
接口与接口:继承关系(可以多继承)
79+
80+
- 设计理念区别
81+
82+
抽象类被继承,体现 "is a " 理念
83+
84+
接口被实现,体现 "like a" 理念
Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
<!-- GFM-TOC -->
2-
* [十一、其他](#十一其他)
3-
* [Java 各版本的新特性](#java-各版本的新特性)
4-
* [Java 与 C++ 的区别](#java-与-c-的区别)
5-
* [JRE or JDK](#jre-or-jdk)
6-
* [Java基础学习书籍推荐](#Java基础学习书籍推荐)
7-
<!-- GFM-TOC -->
81
# 十一、其他
92

103
## Java 各版本的新特性

docs/OO/2_创建型.md

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -853,44 +853,54 @@ abcdefghijklmnopqrstuvwxyz
853853
### Implementation
854854

855855
```java
856-
public abstract class Prototype {
857-
abstract Prototype myClone();
856+
public class Prototype implements Cloneable{
857+
858+
@Override
859+
protected Prototype clone() throws CloneNotSupportedException {
860+
Prototype p=null;
861+
try{
862+
p=(Prototype)super.clone();
863+
}catch (ClassCastException e){
864+
e.printStackTrace();
865+
}
866+
return p;
867+
}
858868
}
859869
```
860870

861871
```java
862-
public class ConcretePrototype extends Prototype {
872+
public class ConcretePrototype extends Prototype{
863873

864-
private String filed;
874+
private String field;
865875

866-
public ConcretePrototype(String filed) {
867-
this.filed = filed;
868-
}
869-
870-
@Override
871-
Prototype myClone() {
872-
return new ConcretePrototype(filed);
876+
public ConcretePrototype(String filed){
877+
this.field=filed;
873878
}
874879

875880
@Override
876881
public String toString() {
877-
return filed;
882+
return field;
878883
}
879884
}
880885
```
881886

882887
```java
883888
public class Client {
884-
public static void main(String[] args) {
885-
Prototype prototype = new ConcretePrototype("abc");
886-
Prototype clone = prototype.myClone();
887-
System.out.println(clone.toString());
889+
public static void main(String[] args) throws CloneNotSupportedException {
890+
Prototype obj1=new ConcretePrototype("abc");
891+
Prototype obj2=obj1.clone();
892+
Prototype obj3=obj1.clone();
893+
System.out.println(obj1);
894+
System.out.println(obj2);
895+
System.out.println(obj3);
888896
}
889897
}
890898
```
891899

892900
```html
893901
abc
902+
abc
903+
abc
894904
```
895905

896906
### JDK

docs/OO/5_面向对象三大特性.md

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
### 3. 成员变量和局部变量的区别
2727

2828
| 区别 | 成员变量 | 局部变量 |
29-
| :--: | :--: | :--: |
29+
| :--: | :--: | :--: |
3030
| 在类中位置不同 | 类中方法外 | 方法内或者方法声明上 |
31-
| 在内存中位置不同 | 堆内存 | 栈内存 |
31+
| 在内存中位置不同 | 堆内存 | 栈内存 |
3232
| 声明周期不同 | 随着**对象**存在而存在,随着对象消失而消失 | 随着**方法**调用而存在,随着方法调用完毕而消失 |
3333
| 初始化值不同 | 有默认的初始值 | 没有默认的初始值,必须先定义,赋值,才能使用 |
3434

@@ -69,23 +69,17 @@ Student s=new Student();
6969
具体步骤:
7070

7171
1. 加载Student.class文件进内存
72-
7372
2.**栈内存**为s开辟空间
74-
7573
3.**堆内存**为学生对象开辟空间
76-
7774
4. 对学生成员变量进行默认初始化
78-
7975
5. 对学生成员变量进行显示初始化
80-
8176
6. 通过构造方法对学生对象的成员赋值
82-
8377
7. 学生成员对象初始化完毕,将对象地址赋值给s变量。
8478

79+
**一个标准的手机类的代码及测试**
8580

86-
> 封装:一个标准的手机类的代码及测试
81+
- 手机类
8782

88-
> 手机类
8983
```java
9084
public class SmartPhone {
9185
private String brand;
@@ -130,7 +124,8 @@ public class SmartPhone {
130124
}
131125
```
132126

133-
> 手机测试类1
127+
- 手机测试类1
128+
134129
```java
135130
public class SmartPhoneDemo {
136131
public static void main(String[] args) {
@@ -148,10 +143,7 @@ public class SmartPhoneDemo {
148143
}
149144
```
150145

151-
一个手机对象的内存简图:
152-
<div align="center"> <img src="pics\\04_1.png" width="800"/> </div><br>
153-
154-
> 手机测试类2
146+
- 手机测试类2
155147

156148
```java
157149
public class SmartPhoneDemo2 {
@@ -180,16 +172,14 @@ public class SmartPhoneDemo2 {
180172
}
181173
```
182174

183-
多个手机对象的内存简图:
184175

185-
<div align="center"> <img src="pics\\04_2.png" width="800"/> </div><br>
186176

187177

188178
### 5. 静态变量和成员变量的区别
189179

190180
| 区别 | 静态变量 | 成员变量 |
191181
| :--: | :--: | :--: |
192-
| 所属不同 | 属于类,所以也称为**类变量** | 属于对象,所以也称为**实例变量**(对象变量) |
182+
| 所属不同 | 属于类,所以也称为**类变量** | 属于对象,所以也称为**实例变量**(对象变量) |
193183
| 内存中位置不同 | 存储于**方法区**的静态区 | 存储于堆内存 |
194184
| 内存中出现时间不同 | 随着****的加载而加载,随着类的消失而消失 | 随着**对象**的创建而存在,随着对象的消失而消失 |
195185
| 调用不同 | 可以通过类名调用,也可以通过对象调用 | 只能通过的对象来调用 |
@@ -267,15 +257,16 @@ Animal animal = new Cat();
267257
### 5. 继承中成员变量的关系
268258
- 子类中成员变量和父类中成员变量名称不同。
269259
- 子类中成员变量和父类中成员变量名称相同。
270-
260+
261+
271262
在子类方法中的查找顺序:
272-
263+
273264
在子类方法的局部范围找,有就使用
274265

275266
在子类的成员范围找,有就使用
276267

277268
**父类的成员范围**找,有就使用
278-
269+
279270
如果还找不到,就报错
280271

281272
### 6. 继承中构造方法的关系
@@ -290,7 +281,7 @@ Animal animal = new Cat();
290281
3. 如果父类中没有无参构造方法,该怎么办呢?
291282

292283
方式一:子类通过super去显示调用父类其他的带参的构造方法
293-
284+
294285
方式二:子类通过this去调用本类的其他构造方法
295286
(子类一定要有一个去访问父类的构造方法,否则父类数据就没有初始化)
296287

@@ -458,7 +449,7 @@ final关键字是最终的意思,可以修饰类,修饰变量,修饰成员
458449
在方法内部,该变量不可以被改变
459450

460451
在方法声明上,分为基本类型和引用类型的情况
461-
452+
462453
(1)基本类型:是值不能变
463454

464455
(2)引用类型:是地址不能变,但是该对象的堆内存中的值是可以改变的
@@ -467,9 +458,10 @@ final关键字是最终的意思,可以修饰类,修饰变量,修饰成员
467458

468459
在对象构造完毕前即可(非静态常量),被final修饰的变量只能赋值一次。
469460

470-
> 继承:一个标准的动物类、猫类、狗类的代码及测试
461+
**一个标准的动物类、猫类、狗类的代码及测试**
462+
463+
- 动物类
471464

472-
> 动物类
473465
```java
474466
class Animal{
475467
private String name;
@@ -506,7 +498,8 @@ class Animal{
506498
}
507499
```
508500

509-
> 猫类
501+
- 猫类
502+
510503
```java
511504
class Cat extends Animal{
512505
@Override
@@ -521,7 +514,8 @@ class Cat extends Animal{
521514
}
522515
```
523516

524-
> 狗类
517+
- 狗类
518+
525519
```java
526520
class Dog extends Animal{
527521
@Override
@@ -536,7 +530,8 @@ class Dog extends Animal{
536530
}
537531
```
538532

539-
> 测试
533+
- 测试
534+
540535
```java
541536
public class AnimalDemo {
542537
public static void main(String[] args) {
@@ -680,9 +675,7 @@ public class PolymorphismDemo3 {
680675
}
681676
```
682677

683-
多态中对象内存图
684678

685-
<div align="center"> <img src="pics\\04_3.png" width="800"/> </div><br>
686679

687680

688681
### 5. 多态中的一些问题

docs/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@
4343
- [第八节 泛型](JavaBasics/07%E6%B3%9B%E5%9E%8B.md)
4444
- [第九节 注解](JavaBasics/08%E6%B3%A8%E8%A7%A3.md)
4545
- [第十节 Java中常见对象](JavaBasics/09Java%E5%B8%B8%E8%A7%81%E5%AF%B9%E8%B1%A1.md)
46-
- [第十一节 其他](JavaBasics/10%E5%85%B6%E4%BB%96.md)
46+
- [第十一节 抽象类和接口](JavaBasics/10抽象类和接口.md)
47+
- [第十二节 其他](JavaBasics/11其他.md)
4748

4849
## 2. Java 容器
4950

0 commit comments

Comments
 (0)