Skip to content

Commit 5f2e51a

Browse files
author
hollis.zhl
committed
内容完善
1 parent de618c2 commit 5f2e51a

File tree

4 files changed

+160
-3
lines changed

4 files changed

+160
-3
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
面向对象、面向过程
2222

23-
面向对象的三大基本特征和[五大基本原则](/basics/java-basic/principle.md)
23+
面向对象的[三大基本特征](/basics/java-basic/characteristics.md)[五大基本原则](/basics/java-basic/principle.md)
2424

2525
#### 平台无关性
2626

@@ -36,13 +36,13 @@ Java如何实现的平台无关
3636

3737
#### 封装、继承、多态
3838

39-
什么是多态、方法重写与重载
39+
什么是多态、[方法重写与重载](/basics/java-basic/overloading-vs-overriding.md)
4040

4141
Java的继承与实现
4242

4343
构造函数与默认构造函数
4444

45-
类变量、成员变量和局部变量
45+
[类变量、成员变量和局部变量](/basics/java-basic/variable.md)
4646

4747
成员变量和方法作用域
4848

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
面向对象三大特征:
2+
3+
### (1)封装(Encapsulation)
4+
5+
所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
6+
7+
### (2)继承(Inheritance)
8+
9+
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
10+
11+
### (3)多态(Polymorphism)
12+
13+
所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
14+
15+
最常见的多态就是将子类传入父类参数中,运行时调用父类方法时通过传入的子类决定具体的内部结构或行为。
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
![overloading-vs-overriding][1]
2+
3+
重载(Overloading)和重写(Overriding)是Java中两个比较重要的概念。但是对于新手来说也比较容易混淆。本文通过两个简单的例子说明了他们之间的区别。
4+
5+
## 定义
6+
7+
### 重载
8+
9+
简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
10+
11+
### 重写
12+
13+
重写指的是在Java的子类与父类中有两个名称、参数列表都相同的方法的情况。由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。
14+
15+
## 重载 VS 重写
16+
17+
关于重载和重写,你应该知道以下几点:
18+
19+
> 1、重载是一个编译期概念、重写是一个运行期间概念。
20+
>
21+
> 2、重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法。
22+
>
23+
> 3、重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法
24+
>
25+
> 4、因为在编译期已经确定调用哪个方法,所以重载并不是多态。而重写是多态。重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。(注:严格来说,重载是编译时多态,即静态多态。但是,Java中提到的多态,在不特别说明的情况下都指动态多态)
26+
27+
## 重写的例子
28+
29+
下面是一个重写的例子,看完代码之后不妨猜测一下输出结果:
30+
31+
class Dog{
32+
public void bark(){
33+
System.out.println("woof ");
34+
}
35+
}
36+
class Hound extends Dog{
37+
public void sniff(){
38+
System.out.println("sniff ");
39+
}
40+
41+
public void bark(){
42+
System.out.println("bowl");
43+
}
44+
}
45+
46+
public class OverridingTest{
47+
public static void main(String [] args){
48+
Dog dog = new Hound();
49+
dog.bark();
50+
}
51+
}
52+
53+
54+
输出结果:
55+
56+
bowl
57+
58+
59+
上面的例子中,`dog`对象被定义为`Dog`类型。在编译期,编译器会检查Dog类中是否有可访问的`bark()`方法,只要其中包含`bark()`方法,那么就可以编译通过。在运行期,`Hound`对象被`new`出来,并赋值给`dog`变量,这时,JVM是明确的知道`dog`变量指向的其实是`Hound`对象的引用。所以,当`dog`调用`bark()`方法的时候,就会调用`Hound`类中定义的`bark()`方法。这就是所谓的动态多态性。
60+
61+
### 重写的条件
62+
63+
> 参数列表必须完全与被重写方法的相同;
64+
>
65+
> 返回类型必须完全与被重写方法的返回类型相同;
66+
>
67+
> 访问级别的限制性一定不能比被重写方法的强;
68+
>
69+
> 访问级别的限制性可以比被重写方法的弱;
70+
>
71+
> 重写方法一定不能抛出新的检查异常或比被重写的方法声明的检查异常更广泛的检查异常
72+
>
73+
> 重写的方法能够抛出更少或更有限的异常(也就是说,被重写的方法声明了异常,但重写的方法可以什么也不声明)
74+
>
75+
> 不能重写被标示为final的方法;
76+
>
77+
> 如果不能继承一个方法,则不能重写这个方法。
78+
79+
## 重载的例子
80+
81+
class Dog{
82+
public void bark(){
83+
System.out.println("woof ");
84+
}
85+
86+
//overloading method
87+
public void bark(int num){
88+
for(int i=0; i<num; i++)
89+
System.out.println("woof ");
90+
}
91+
}
92+
93+
94+
上面的代码中,定义了两个bark方法,一个是没有参数的bark方法,另外一个是包含一个int类型参数的bark方法。在编译期,编译期可以根据方法签名(方法名和参数情况)情况确定哪个方法被调用。
95+
96+
### 重载的条件
97+
98+
> 被重载的方法必须改变参数列表;
99+
>
100+
> 被重载的方法可以改变返回类型;
101+
>
102+
> 被重载的方法可以改变访问修饰符;
103+
>
104+
> 被重载的方法可以声明新的或更广的检查异常;
105+
>
106+
> 方法能够在同一个类中或者在一个子类中被重载。
107+
108+
## 参考资料
109+
110+
[Overriding vs. Overloading in Java][2]
111+
112+
[1]: http://www.hollischuang.com/wp-content/uploads/2016/03/overloading-vs-overriding.png
113+
[2]: http://www.programcreek.com/2009/02/overriding-and-overloading-in-java-with-examples/

basics/java-basic/variable.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
### 类变量、成员变量和局部变量
2+
3+
Java中共有三种变量,分别是类变量、成员变量和局部变量。他们分别存放在JVM的方法区、堆内存和栈内存中。
4+
5+
/**
6+
* @author Hollis
7+
*/
8+
public class Variables {
9+
10+
/**
11+
* 类变量
12+
*/
13+
private static int a;
14+
15+
/**
16+
* 成员变量
17+
*/
18+
private int b;
19+
20+
/**
21+
* 局部变量
22+
* @param c
23+
*/
24+
public void test(int c){
25+
int d;
26+
}
27+
}
28+
29+
上面定义的三个变量中,变量a就是类变量,变量b就是成员变量,而变量c和d是局部变量。

0 commit comments

Comments
 (0)