【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. }

哈希值一样。

目录
打赏
0
0
0
0
2
分享
相关文章
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
294 3
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
95 5
|
4月前
|
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
265 64
|
4月前
|
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
346 60
|
4月前
|
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
221 58
|
4月前
|
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
130 38
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
3月前
|
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
66 6
|
4月前
|
Java中内置的函数式接口
Java中内置的函数式接口
56 2
|
4月前
|
Eclipse 创建 Java 接口
Eclipse 创建 Java 接口
55 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等