【Java SE】抽象类和接口(二)

简介: 【Java SE】抽象类和接口

🐳如何实现接口间的继承

1. //把IRunning,ISwimming,Iflying全部继承到IAction上
2. 
3. interface IAction extends IRunning,ISwimming,Iflying{
4. 
5. }
6. 
7. class Swan extends Animal implements IAction {
8. 
9. 
10. public Swan(String name) {
11. super(name);
12.     }
13. 
14. @Override
15. public void run() {
16.         System.out.println(name + "正在跑");
17. 
18.     }
19. 
20. @Override
21. public void swim() {
22.         System.out.println(name + "正在游泳");
23. 
24.     }
25. 
26. @Override
27. public void fly() {
28.         System.out.println(name + "正在飞");
29. 
30.     }
31. }
32. 
33. public class Test {
34. 
35. public static void main(String[] args) {
36.        Swan swan=new Swan("白白");
37.        swan.run();
38.        swan.swim();
39.        swan.fly();
40. 
41.     }
42. 
43. }

接口间的继承相当于把多个接口合并在一起。

🐳抽象类和接口的区别:

(1)抽象类可以有构造方法,接口中不能有构造方法。

(2)抽象类中可以有普通成员变量,接口中没有普通成员变量。

(3)抽象类中可以包含静态方法,接口中不能包含静态方法。

(4) 一个类可以实现多个接口,但只能继承一个抽象类。

(5)接口可以被多重实现,抽象类只能被单一继承。

(6)如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。

接口和抽象类的相同点:

(1) 都可以被继承。

(2) 都不能被实例化。

(3) 都可以包含方法声明。

(4) 派生类必须实现未实现的方法。

 

🐳何为Object类?

Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。即所有类的对象都可以使用Object的引用进行接收。

 

1. public class Test2 {
2. public static void main(String[] args) {
3. 
4.         fun1(new A());
5.         fun1(new B());
6.     }
7. public static void fun1(Object object){
8.         System.out.println(object);
9.     }
10. }
11. 
12. 
13. class A{
14. 
15. }
16. class B{
17. 
18. }

🐳利用Object类获取对象信息

如果要打印对象中的内容,可以直接重写Object类中的toString()方法

1. class Animal{
2. protected String name;
3. 
4. public Animal(String name){
5. this.name=name;
6.     }
7. 
8. @Override
9. public String toString() {
10. return "Animal{" +
11. "name='" + name + '\'' +//可以修改
12. '}';
13.     }
14. }

🐳 利用Object类进行对象比较

在Java中,==进行比较时:
a.如果==左右两侧是基本类型变量,比较的是变量中值是否相同
b.如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
c.如果要比较对象中内容,必须
重写Object中的equals方法,因为equals方法默认也是按照地址比较的

1. //Object类中的equals方法
2. public boolean equals(Object obj) {
3. return (this == obj); // 使用引用中的地址直接来进行比较
4. }
5. 
6. public class Test {
7. public static void main(String[] args) {
8.         Cat cat1=new Cat("小白",5);
9.         Cat cat2=new Cat("小白",5);
10. int a=10;
11. int b=10;
12.         System.out.println(a==b);
13.         System.out.println(cat1==cat2);
14.         System.out.println(cat1.equals(cat2));
15. 
16.     }
17. }
18. 
19. class Cat{
20. private String name;
21. private int age;
22. public Cat(String name,int age){
23. this.name=name;
24. this.age=age;
25.     }
26. }

重写equals方法后,然后比较:

1. @Override
2. public boolean equals(Object o) {
3. if (this == o) return true;
4. if (o == null || getClass() != o.getClass()) return false;
5. Cat cat = (Cat) o;
6. return age == cat.age && name.equals(cat.name);
7.     }

结论:比较对象中内容是否相同的时候,一定要重写equals方法。

🐳hashcode方法

hashcode方法用来确定对象在内存中存储的位置是否相同

事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。

我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法

1. public class Test {
2. public static void main(String[] args) {
3.         Cat cat1=new Cat("小白",5);
4.         Cat cat2=new Cat("小白",5);
5.         System.out.println(cat1.hashCode());
6.         System.out.println(cat2.hashCode());
7. 
8.     }
9. }
10. 
11. class Cat{
12. private String name;
13. private int age;
14. public Cat(String name,int age){
15. this.name=name;
16. this.age=age;
17.     }
18. 
19. 
20. }

注意事项:两个对象的hash值不一样

像重写equals方法一样,我们也可以重写hashcode()方法。此时我们再来看看。

1. import java.util.Objects;
2. 
3. public class Test {
4. public static void main(String[] args) {
5.         Cat cat1=new Cat("小白",5);
6.         Cat cat2=new Cat("小白",5);
7.         System.out.println(cat1.hashCode());
8.         System.out.println(cat2.hashCode());
9. 
10.     }
11. }
12. 
13. class Cat{
14. private String name;
15. private int age;
16. public Cat(String name,int age){
17. this.name=name;
18. this.age=age;
19.     }
20. @Override
21. public int hashCode() {
22. return Objects.hash(name, age);
23.     }
24. 
25. }

哈希值一样。

相关文章
|
6天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
7天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
21 1
|
12天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
40 4
|
19天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
17天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
17天前
|
Java 测试技术 API
Java零基础-接口详解
【10月更文挑战第19天】Java零基础教学篇,手把手实践教学!
17 1
|
19天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第17天】Java零基础教学篇,手把手实践教学!
16 2
|
21天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第15天】Java零基础教学篇,手把手实践教学!
19 2
|
Java
Java接口和抽象类
Java接口和抽象类
88 0
|
3月前
|
设计模式 Java
【惊天揭秘】Java编程绝技大曝光:接口、抽象类、静态类与非静态类的神秘面纱终被揭开!
【8月更文挑战第22天】Java支持面向对象编程,通过接口、抽象类、静态类(如枚举与工具类)及普通类实现设计原则。接口定义行为规范,允许多重继承;抽象类含未实现的抽象方法,需子类完成;静态类常为工具类,提供静态方法;普通类则实例化对象。恰当运用这些结构能提升程序质量。
39 2