【Java不看后悔系列】|面向对象编程|[继承、封装、多态全覆盖]

简介: 【Java不看后悔系列】|面向对象编程|[继承、封装、多态全覆盖]


1.Judging right from wrong

(inheritance)

1.A child class inherits everything from its parent class.

2.A child class cannot inherit the constructors from its parent class .

子类继承的内容:

字段(成员变量):

子类会继承父类的字段,包括实例变量和静态变量。子类可以直接访问继承而来的字段。

方法:

子类会继承父类的方法,包括实例方法和静态方法。子类可以直接调用继承而来的方法。

子类可以重写(override)父类的方法,以提供特定于子类的实现。

构造方法:

如果子类没有定义构造方法,它会默认调用父类无参构造方法(如果父类有的话)。

如果子类定义了构造方法,可以使用 super 关键字调用父类的构造方法。

接口的实现:

如果父类实现了某个接口,子类也会继承该接口的实现,除非子类明确地重新实现了该接口。

子类不继承的内容:

私有成员

子类不会继承父类中的私有成员(私有字段、私有方法)

构造方法:

子类继承父类的构造方法但是,子类可以通过使用 super 调用父类的构造方法来初始化继承的部分。

父类的静态成员:

子类不会继承父类的静态成员静态成员与类关联的,而不是与对象关联的

父类的构造方法私有属性:

如果父类的构造方法是私有的,子类不能直接调用父类的构造方法。这通常会限制子类对父类构造方法的继承。

在Java中,子类会继承其父类的一些特性,但并非所有内容都会被继承。---> F,F


3.The superclass’s constructor must be explicitly invoked in the subclass’s constructor.

在Java中,当你在子类中创建构造函数时,通常需要显式调用超类的构造函数使用super关键字来实现。如果在子类构造函数中没有显式调用超类构造函数,Java将隐式插入对超类默认(无参)构造函数的调用。

下面是一个示例,说明了这个概念:

class Superclass {
    // Default constructor---无参构造方法
    public Superclass() {
        System.out.println("Superclass default constructor");
    }
    // Parameterized constructor---含参构造方法
    public Superclass(int x) {
        System.out.println("Superclass parameterized constructor with x = " + x);
    }
}
class Subclass extends Superclass {
    // Implicit call to the default constructor of the superclass
    // if this constructor doesn't explicitly call a superclass constructor
    public Subclass() {
        //这里隐含super()
        System.out.println("Subclass constructor");
    }
    // Explicit call to the parameterized constructor of the superclass
    public Subclass(int y) {
        super(y); // Call to the parameterized constructor of the superclass
        System.out.println("Subclass constructor with y = " + y);
    }
}
public class Main {
    public static void main(String[] args) {
        Subclass obj1 = new Subclass();
        Subclass obj2 = new Subclass(10);
    }
}

子类Subclass在无参构造函数(Subclass())中隐式调用了超类Superclass的默认构造函数。在有参构造函数(Subclass(int y))中,通过使用super(y)显式调用了超类的带参数构造函数。

值得注意的是,如果超类没有默认构造函数,并且在子类构造函数中没有显式调用超类构造函数,那么将会引发编译错误。因为Java子类构造函数第一条语句

要么是使用super显式调用超类构造函数

要么是隐式调用超类的默认构造函数


2.selection

Questions  refer to the BankAccount, SavingsAccount, and CheckingAccountclasses defined below:

(Constructor,inheritance)

1. Of the methods shown, how many different nonconstructor methods can be invoked by a SavingsAccount object? ---> 找SavingAccount调用的非构造方法的个数

(A) 1   (B) 2  (C) 3   (D) 4  (E)5

因为我们之前已经学过什么是构造方法什么是继承,并且知道继承会继承父类的方法,若有遗忘点击👉🔗:http://t.csdnimg.cn/MZtBH

so 是4个--->D

调用父类构造方法的语句super()必须位于子类构造方法语句的句首。

2. Which is a correct implementation of the constructor with parameters in the SavingsAccount class?  

A:  不可以直接给父类私有变量直接赋值,对于父类的私有变量需要通过父类提供public的构造方法进行变量修改。

B:有getbalance只是返回balance的值,并不是把它的值给balance所以B不正确。

C:super();只是调用父类无参构造方法,balance = 0;

但是并未将accountBlance赋值给balance,所以错误

E: 父类不含两个参数构造方法,无法调用。

C:想要执行SavingsAccount class的含参构造方法,去修改参数的值,在子类可以 直接通过=赋值进行修改,而对于父类的私有变量需要通过父类提供public的构造方法进行变量修改。

如果父类类变量是private,要访问/修改父类私有变量,需要父类提供public的构造方法进行变量修改 --->D


📝总结:

在Java中,final 关键字有不同的用途,它可以用于变量、方法以及类。

1.Final 修饰变量:

当 final 用于修饰一个变量时,表示该变量是一个常量,其值不能被修改。这一次赋值后,就不能再次为该变量赋新值。

final int x = 10;

2.Final 修饰方法:

当 final 用于修饰一个方法时,表示该方法不能被子类重写(覆盖)。

public class Parent {
       public final void display() {
           System.out.println("This method cannot be overridden.");
       }
   }

3.Final 修饰类:

当 final 用于修饰一个类时,表示该类不能被继承,即不能有子类

final class FinalClass {
       // Class implementation
   }

使用 final 的好处包括:

安全性: 当一个变量被声明为 final 时,它的值不能被改变,这样可以防止在程序的其他部分意外地改变这个值。

性能优化: Java 编译器能够进行一些优化,因为它知道 final 变量的值在运行时不会发生变化,这可以在某些情况下提高性能。

设计上: final 方法和类可以阻止子类修改其行为,这有助于确保一些设计上的意图。

需要注意的是,final 并不是总是必需的,而是根据设计需要和代码安全性来决定是否使用。在合适的情况下使用 final 可以提高代码的清晰性和可维护性。

目录
相关文章
|
26天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
19 3
|
26天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
33 2
|
26天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
28 2
|
26天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
28 1
|
1月前
|
Java 测试技术 编译器
Java零基础-继承详解!
【10月更文挑战第6天】Java零基础教学篇,手把手实践教学!
22 0
|
11天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
21天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
8天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
28 9
|
11天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
8天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin