首页 > 编程语言 >JavaSE-继承(包含Object类)

JavaSE-继承(包含Object类)

时间:2024-10-25 14:22:37浏览次数:5  
标签:name show 继承 方法 Object JavaSE 父类 重写

目录

继承(包含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关键字的用法。希望这些示例代码能帮助你更好地理解这些概念。

标签:name,show,继承,方法,Object,JavaSE,父类,重写
From: https://www.cnblogs.com/wjw2003512/p/18502446

相关文章

  • blender4.2 插件安装 auto-rig 报错'bpy.app' object has no attribute 'version_char
     找到安装的插件位置的version.py文件我的在  "C:\Users\zyz\AppData\Roaming\BlenderFoundation\Blender\4.2\scripts\addons\auto_rig_pro-master\src\lib\version.py"可以参考一下 修改代码第8行的代码,#_char=bpy.app.version_char_char=getattr(bpy.app,'ver......
  • Objectarx批量打印只能打印第一个的解决方法
    最近接到一个需求,按照图纸中的图框把图纸批量打印,在我的本机测试是没问题的,可以把图纸都打印出来,但是客户表示只能打印出来第一个,并且速度很慢。后来在网上查到了解决方法。//修改环境变量为前台打印structresbufres,res2;acedGetVar(_T("BACKGROUNDPLOT"),&res);res2.re......
  • Swift 中的协议和继承有什么区别?
    协议和继承在Swift中都用于定义一个类型应有的行为,但它们的使用场景和方式有明显区别:1、 协议定义了一个蓝图,规定了遵循协议的类型必须实现的方法和属性,但不提供这些方法和属性的具体实现。协议可以被枚举、结构体和类遵循。2、 继承允许一个类继承另一个类的特性,如方法和属性......
  • object references an unsaved transient instance - save the transient instance be
    org.hibernate.TransientPropertyValueException:objectreferencesanunsavedtransientinstance-savethetransientinstancebeforeflushing:com.jms.cfc.product.domain.ProductMaintainHistory.product->com.One;nestedexceptionisjava.lang.IllegalSt......
  • Java-继承与多态-下篇
    ......
  • Java的继承概念
    在Java中,继承是一种重要的面向对象编程概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。使用继承可以提高代码的复用性和可维护性。继承的基本语法使用extends关键字来声明一个类继承自另一个类。classParent{//父类的属性和方法}classChildextendsPar......
  • 继承_练习_定义经理类
    写代码前,先创建一个名为inheritance(继承)的包,以下所有代码都在该包中创建。员工类此类可直接复制。packageinheritance;importjava.time.LocalDate;publicclassEmployee{privatefinalStringname;//姓名privatedoublesalary;//薪水privatefina......
  • 继承 super 抽象 接口 多态
    继承类的继承是指在一个现有类的基础上去构建新的类,构建出来的子类就是儿子,现有类好比就是一个父类,模板一样的存在,与new出多个类互不影响一致,但是继承的子类是可以使用父类的属性的程序中想声明一个类去继承另一个类,使用的是extends关键字下面三个类是可以......
  • [Paper Reading] HOIDiffusion: Generating Realistic 3D Hand-Object Interaction Da
    目录HOIDiffusion:GeneratingRealistic3DHand-ObjectInteractionDataTL;DRMethod阶段一阶段二TrainingCode&&ImplementationExperiment效果可视化总结与发散HOIDiffusion:GeneratingRealistic3DHand-ObjectInteractionDatalink时间:24.03作者与单位:主页:https:......
  • JavaSE——IO流5:高级流(序列化与反序列化流/对象操作流)
    目录一、序列化流/对象操作输出流——ObjectOutputStream二、反序列化流/对象操作输入流——ObjecInputStream三、序列化流和反序列化流使用细节1.Serializable接口2.序列化后的文件不可修改3.serialVersionUID4.transient修饰的不能被序列化四、用对象流读写多个对象......