多态的一些知识点总结

多态的定义
  • java引用变量有两种类型:
    1.编译时类型:由于声明该变量的时候使用的类型所决定的;
    2.运行时类型:由实际赋值给该变量的对象所决定的
  • 如果编译时类型和运行时类型不一样,就可能出现所谓的多态
  • 多态的意义:
    1.可以替换性:对已存在代码具有可替代性
    2.可扩充性:添加新的子类不影响已经存在的类的多态,继承,以及其他特性的运行和操作
多态的应用

1.引用多态(引用有点类似于C语言中的指针)
* 父类的引用可以指向本类的对象:Animal obj1 = new Animal();
* 父类的引用可以指向子类的对象:Animal obj2 = new Dog();Animal obj3 = new Cat();
2.方法多态

obj1.eat();         //调用父类的
obj2.eat();         //子类重写(Dog类中的eat方法)
obj3.eat()          //子类重写(Cat类中的eat方法)
引用类型转换
  • 向上类型的转换(隐式自动类型转换),是小类型到大类型的转换
Dog obj1 = new Dog();
Animal obj2 = obj1;
  • 向下类型转换(强制类型转换),是大类型到小类型的转换.
Dog obj3 = (Dog) obj2;
  • 基本类型之间的转换只能在数值之间进行转换
  • 引用类型之间的转换只能在具有继承关系的两个类型之间进行

  • 使用instanceof检测是否可以强制转换

Dog dog = new Dog();
Animal animal = new Animal();
if(animal(需要转换的类型)  instanceof Dog(转换的目标类型)){
Dog dog = (Dog) animal;
}
else{
System.out.println("无法类型转换");
}
抽象类和抽象方法
  • 抽象方法和抽象类必须使用abstract修饰符类定义,有抽象方法的类只能被定义成抽象类,抽象类中可以没有抽象方法.
  • 抽象方法和抽象类的使用方法:
    1.使用abstract修饰定义抽象类,抽象方法中不能有方法体.
    2.抽象类不能被实例化,不能使用new关键字创建类的实例
    3.抽象类可以包含成员变量,方法(普通方法和抽象方法),构造器,内部类(接口,枚举)等几种
    4.含有抽象方法的类只能被定义成抽象类.
abstract的几个不能:

1.不能和final同时使用
2.不能修饰成员变量,不能修饰静态变量(不能和static同时使用),不能修饰构造器
3.不能和private同时修饰类和方法
4.抽象方法中不能有方法体.

接口

接口是一种与类相似的结构,只包含常量和抽象方法,接口与抽象类很相似,但两者又有区别:

接口与抽象类区别

抽象类除了包含常量和抽象方法之外,还包含变量和具体方法以及构造器!

接口的特点
  • 接口的关键字是interface
  • 接口的修饰符只能是public
  • 接口可以同时继承多个父接口
  • 其属性只能是常量,只能用public static final做修饰符(参见《java语言程序设计》)
  • 接口不能用new操作符实例化,即不能用new来new出一个对象!
  • 所有方法必须是public abstract的实例方法!
public interface T1{
public static final int k =1;
public asstract void p();

}

等价于:

public interface T1{
 int k =1;
 void p();

}
接口的继承

java中一个类只能继承一个父类,可以通过多个接口来作为补充

  • 一个接口要继承父接口,则使用extend关键字

  • 一个类可以实现一个或者多个接口,实现接口使用implements关键字

  • 如果要继承父类,继承父类必须要在实现接口之前

[修饰符] class 类名 extends 父类 implements 接口 1,接口2...
{

}
### 封装 封装是面向对象编程的核心特性之一,其主要作用是隐藏对象的内部实现细节,仅对外暴露必要的接口。通过封装,可以提高代码的模块化程度,增强数据的安全性和完整性[^2]。例如,Java 中可以通过访问修饰符(如 `private`、`protected` 和 `public`)控制类成员的可见性。一个典型的封装示例是将类的字段设为 `private`,并通过公共的 `getter` 和 `setter` 方法访问和修改这些字段: ```java public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ``` ### 继承 继承是面向对象编程中实现代码复用的重要机制,允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,可以构建清晰的类层次结构,提高代码的可维护性和可扩展性[^3]。在 Java 中,使用 `extends` 关键字实现继承。子类可以重写父类的方法以实现不同的行为。例如: ```java class Animal { public void makeSound() { System.out.println("动物发出声音"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("狗汪汪叫"); } } ``` 此外,Java 仅支持单继承,即一个类只能直接继承一个父类。但可以通过实现多个接口来实现多继承的效果[^4]。 ### 多态 多态是指同一个接口可以有不同的实现方式,具体的行为取决于对象的实际类型。多态增强了代码的灵活性和扩展性,使得程序能够以统一的方式处理不同类型的对象[^2]。在 Java 中,多态通常通过方法重写(动态绑定)和接口实现来体现。例如: ```java Animal myAnimal = new Dog(); myAnimal.makeSound(); // 输出 "狗汪汪叫" ``` 在上述代码中,尽管变量 `myAnimal` 的类型是 `Animal`,但它实际指向的是 `Dog` 类的实例,因此调用的是 `Dog` 类的 `makeSound` 方法。 ### 组合与继承的关系 除了继承,组合也是实现代码复用的一种方式。组合是指在一个类中包含另一个类的对象作为其成员变量,从而利用该对象的功能。与继承相比,组合更加灵活,因为可以在运行时动态改变对象的行为[^4]。例如: ```java class Engine { public void start() { System.out.println("引擎启动"); } } class Car { private Engine engine; public Car(Engine engine) { this.engine = engine; } public void start() { engine.start(); System.out.println("汽车启动"); } } ``` 在实际开发中,应根据具体需求选择继承或组合来设计类之间的关系,以实现高效、灵活和易于维护的软件系统[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值