继承(包含Object类)

何为继承

在面向对象编程(OOP)中,继承是一种机制,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。继承提供了一种代码复用的方式,使得子类可以继承父类的公共属性和方法,而不需要重新编写相同的代码。

优点

代码复用

通过继承,可以在现有的类基础上创建新类,新类自动拥有父类的所有属性和方法,这样可以减少代码的重复编写。

易于维护和扩展

继承提供了一种层次结构,使得代码更加模块化,易于维护和扩展。如果需要修改某个功能,只需要在父类中修改,所有继承自该父类的子类都会受到影响。

缺点

紧密耦合

继承创建了类之间的强依赖关系,如果父类发生改变,可能会影响所有继承自该父类的子类。

缺乏灵活性

继承是静态的,一旦定义了继承关系,就很难改变。这限制了代码的灵活性。

常用的方法

在Java中,继承可以通过关键字extends来实现。下面是一个简单的示例:

// 父类
class Animal {
void eat() {
System.out.println("动物吃东西");
}
} // 子类
class Dog extends Animal {
void bark() {
System.out.println("狗叫");
}
} public class TestInheritance {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat(); // 继承自Animal类的方法
myDog.bark(); // Dog类特有的方法
}
}

Object类

在Java中,所有的类都隐式地继承自java.lang.Object类,这是Java类层次结构的根类。即使在定义类时没有显式地指定父类,它也会默认继承自Object类。

class MyClass {
// ...
} public class TestObject {
public static void main(String[] args) {
MyClass myObject = new MyClass();
// 可以使用Object类的方法
myObject.toString();
}
}

Object类中的常用方法:

在Java中,Object类是所有类的根类,它提供了一些常用的方法,这些方法在很多情况下都非常有用。以下是Object类的一些常用方法及其简要说明:

  1. equals(Object obj):检查传递给此方法的对象是否与该对象相等。默认行为是比较对象的引用,但通常需要根据类的属性重写这个方法。

  2. hashCode():返回该对象的哈希码值。支持equals方法的类通常也应该重写hashCode方法,以维护equalshashCode的一致性。

  3. toString():返回该对象的字符串表示。通常需要重写这个方法以提供更有用的信息。

  4. getClass():返回运行时类对象,这个类对象表示该对象的实际类。

  5. notify()notifyAll():唤醒在此对象监视器上等待的单个或所有线程。

  6. wait():导致当前线程等待,直到另一个线程调用此对象的notify()notifyAll()方法。

  7. wait(long timeout)wait(long timeout, int nanos):导致当前线程等待,直到另一个线程调用此对象的notify()notifyAll()方法,或者超过指定的时间。

下面是一个示例,展示了如何使用这些方法:

class Person {
private String name;
private int age; public Person(String name, int age) {
this.name = name;
this.age = age;
} @Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age &&
(name != null ? name.equals(person.name) : person.name == null);
} @Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} public static void main(String[] args) throws InterruptedException {
Person person1 = new Person("Kimi", 30);
Person person2 = new Person("Kimi", 30); System.out.println("person1 = " + person1);
System.out.println("person2 = " + person2); System.out.println("Are person1 and person2 equal? " + person1.equals(person2));
System.out.println("Hash code of person1: " + person1.hashCode());
System.out.println("Hash code of person2: " + person2.hashCode()); // 获取类对象
System.out.println("Class of person1: " + person1.getClass().getName());
System.out.println("Class of person2: " + person2.getClass().getName());
}
}

在这个例子中,我们重写了equalshashCodetoString方法,以便提供更有意义的行为。我们也展示了如何获取对象的类对象,并打印出它的名称。这个例子没有展示waitnotifynotifyAll方法的使用,因为它们通常与多线程编程一起使用,涉及到更复杂的同步机制。

方法重写规则

方法重写(Override)是指子类中定义一个与父类中具有相同名称、参数列表的方法。这是实现多态的一种方式。

方法重写规则

  1. 方法名、参数列表和返回类型必须与父类中被重写的方法相同。
  2. 访问权限不能比父类中被重写的方法更严格。
  3. 不能重写父类中声明为final的方法。
  4. 如果父类中的方法被声明为static,则子类中的方法也必须是static

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

  • 方法重写:发生在子类和父类之间,要求方法名、参数列表相同,返回类型相同或兼容,访问权限相同或更宽松。
  • 方法重载:发生在同一个类中,要求方法名相同,参数列表不同。

示例代码

class Parent {
void show() {
System.out.println("Parent show()");
}
} class Child extends Parent {
// 方法重写
void show() {
System.out.println("Child show()");
} // 方法重载
void show(int num) {
System.out.println("Child show(int num)");
}
} public class TestOverride {
public static void main(String[] args) {
Child obj = new Child();
obj.show(); // 调用重写的方法
obj.show(10); // 调用重载的方法
}
}

super关键字的用法

super关键字用于引用父类中的属性、方法和构造器。

示例代码

class Parent {
String name = "Parent"; void show() {
System.out.println("Parent show()");
}
} class Child extends Parent {
String name = "Child"; void show() {
super.show(); // 调用父类的show方法
System.out.println("Child show(), name = " + name);
}
} public class TestSuper {
public static void main(String[] args) {
Child obj = new Child();
obj.show();
}
}

final关键字的用法

final关键字可以用于修饰类、方法和变量。

  • final类:不能被继承。
  • final方法:不能被重写。
  • final变量:一旦赋值后,其值不能被改变。

示例代码

final class FinalClass {
// ...
} class MyClass {
final void show() {
// ...
}
} public class TestFinal {
public static void main(String[] args) {
final int num = 10; // final变量
// num = 20; // 编译错误:不能为final变量赋值
}
}

通过上述内容,你应该对继承有了基本的了解,包括它的概念、优点、缺点、方法重写规则以及superfinal关键字的用法。希望这些示例代码能帮助你更好地理解这些概念。

JavaSE-继承(包含Object类)的更多相关文章

  1. java学习笔记6--类的继承、Object类

    接着前面的学习: java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) java学习笔记2--数据类型.数组 java学习笔记 ...

  2. 05 多继承、object类

    多继承 Python中一个类可以继承多个父类,并且获得全部父类的属性和方法. class A: def demo(self): print("demo") class B: def ...

  3. [javaSE] 面向对象(Object类toString)

    每一个对象,都有一个在内存中的地址哈希值,这个哈希值是十六进制的 调用Object对象的hashCode()方法,返回这个对象的哈希值 调用Integer.toHexString()方法,转换十六进制 ...

  4. 数组也继承了Object类

    C++ 最根上的类有好多,也可以随便地定义.

  5. JavaSE基础知识(5)—面向对象(Object类)

    一.包 java.lang包,属于java中的核心包,系统默认导入的,不用手动导入该包中的类:Object.System.String.Integer等 1.包的好处 ①分类管理java文件,查找和管 ...

  6. 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍

    面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...

  7. 第10章 接口、继承与多态----Object类

    在Java中,所有的类都直接或间接继承了java.lang.Object类.Object类是比较特殊的类,它是所有类的父类,是Java类层中的最高层类.当创建一个类时,总是在继承,除非某个类已经指定要 ...

  8. python 全栈开发,Day20(object类,继承与派生,super方法,钻石继承)

    先来讲一个例子 老师有生日,怎么组合呢? class Birthday: # 生日 def __init__(self,year,month,day): self.year = year self.m ...

  9. 四. Java继承和多态10. Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...

  10. 面向对象编程(四)继承,概念及super关键字,final关键字,Object类常见方法

    继承 概念: ①   继承背后的思想就是基于已存在的类来构建新类; ②   当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求; ③   当从其它类导出的类叫作子 ...

随机推荐

  1. BS直聘职位数据采集与分析(爬虫)

    一.项目介绍 在当今竞争激烈的就业市场中,及时掌握职位信息和市场动态变得尤为重要.本文将详细介绍如何使用Python开发一个爬虫项目,自动采集BOSS直聘网站的职位数据,并对数据进行处理和分析. 1. ...

  2. C++用Mutex实现读写锁

    近期答辩完成了,想回头看看之前没做过的2PL. 实现2PL有4种方式: 死锁检测.本篇是为了做这个而实现的,做这个事情的原因是c++标准库的shared_mutex无法从外界告知获取锁失败. 如果需要 ...

  3. 搭建邮局-3.安装邮局前端roundcube和测试

    目录 搭建邮局-1.安装hMailserver和配置邮局 https://www.cnblogs.com/daen/p/16040202.html 搭建邮局-2.添加域名和域名解析 https://w ...

  4. 初探Iris

    Iris 安装 go get -u github.com/kataras/iris 若遇到下面这种情况: 可删除保存路径中的kataras目录,并执行go get github.com/kataras ...

  5. JS如何实现实时获取网络时间

    首先我们列出常用的js获取网络时间的代码: getFullYear()获取年份 getMonth()获取月份[0-11] getDate()获取日 getHours()获取小时 getMinutes( ...

  6. Golang基础笔记一之变量声明和类型介绍

    本文首发于公众号:Hunter后端 原文链接:Golang基础笔记一之变量声明和类型介绍 这一篇笔记主要介绍 Golang 的基础内容,包括 Golang 的运行,变量声明以及 Golang 里的各种 ...

  7. 浅谈开源在线客服系统与 APP 集成的技术方案与优劣势

    在为移动端 App 接入在线客服系统的过程中,我经历了长时间的技术选型探索.最初,我也曾被一些"技术理想主义"选项所吸引,比如让用户自己研发界面我提供 API 以获得最高自由度,或 ...

  8. C# Model对象转DataTable

    https://blog.csdn.net/a11112244444/article/details/78921200 https://www.cnblogs.com/chongde/articles ...

  9. Java MCP 鉴权设计与实现指南

    一.MCP 鉴权概述 MCP (Model Context Protocol) 旨在为大语言模型(LLM)与外部数据源.工具和服务提供标准化.安全的集成方式(相当于一种专用的 RPC 协议).广泛应用 ...

  10. js 获取函数的调用者

    办法 严格模式arguments.callee.caller不给使用了 歪路子截取new Error()的报错字符串stack const getCall = ()=>{ let callArr ...