JavaSE错题回顾

在题目中午遇到了字符数组和字符串进行比较即便是用了

  1. (字符数组).equals(字符串)的方法
  1. 发现他的结果是:
  1. 我以为是true,所以现在就打算DeBug一下 在Java中,char[]String 是两种不同的数据类型,虽然它们都表示字符序列,但它们的性质和比较方式是不同的。在这个代码中,我们创建了一个字符数组 char[] ch = {'h', 'e', 'l', 'l', 'o'} 和一个字符串 String b = "hello",然后尝试通过 ch.equals(b) 来比较它们是否相等。

返回值是false的原因是,char[]String 是不同的类型,它们在内存中的存储结构和相等性判断方式不同。

  • char[] 数组是一个对象类型,它在内存中是一个数组对象,每个元素都存储一个字符。char[] 类型没有覆盖 equals() 方法,所以默认情况下使用的是 Object 类中的 equals() 方法,它是基于对象的引用地址进行比较。因此,无论 char[] ch 中的字符内容与字符串 "hello" 相同与否,它们是不同的对象,所以比较结果为 false
  • String 类型是Java中的一个特殊引用类型,但它的设计使得它更像一个基本数据类型。String 类覆盖了 equals() 方法,它实现了基于字符内容的比较。当你用 String.equals() 方法来比较两个字符串时,它会比较字符串的内容而不是引用地址,只要内容相同,它会返回 true

所以,尽管 char[] ch 中存储的字符内容与 String b 中的内容相同(都是 "hello"),但由于它们是不同的类型且在内存中的存储方式不同,ch.equals(b) 的比较结果是 false。正确的方式是使用 String.valueOf(char[])new String(char[]) 将字符数组转换成字符串,然后再进行比较。例如:

ini 复制代码
javaCopy code
char[] ch = {'h', 'e', 'l', 'l', 'o'};
String b = "hello";
System.out.println(String.valueOf(ch).equals(b)); // 输出 true
  • 包头不包尾

判断是否是实例(instanceof)

在Java编程语言中,instanceof是一个关键字,用于检查一个对象是否是特定类的实例,或者是否实现了某个接口。它的主要用途是在运行时确定对象的类型,以便在编程中进行相应的处理。

instanceof的语法如下:

typescript 复制代码
javaCopy code
object instanceof type

其中,object是要检查的对象,而type可以是类、接口或者数组类型。如果objecttype的实例,instanceof表达式将返回true,否则返回false

以下是一个简单的示例,说明了instanceof的使用:

scala 复制代码
javaCopy code
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        
        if (animal instanceof Dog) {
            System.out.println("The animal is a Dog.");
        } else if (animal instanceof Cat) {
            System.out.println("The animal is a Cat.");
        } else {
            System.out.println("The animal is of unknown type.");
        }
    }
}

在这个示例中,instanceof被用来检查animal对象是否是DogCat的实例,并根据检查结果执行不同的操作。

需要注意的是,instanceof的使用应该谨慎,因为过度的类型检查可能会导致代码的复杂性增加,也可能表明设计上的问题。在某些情况下,更好的做法是使用多态性和继承来避免频繁的类型检查。

另外,Java中还提供了类型转换运算符(casting)来将一个对象显式转换为特定类型,但是在进行类型转换之前最好先使用instanceof来进行类型检查,以避免可能的类型转换异常。 当涉及Java中的接口和类之间的关系时,主要涉及到实现(接口和类之间)和继承(类之间)的概念。让我们逐一详细讨论这些内容。

接口和类的实现:

在Java中,接口是一种特殊的引用类型,它定义了一组抽象方法和常量。接口本身不能被实例化,而是需要由类来实现它的抽象方法。一个类可以实现一个或多个接口,这样它就能够拥有接口定义的所有抽象方法,并可以提供具体的实现。

以下是接口和类之间实现的示例:

typescript 复制代码
javaCopy code
// 定义一个接口
interface Shape {
    void draw(); // 抽象方法
}

// 实现接口的类
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a square");
    }
}

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle();
        circle.draw(); // 输出: Drawing a circle

        Shape square = new Square();
        square.draw(); // 输出: Drawing a square
    }
}

在这个例子中,Shape是一个接口,CircleSquare是实现了Shape接口的类。类通过implements关键字来实现接口,并提供了draw()方法的具体实现。

接口和接口的继承:

在Java中,一个接口可以继承自一个或多个其他接口,这种继承关系被称为接口之间的"继承"。接口之间的继承允许一个接口从另一个接口继承抽象方法和常量,从而扩展和重用接口的定义。

以下是接口之间继承的示例:

csharp 复制代码
javaCopy code
// 定义两个接口
interface Walkable {
    void walk();
}

interface Swimmable {
    void swim();
}

// 一个接口继承自多个接口
interface Amphibious extends Walkable, Swimmable {
    // 这里可以声明新的抽象方法
}

// 实现继承了多个接口的接口
class Frog implements Amphibious {
    @Override
    public void walk() {
        System.out.println("The frog can walk.");
    }

    @Override
    public void swim() {
        System.out.println("The frog can swim.");
    }
}

public class Main {
    public static void main(String[] args) {
        Amphibious frog = new Frog();
        frog.walk(); // 输出: The frog can walk.
        frog.swim(); // 输出: The frog can swim.
    }
}

在这个例子中,WalkableSwimmable是两个接口,Amphibious是继承了这两个接口的新接口。Frog类实现了Amphibious接口,并提供了walk()swim()方法的具体实现。

类和类的继承:

在Java中,类之间可以通过继承建立父类和子类之间的关系。Java支持单继承,即一个类只能继承自一个直接父类,但是可以通过多层继承建立更复杂的继承关系。

以下是类之间单继承和多层继承的示例:

scala 复制代码
javaCopy code
// 父类
class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound.");
    }
}

// 子类继承父类
class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Dog barks.");
    }

    void fetch() {
        System.out.println("Dog fetches a ball.");
    }
}

// 多层继承
class Bulldog extends Dog {
    @Override
    void makeSound() {
        System.out.println("Bulldog growls.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // 输出: Dog barks.
        dog.fetch();     // 输出: Dog fetches a ball.

        Bulldog bulldog = new Bulldog();
        bulldog.makeSound(); // 输出: Bulldog growls.
        bulldog.fetch();     // 输出: Dog fetches a ball.
    }
}

在这个例子中,Animal是一个父类,Dog是继承自Animal的子类,Bulldog是继承自Dog的子类。子类可以重写父类的方法,并可以拥有自己的额外方法。注意,虽然Bulldog继承自Dog,但它也间接继承了Animal的所有特性。

总结:

  • 接口和类之间的实现关系通过implements关键字实现。
  • 接口和接口之间的继承关系通过extends关键字实现,一个接口可以继承多个接口。
  • 类和类之间的继承关系通过extends关键字实现,Java支持单继承和多层继承。
相关推荐
2401_857622664 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
2402_857589364 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
哎呦没5 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch6 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
杨哥带你写代码7 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
AskHarries8 小时前
读《show your work》的一点感悟
后端
A尘埃8 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23078 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code8 小时前
(Django)初步使用
后端·python·django
代码之光_19808 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端