当前位置: 首页 > java >正文

java复习 02

谢谢伟大的ai给我出卷子,,谢谢,,谢谢大模型,感恩,我像是一只皮革。。。。

1 实现接口必须实现其所有抽象方法,否则类必须声明为抽象类。

2 子类重新实现父类同名方法称为方法重写,需遵循 "两同两小一大" 原则

在 Java 的方法重写(覆盖,Overriding) 中,子类重写父类方法时需要遵循 “两同两小一大” 原则,这是确保重写合法性和多态正确性的关键规则。以下是对该原则的详细解析:

一、两同

1. 方法名相同

子类重写的方法必须与父类被重写的方法完全同名
示例

java

class Parent {public void show() { ... } // 父类方法名是 show
}
class Child extends Parent {public void show() { ... } // 子类方法名必须也是 show
}
2. 参数列表相同

子类方法的参数类型、顺序、数量必须与父类方法完全一致,不能修改参数列表。
示例

java

class Parent {public void print(int num) { ... } // 父类参数是 int
}
class Child extends Parent {public void print(int num) { ... } // 子类参数必须也是 int,不能改为 long 或其他类型
}

二、两小

1. 子类方法的返回值类型小于或等于父类方法的返回值类型
  • 若父类方法返回基本数据类型,子类返回值类型必须与父类完全相同
    示例

    java

    class Parent {public int getNum() { return 1; } // 父类返回 int
    }
    class Child extends Parent {public int getNum() { return 2; } // 子类必须也返回 int,不能改为 long
    }
    
  • 若父类方法返回引用数据类型(如类),子类返回值类型必须是父类返回值类型的子类或相同类型(称为 协变返回类型)。
    示例

    java

    class Animal { ... }
    class Dog extends Animal { ... }class Parent {public Animal getPet() { return new Animal(); } // 父类返回 Animal
    }
    class Child extends Parent {public Dog getPet() { return new Dog(); } // 子类返回 Dog(Animal 的子类),合法
    }
    
2. 子类方法声明抛出的异常类型小于或等于父类方法声明抛出的异常类型
  • 子类方法可以声明抛出父类方法异常的子类不抛出异常,但不能抛出父类方法未声明的更宽泛的异常
    示例

    java

    import java.io.IOException;class Parent {public void work() throws IOException { ... } // 父类抛出 IOException
    }
    class Child extends Parent {public void work() throws FileNotFoundException { ... } // FileNotFoundException 是 IOException 的子类,合法
    }
    
     
    • 若父类方法未声明抛出异常,子类方法不能声明抛出受检异常(但可以抛出非受检异常,如 RuntimeException)。

三、一大

子类方法的访问权限大于或等于父类方法的访问权限
  • 父类方法的访问修饰符决定了子类方法的最低权限要求:
    父类方法修饰符子类方法允许的修饰符示例(父类方法)子类合法修饰符
    private只能在子类中重新定义为 privateprivate void method()必须也是 private
    默认(包访问)可以是 默认protectedpublicvoid method()protectedpublic
    protected可以是 protectedpublicprotected void method()public
    public必须是 publicpublic void method()只能是 public
  • 核心逻辑:子类不能缩小父类方法的访问范围,否则会破坏多态的可用性(例如,父类引用调用子类方法时可能因权限不足无法访问)。

四、违反原则的后果

若不遵循 “两同两小一大” 原则,编译器会报错,提示 “方法未正确覆盖父类方法”。例如:

  • 改方法名 → 变成方法重载,而非重写。
  • 改参数列表 → 变成方法重载,父类方法未被覆盖。
  • 缩小访问权限 → 编译错误(如父类方法是 public,子类改为 protected)。

五、总结图示

plaintext

父类方法:
修饰符 返回值 方法名(参数列表) throws 异常列表 { ... }子类重写要求:
↓        ↓       ↓          ↓              ↓
│        │       │          │              ├─ 异常类型 ≤ 父类异常(两小)
│        │       │          ├─ 参数列表必须相同(两同)
│        │       └─ 方法名必须相同(两同)
│        └─ 返回值类型 ≤ 父类返回值(两小)
└─ 修饰符 ≥ 父类修饰符(一大)

通过遵循该原则,可确保多态机制在运行时正确调度子类方法,避免逻辑错误和编译问题。

3 接口中的方法默认是public abstract(可省略),属性默认是public static final

super可调用父类构造方法、成员方法或属性。 

final修饰的类不可被继承,修饰的方法不可被重写。 

6 一个对象只能属于一个类,但可实现多个接口。

7 构造方法不能被继承,但子类构造默认调用父类无参构造。

8 抽象类可以不含抽象方法,但含抽象方法的类必须声明为抽象类。

9 面向对象三大特征

  • 封装
    将数据(属性)和操作(方法)绑定为一个整体,并隐藏内部细节。
    示例

    java

    public class Person {private String name; // 私有属性,外部不可直接访问public String getName() { return name; } // 公共访问方法
    }
    
  • 继承
    子类继承父类的属性和方法,实现代码复用和扩展。
    示例

    java

    class Animal { void eat() { ... } }
    class Dog extends Animal { void bark() { ... } } // Dog继承eat()方法
    
  • 多态
    同一操作作用于不同对象,产生不同行为。
    示例

    java

    Animal a = new Dog(); // 父类引用指向子类对象
    a.eat(); // 调用Dog重写的eat()方法
    

10 接口与抽象类的区别

维度接口抽象类
结构仅含抽象方法和常量含抽象方法、非抽象方法和变量
继承限制允许多实现(implements)单继承(extends)
成员修饰符方法默认public abstract,属性默认public static final无强制要求
设计目的定义行为规范,实现 "has-a" 关系定义共性,实现 "is-a" 关系

11  方法重载与方法重写的区别

维度方法重载(Overloading)方法重写(Overriding)
范围同一个类中子类与父类间
条件方法名相同,参数列表不同方法名、参数列表、返回类型均相同
机制编译时多态(静态绑定)运行时多态(动态绑定)
访问权限无限制子类权限≥父类权限
http://www.xdnf.cn/news/11366.html

相关文章:

  • 苹果CMS采集资源站
  • cognos入门
  • random()随机函数
  • System V消息队列报Resource temporarily unavailable 错误
  • C#-TimeSpan格式化字符串格式
  • GoAhead4 - 用户认证
  • 五种多目标优化算法(MOFA、NSWOA、MOJS、MOAHA、MOPSO)性能对比(提供MATLAB代码)
  • jxl使用总结(三)
  • Git命令操作【全系列】
  • 植物大战僵尸汉化教程 怎样玩中文版的植物大战僵尸
  • 一文看懂人机对话
  • Glassfish安装、基本使用、在idea中配置Glassfish
  • C# List用法 List介绍
  • 三极管工作原理详解
  • 数据库的底层原理,你知道吗?
  • 详解Python文件: .py、.ipynb、.pyi、.pyc、​.pyd !
  • C语言面试题大汇总
  • 最大矩形面积问题——单调栈法
  • Wireshark零基础使用教程(超详细)_wireshark使用教程
  • linux删除命令
  • 什么是Proxy Server
  • Java IO
  • 15款方便实用在线PDF转换器
  • C-Free使用教程(使用C-Free编写C语言程序)
  • 20230507使用python3批量转换DOCX文档为TXT
  • Android组件化跨进程通信框架Andromeda解析(1)
  • innerText,innerHTML的用法以及注意事项
  • Linux 内核(Kernel)组成分析
  • 建议收藏万字长文!嵌入式Linux系统移植原理与方法总结
  • 码率(Bitrate)、帧率(FPS)、分辨率和清晰度的联系与区别