Skip to content

Commit af9d10b

Browse files
committed
docs(java): 更新Java基础笔记。
更新面向对象编程笔记内容。
1 parent 38c0d5c commit af9d10b

File tree

1 file changed

+209
-4
lines changed

1 file changed

+209
-4
lines changed

docs/zh/后端/02-Java/01-Java基础/06-面向对象编程-下篇.md

Lines changed: 209 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Java抽象类是一种使用 abstract 关键字修饰的特殊类,它不能被
2424

2525
示例:
2626

27-
```jaav
27+
```java
2828
public abstract void show();
2929
```
3030

@@ -599,7 +599,7 @@ public class MultiTool implements Printer, Logger, Debugger {
599599
```
600600

601601
```java [测试代码]
602-
public class Main {
602+
public class TestMain {
603603
public static void main(String[] args) {
604604
MultiTool tool = new MultiTool();
605605
tool.test();
@@ -647,7 +647,7 @@ public class C extends D implements A {
647647
```
648648

649649
```java [测试代码]
650-
public class Test {
650+
public class TestMain {
651651
public static void main(String[] args) {
652652
C c = new C();
653653
c.methodA();
@@ -708,7 +708,7 @@ public class Duck implements Amphibious {
708708
}
709709

710710
// 测试类
711-
public class Main {
711+
public class TestMain {
712712
public static void main(String[] args) {
713713
Duck duck = new Duck();
714714
duck.fly(); // 输出: 鸭子在飞翔
@@ -742,6 +742,211 @@ Java多态是指同一个方法在不同对象上可以有不同的行为,即
742742
变量名.方法名();
743743
```
744744

745+
> 父类类型:指的是子类继承的父类类型,或者实现的父接口类型。
746+
747+
示例:
748+
749+
```java
750+
Animal animal = new Cat();
751+
animal.run();
752+
```
753+
754+
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后的方法。
755+
756+
示例:
757+
758+
::: code-group
759+
```java [定义父类]
760+
// 抽象类
761+
public abstract class Animal {
762+
public abstract void eat();
763+
}
764+
```
765+
766+
```java [定义子类]
767+
public class Cat extends Animal {
768+
769+
@Override
770+
public void eat() {
771+
System.out.println("吃鱼");
772+
}
773+
}
774+
```
775+
776+
```java [定义子类]
777+
public class Dog extends Animal {
778+
779+
@Override
780+
public void eat() {
781+
System.out.println("吃骨头");
782+
}
783+
}
784+
```
785+
786+
```java [测试类]
787+
public class TestMain {
788+
public static void main(String[] args) {
789+
// 多态的形式创建对象
790+
Animal a1 = new Cat();
791+
// 调用的是 Cat 的 eat() 方法
792+
a1.eat(); // 输出:吃鱼
793+
794+
// 多态的形式创建对象
795+
Animal a2 = new Dog();
796+
// 调用的是 Dog 的 eat() 方法
797+
a2.eat(); // 输出:吃骨头
798+
}
799+
}
800+
```
801+
:::
802+
803+
### 多态的好处
804+
805+
实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展性与便利。
806+
807+
示例:
808+
809+
::: code-group
810+
```java [定义父类]
811+
public abstract class Animal {
812+
// 抽象方法
813+
public abstract void eat();
814+
}
815+
```
816+
817+
```java [定义子类]
818+
public class Cat extends Animal {
819+
820+
// 重写父类的抽象方法
821+
@Override
822+
public void eat() {
823+
System.out.println("吃鱼");
824+
}
825+
}
826+
```
827+
828+
```java [定义子类]
829+
public class Dog extends Animal {
830+
831+
// 重写父类的抽象方法
832+
@Override
833+
public void eat() {
834+
System.out.println("吃骨头");
835+
}
836+
}
837+
```
838+
839+
```java [测试类]
840+
public class TestMain {
841+
public static void main(String[] args) {
842+
// 创建对象
843+
Cat cat = new Cat();
844+
Dog dog = new Dog();
845+
846+
// 调用showCatEat
847+
showCatEat(cat);
848+
// 调用showDogEat
849+
showDogEat(dog);
850+
851+
/**
852+
* 以上两个方法,均可以被showAnimalEat(Animal a)方法所替代
853+
* 而且执行效果一致
854+
*/
855+
showAnimalEat(cat);
856+
showAnimalEat(dog);
857+
}
858+
859+
public static void showCatEat(Cat c) {
860+
c.eat();
861+
}
862+
863+
public static void showDogEat(Dog d) {
864+
d.eat();
865+
}
866+
867+
public static void showAnimalEat(Animal a) {
868+
a.eat();
869+
}
870+
}
871+
```
872+
:::
873+
874+
示例说明:
875+
876+
- 由于多态特性的支持 `showAnimalEat()` 方法的Animal类型,是 `Cat``Dog` 的父类类型,父类类型接收子类对象,当然可以把 `Cat` 对象和 `Dog` 对象,传递给方法。
877+
-`eat()` 方法执行时,多态规定,执行的是子类重写的方法,那么效果自然与 `showCatEat()``showDogEat()` 方法一致,所以 `showAnimalEat()` 完全可以替代以上两方法。
878+
- 不仅仅是替代,在扩展性方面,无论之后再多的子类出现,我们都不需要编写 `showXxxEat()` 方法了,直接使用 `showAnimalEat()` 都可以完成。
879+
880+
### 多态的两种形式
881+
882+
| 形式 | 说明 | 示例 |
883+
| :-- | :-- | :-- |
884+
| 编译时多态(静态多态) | 方法重载(Overloading) | `add(int a, int b)``add(double a, double b)` |
885+
| 运行时多态(动态多态) | 方法重写(Overriding) + 继承 + 向上转型 | 父类引用调用子类重写的方法 |
886+
887+
> Java 中真正意义的多态指的是运行时多态(基于方法重写)。
888+
889+
### 运行时多态的三个必要条件
890+
891+
要实现运行时多态,必须同时满足以下三个条件:
892+
893+
1. 继承关系:子类继承父类(或者实现接口)
894+
2. 方法重写:子类重写父类的方法(@Override
895+
3. 向上转型:父类引用指向子类对象
896+
897+
示例:
898+
899+
```java
900+
class Animal {
901+
public void makeSound() {
902+
System.out.println("动物叫声");
903+
}
904+
}
905+
906+
class Dog extends Animal {
907+
@Override
908+
public void makeSound() {
909+
System.out.println("汪汪!");
910+
}
911+
}
912+
913+
class Cat extends Animal {
914+
@Override
915+
public void makeSound() {
916+
System.out.println("喵喵!");
917+
}
918+
}
919+
920+
// 使用多态
921+
public class Test {
922+
public static void main(String[] args) {
923+
Animal a1 = new Dog(); // 向上转型
924+
Animal a2 = new Cat();
925+
926+
a1.makeSound(); // 输出:汪汪!
927+
a2.makeSound(); // 输出:喵喵!
928+
}
929+
}
930+
```
931+
932+
### 向上转型
933+
934+
向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
935+
936+
当父类引用指向一个子类对象时,便是向上转型。
937+
938+
语法格式:
939+
940+
```java
941+
父类类型 变量名 = new 子类类型();
942+
```
943+
944+
示例:
945+
946+
```java
947+
Animal animal = new Cat();
948+
```
949+
745950
::: tip 提示
746951
文档正在更新中...
747952
:::

0 commit comments

Comments
 (0)