面向对象——多态

多态:父类的引用指向了自己的子类对象,从而拥有不同的属性和方法。在JAVA中包括:运行时多态和编译时多态。

对象的多态性:动物 x = new 猫(); 动物 x = new 狗(); 

函数的多态性:函数overriding(重写)和overloading(重载)。

多态的前提:必须是类与类之间只有关系,要么继承或实现 ;通常还有一个前提,存在覆盖。

多态的好处:多态的出现大大的提高了程序的扩展性。

//需求:猫,狗。
//创建一个动物类
abstract class Animal {
abstract void eat();
}
//创建一个猫类并继承动物类
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void catchMouse() {
System.out.println("抓老鼠");
}
}
//创建一个狗类并继承动物类
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void kanJia() {
System.out.println("看家");
}
}
//多态测试类
class DuoTaiDemo {
public static void main(String[] args) {
function(new Cat());
function(new Dog());
Animal a = new Cat();// 向上转型
a.eat();
Cat c = (Cat) a;// 向下转型
c.catchMouse();
}
         //创建方法
public static void function(Animal a) {
a.eat();
// 用于子类型有限
// 或判断所属类型进而使用其特有方法
if (a instanceof Cat) {
Cat c = (Cat) a;
c.catchMouse();
} else if (a instanceof Dog) {
Dog c = (Dog) a;
c.kanJia();
}
}
}

### 封装 封装是面向对象编程的基本特性之一,其核心思想是将数据和行为绑定在一起,并对外部隐藏实现细节。通过使用访问修饰符(如 `private`、`protected` 和 `public`),可以控制类成员的可见性。封装提高了代码的安全性和可维护性,因为外部代码只能通过定义好的接口与对象交互,而无法直接访问或修改对象的内部状态[^3]。 例如,一个类可以将某些变量设为私有,并通过公共方法(getter 和 setter)来访问或修改这些变量: ```java public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` ### 继承 继承是面向对象编程中实现代码复用的重要机制。它允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,子类不仅可以复用父类的代码,还可以扩展或修改父类的行为。继承的语法如下: ```java public class Animal { public void speak() { System.out.println("Animal speaks"); } } public class Dog extends Animal { @Override public void speak() { System.out.println("Dog barks"); } } ``` 在上述代码中,`Dog` 类继承了 `Animal` 类,并重写了 `speak()` 方法以提供自己的实现。继承的好处包括代码重用、逻辑组织和扩展性。通过建立类之间的层次结构,代码变得更加清晰和易于维护[^3]。 在继承中,子类可以重写或隐藏父类的方法。重写是指子类提供与父类相同方法签名(方法名、参数列表和返回值类型)的方法,以改变方法的行为。隐藏是指子类定义与父类相同的静态方法,以覆盖父类的实现。`super` 关键字用于调用父类的方法或构造函数,而 `final` 关键字可以防止类被继承或方法被重写[^1]。 ### 多态 多态面向对象编程的核心特性之一,它允许不同类的对象对同一消息做出不同的响应。要实现多态,必须满足以下条件:必须在继承体系下,子类必须重写父类的方法,并且通过父类的引用调用子类重写的方法。多态的体现是在代码运行时,根据传递的对象类型,调用对应类中的方法[^2]。 例如: ```java public class Animal { public void speak() { System.out.println("Animal speaks"); } } public class Dog extends Animal { @Override public void speak() { System.out.println("Dog barks"); } } public class Cat extends Animal { @Override public void speak() { System.out.println("Cat meows"); } } public class Main { public static void main(String[] args) { Animal animal1 = new Dog(); Animal animal2 = new Cat(); animal1.speak(); // 输出 "Dog barks" animal2.speak(); // 输出 "Cat meows" } } ``` 在上述代码中,`animal1` 和 `animal2` 都是 `Animal` 类型的引用,但它们分别指向 `Dog` 和 `Cat` 对象。在运行时,根据实际对象的类型,调用对应类中的 `speak()` 方法。这种机制使得代码更加灵活,能够根据不同的对象执行不同的行为。 ### 相关问题 1. 封装在面向对象编程中的作用是什么? 2. 继承的语法和关键字有哪些? 3. 多态的实现条件和应用场景是什么? 4. 方法重写和方法重载的区别是什么? 5. 如何通过继承实现代码重用?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值