【JAVA杂货铺】一文带你走进面向对象编程|继承|重载|重写|期末复习系列 | (中4)

简介: 【JAVA杂货铺】一文带你走进面向对象编程|继承|重载|重写|期末复习系列 | (中4)



继承

package Inherit;
class Dog {
  public String name;
  public int age;
  public void barks() {
    System.out.println(name + "汪汪叫!");
  }
  public void eat() {
    System.out.println(name + "正在吃饭!");
  }
}
class Cat{
  public String name;
  public int age;
  public void eat() {
    System.out.println(name + "正在吃饭!");
  }
  public void CatchMouse() {
    System.out.println(name + "正在抓老鼠");
  }
}
public class Test{
  public static void main(String[] args) {
  }
}

对比狗和猫这两个类,我们会发现它们有共同的属性,name,age 和 eat.

我们可以把它们相同的抽离出来,放到同一个Animal类里面.

通过extends(继承)关键字,让子类继承父类

当子类继承父类之后,就会把属性和方法全部继承.

继承:就是抽取共性,从而达到代码的复用[重复使用]

package Inherit;
class Animal{
  public String name;
  public int age;
  public void eat() {
    System.out.println(name + "正在吃饭!");
  }
}
class Dog extends Animal{
  public void barks() {
    System.out.println(name + "汪汪叫!"+"年龄"+ age);
  }
}
class Cat extends Animal{
  public void CatchMouse() {
    System.out.println(name + "正在抓老鼠");
  }
}
public class Test{
  public static void main(String[] args) {
    Dog dog = new Dog();
    //属性继承
    dog.name = "旺财";
    dog.age = 10;
    dog.barks();
    //方法继承
    dog.eat();
  }
}

注意:

1.子类将父类中的成员变量或成员方法继承到子类中.

2.子类继承父类之后,必须要新添加自己特有的成员,体现它与父类的不同,否则没有必要进行继承.


私有成员变量在继承中的使用

注意:私有的成员 可以被继承 但是不能访问.

若想访问,我们可以通过 get和 set方法进行访问

代码如下:

package Inherit;
class Animal{
  private String name;
  public int age;
  public void eat() {
    System.out.println(name + "正在吃饭!");
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}
class Dog extends Animal{
  public void barks() {
    System.out.println(getName() + "汪汪叫!"+"年龄"+ age);
  }
}
class Cat extends Animal{
  public void CatchMouse() {
    System.out.println(getName() + "正在抓老鼠");
  }
}
public class Test{
  public static void main(String[] args) {
    Dog dog = new Dog();
    //属性继承
    dog.setName("旺财");
    dog.age = 10;
    dog.barks();
    //方法继承
    dog.eat();
    Cat cat = new Cat();
    //属性继承
    cat.setName("喵喵");
    cat.age = 10;
    cat.CatchMouse();
    //方法继承
    cat.eat();
  }
}


当子类和父类变量不重名时:

package Inherit;
/**
 * 子类和父类不存在同名变量时
 */
class Base{
  int a;
  int b;
}
public class Derived extends Base{
  int c;
  public void method(){
    a = 10;//来自父类
    b = 20;//来自父类
    c = 30;
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
  }
  public static void main(String[] args) {
    Derived derived = new Derived();
    derived.method();
  }
}

控制台运行结果:

当子类和父类重名时:

package Inherit;
/**
 * 子类和父类存在同名变量时
 */
class Base{
  int a;
  int b;
  public void methodA() {
    System.out.println("Base 中的methodA()");
  }
}
public class Derived extends Base{
  int a = 60;// 与父类成员 a 同名,类型相同 
  char b = 'o';//与父类成员 b 同名,不同类
  int c;
  public void methodB() {
    System.out.println("Derived 中的 methodB()方法");
  }
  public void methodC() {
    methodB();//访问子类自己的methodB()
        methodA();//访问父类继承的methodA()
//        methodD();//编译失败,在整个继承过程中没有发现方法
  }
  public void method(){
//    a = 10;//来自父类
    b = 20;//来自父类
    c = 30;
    System.out.println(super.a);
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
  }
  public static void main(String[] args) {
    Derived derived = new Derived();
    derived.method();

父类与子类重合,优先访问子类

控制台运行结果:


📝总结:

继承的含义:

抽取共性,通过子类继承(extends)父类,达到代码复用


toString方法的作用:

在JAVA中,toString()方法是Object类中的一个方法,它的作用返回一个表示对象的字符串。当我们需要将一个对象转换为字符串时,可以使用toString()方法

如果我们没有重写该方法,则默认返回对象的类名和哈希码。

下面是一个toString()方法的代码案例:

public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public static void main(String[] args) {
        Person person = new Person("Tom", 20);
        System.out.println(person.toString());
    }
}

在上面的代码中,我们定义了一个Person类,并重写了toString()方法,返回了一个包含name和age属性的字符串。在main方法中,我们创建了一个Person对象,并使用toString()方法将其转换为字符串并输出。


重写和重载的区别

JAVA官方语法文档链接🔗👉:The Java® Language Specification

通过ctrl + F 找到 overload重载

重写和重载都是面向对象程序设计中的概念,它们的作用都是实现多态。但是它们的含义和实现方式是不同的

重载(Overload):指的是在同一个类内部或者父子类之间方法名相同,但是参数列表不同(参数类型、参数个数、参数顺序返回值类型可以是相同的也可以不同。这样的方法就叫做重载方法。

编译器根据调用时传递的不同参数,来确定调用的具体方法。

重写(Override):是指子类重写父类方法,方法名、参数列表、返回值类型与父类相同。这时候子类中的方法会覆盖掉父类中的方法,实现多态

下面是一些示例代码:

重载:

public class OverloadExample {
    public int add(int a, int b) {
        return a + b;
    }
    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

重写:

public class OverrideExample {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.eat();
    }
}
class Animal {
    public void eat() {
        System.out.println("Animal is eating");
    }
}
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog is eating");
    }
}

在上面的重写示例中,Dog 类继承自 Animal 类,重写了 eat() 方法。使用多态的方式创建了一个 Animal 类对象 animal,然后调用 eat() 方法,实际调用的是 Dog 类中重写的 eat() 方法,输出 "Dog is eating"。

目录
相关文章
|
20天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
15 3
|
20天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
29 2
|
20天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
27 2
|
20天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
27 1
|
2月前
|
Java 编译器 数据安全/隐私保护
Java 重写(Override)与重载(Overload)详解
在 Java 中,重写(Override)和重载(Overload)是两个容易混淆但功能和实现方式明显不同的重要概念。重写是在子类中重新定义父类已有的方法,实现多态;重载是在同一类中定义多个同名但参数不同的方法,提供多种调用方式。重写要求方法签名相同且返回类型一致或为父类子类关系,而重载则关注方法参数的差异。理解两者的区别有助于更好地设计类和方法。
|
3月前
|
Java
【Java基础面试十八】、说一说重写与重载的区别
这篇文章阐述了Java中重写与重载的区别:重载是同一个类中方法名相同但参数列表不同的方法之间的关系,而重写是子类中方法与父类中相同方法名和参数列表的方法之间的关系,且子类的返回值应小于等于父类,访问修饰符应大于等于父类。
【Java基础面试十八】、说一说重写与重载的区别
|
5月前
|
Java 编译器
在 Java 中,重写(Override)和重载(Overload)是两种不同的概念,用于实现多态性。它们有着不同的作用和使用场景。
在 Java 中,重写(Override)和重载(Overload)是两种不同的概念,用于实现多态性。它们有着不同的作用和使用场景。
|
6月前
|
Java
【Java开发指南 | 第二十五篇】Java 重写(Override)与重载(Overload)
【Java开发指南 | 第二十五篇】Java 重写(Override)与重载(Overload)
47 1
|
Java 编译器
Java重写(Override)&重载(Overload)
重写(Override)概述 Java面向对象编程中的重写(override)指的是子类可以重写其父类中的非private方法,使得子类在调用该方法时会使用自己的实现而不是父类的实现。 重写(Override)讲解 定义一个名为 Animal 的父类和一个名为 Cat 的子类,其中 Cat 类继承了 Animal 类。Animal 类中有一个名为 move() 的方法,Cat 类可以对这个方法进行重写。 Animal 类中的 move() 方法不是private 类型,因此它可以被其子类重写。在 Cat 类中,使用相同的名称和参数列表来重新定义了 move() 方法,并且使用 @Overrid
161 0