本文详细介绍了Java中的多态、对象与行为多态、抽象类的使用、接口与枚举的区别、以及泛型的概念,包括向上转型和向下转型。同时讨论了StringBuilder和StringJoiner在API中的应用。
摘要由CSDN通过智能技术生成
首先 多态是在继承或者实现情况下的一种现象 表现为 对象多态和行为多态 ;成员变量不谈多态
-
对象多态 同一个人可能是父亲 也可能是儿子
-
行为多态 都是敲代码 有的人敲的快 有的人敲得慢
-
有继承 实现关系
-
存在父类对象引用子类对象(向下转型)
-
存在方法重写
右边对象是解耦合 便于扩展和维护
定义方法时 使用父类的形参可以接收一切子类对象 扩展性更强
多态下不能使用子类的独有功能(可以使用强制类型转换)
final可以修饰哪些?分别有什么作用?
final 可以修饰
类
方法
变量
当
类
被final修饰 该类无法被继承 也就是说该类不能有儿子 我们通常会在定义一些基础类或者工具类时 使用final修饰 例如java官方中 String和Integer 类就是被final修饰
当
方法
被final修饰 该方法无法被重写 我们称为方法锁定 通常用于我们确保某些方法不希望被重写 确保某些方法在的行为在子类中保持一致
当
变量
被修饰 表示该变量在初始化后无法被修改 我们通常用来定义某些常量 通常 这些常量的命名以大写字母表示 并且被static一起修饰 这样就可以在整个类中共享该常量
什么是抽象类?抽象类可以直接被new出来吗?
抽象类 是java中一种特殊的类 他的主要特性就是不能被实例化 所以不能new一个对象 抽象类在定义时加 abstract 那么我们想使用抽象类就必须继承抽象类 才可以使用它
现在我们说一下什么是抽象方法 抽象方法用abstract修饰 所以抽象方法是不能有方法体 只能有签名 也就是说抽象方法没有给出方法的具体实现
抽象方法必须被包含在抽象方法里面 继承抽象类的类必须重写全部抽象方法 否则该类也定义成一个抽象类
public abstract class AbstractAnimal {
// 类变量
public static final String TYPE = "Animal";
// 实例变量
private String name;
// 抽象方法
public abstract void makeSound();
// 非抽象方法
public void setName(String name) {
this.name = name;
public String getName() {
return name;
public class Dog extends AbstractAnimal {
@Override
public void makeSound() {
System.out.println("Woof!");
public class Main {
public static void main(String[] args) {
Dog dog = new Dog(); // 创建Dog类的实例,Dog类是AbstractAnimal的子类
dog.makeSound(); // 输出 "Woof!"
对此我们可以对抽象类及抽象方法总结出以下特点
- 抽象类不能被实例化(即不能直接使用
new
来创建对象)。 - 抽象类可以包含抽象方法和非抽象方法。
- 抽象类可以包含类变量和实例变量。
- 抽象类可以被子类继承,子类可以选择实现抽象类中的抽象方法,也可以不实现。如果子类继承了抽象类并且没有实现所有的抽象方法,那么这个子类也必须被声明为抽象类。
什么是接口?接口可以之间被new出来吗?抽象类和接口之间有什么异同?
接口其实也是另一种抽象 同样接口值定义类方法签名 没有方法体 这些接口可以由任何类实现 所以我们可以说接口是一种特殊的抽象类 不过 他只能包含抽象方法(JDK1.8以后允许包含具体实现的方法 我们称为默认方法)和常量(static final) 对此接口也无法new出来一个对象
我们可以总结出来接口和抽象类的异同
- 关键字不同 前者inplements 后者 abstract
- 构造方法上 抽象类可以有构造方法(不能是抽象) 接口没有构造方法
- 方法上 抽象类可以有抽象方法和普通方法 然而在JDK1.8以后接口才新增默认方法
- 变量上 抽象类中可以包含普通变量和常量 而接口只能有静态静态常量
- 继承与实现 一个;类只能继承一个抽象类 但可以实现多个接口
- 应用 在实际的开发过程中 抽象类适用于定义一些共同的属性和行为的类 而接口更适合定义一组行为 这些行为可以被多个不相关的类实现
什么是枚举?枚举类关键字是什么?
在java中枚举是一个特殊的类 一般用于表示一组常量 枚举类使用enum关键字定义 各个常量使用逗号分隔
enum Color
RED, GREEN, BLUE;
同时枚举也可以声明在其他类的内部
- 枚举类内部第一行只能罗列一些名称 这些名称都是常量 并且每个常量记住的都是枚举的一个对象
- 枚举的构造器是私有的 因此 枚举类不能对外创建对象
- 枚举都是最终类 不可以被继承
替代传统的使用int常量来表示某些特定的值
什么是泛型?泛型有什么作用?什么是向上转型?什么是向下转型?
在定义类 接口 方法时 同时声明了一个或多个类型变量(<E>) 称为泛型类 泛型接口 泛型方法 统称为泛型
提供了在编译阶段约束所能操作的数据类型 并能自动进行检查 这样可以避免强制类型转换时可能出现的异常
本质 把具体的数据类型作为参数传递给类型变量
向上转型 把一个子类对象的引用赋值给父类对象的引用 也就是会所 向上转型是对A对象的方法的扩充 就是A的对象可访问B从A中继承来的和B“重写”A的方法。
向下转型 则是向上转型的逆过程,也就是把父类对象的引用赋值给子类对象的引用 但是向下转型必须显式进行
举个小李子
class Animal {
// ...
class Dog extends Animal {
// ...
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal(); // 父类对象
Dog myDog = (Dog) myAnimal; // 向下转型:尝试将父类对象引用赋值给子类对象引用
// 如果 myAnimal 确实指向了一个 Dog 对象,则 myDog 将正确引用该对象。
// 如果 myAnimal 没有指向 Dog 对象,这行代码将抛出 ClassCastException。
myDog.makeSound(); // 如果转型成功,将调用 Dog 类的 makeSound 方法
常用API
StringBuilder
StringBuilder() 创建一个空白的可变字符串 不包含任何内容
StringBuilder(String str)创建一个指定字符串内容的一个可变字符串对象
append 添加数据返回StringBuilder本身
reserve 将对象内容反转
length 返回对象长度
toString 将StringBuiler类型转换成String类型
StringJoiner
StringJoiner(间隔符号) 创建一个StringJoiner对象 指定拼接时的间隔时的拼接符号
StringJoiner(间隔符号,开始符号,结束符号)
add 添加数据返回本身 注意拼接时会自动添加指定的拼接符号
length 返回长度
toString 返回字符串