各位看官早安午安晚安呀
如果您觉得这篇文章对您有帮助的话
欢迎您一键三连,小编尽全力做到更好
欢迎您分享给更多人哦大家好我们今天来学习Java面向对象的的抽象类和接口,我们大家庭已经来啦~
// 抽象类:被 abstract修饰的类, 抽象类也是类,也可以增加普通方法和属性public abstract class Shape {public int a;// 抽象方法:被abstract修饰的方法,没有方法体abstract public void draw ();}

1. 抽象类不能直接实例化对象
2. 抽象方法不能被 private,final,static修饰,因为抽象方法要被子类重写;private(只能在自己的类里面使用,密封方法) ,final(不能被继承)和static(静态方法,不依赖对象)
3:抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰(子类的子类要重写你俩的抽象方法(出来混,迟早都要还的))
4:被重写的方法不能比父类的访问权限更低(这是重写的要求)
只单独一个抽象方法也可以:(不过这继承毫无意义呀)
(抽象类就是为了被继承,多了一层校验)
抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法.
有些同学可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?确实如此. 但是使用抽象类相当于多了一重编译器的校验
使用抽象类的场景就如上面的代码 , 实际工作不应该由父类完成 , 而应由子类完成 . 那么此时如果不小心误用成父类 了, 使用普通类编译器是不会报错的 . 但是父类是抽象类就会在实例化的时候提示错误 , 让我们尽早发现问题 .很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似 . 创建的变量用户不去修改 , 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候 , 让编译器及时提醒我们 .充分利用编译器的校验, 在实际开发中是非常有意义的.
(抽象类是特别类,接口是特殊的抽象类(限制更多)(就是利用向上转型,向下转型,动态绑定))
public interface 接口名称 {// 抽象方法public abstract void method1 (); // public abstract 是固定搭配,可以不写(一般都不写,但是默认有)成员变量默认被public static final 修饰public void method2 ();abstract void method3 ();这两种真不好void method4 ();// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁}
我们一般说实现接口,继承父类
public class 类名称 implements 接口名称 {// ...}
请实现笔记本电脑使用 USB 鼠标、 USB 键盘的例子1. USB 接口:包含打开设备、关闭设备功能2. 笔记本类:包含开机功能、关机功能、使用 USB 设备功能3. 鼠标类:实现 USB 接口,并具备点击功能4. 键盘类:实现 USB 接口,并具备输入功能
抽象类前4条她都有(但是接口有更多的特点,不然怎么是特殊的抽象类呢(小编自己说的))
1. 接口类型是一种引用类型,但是不能直接 new 接口的对象(不能实例化对象)2. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类(和抽象类差不多)3: 抽象方法不能被 private,final,static修饰4:. 重写接口中方法时,不能使用默认的访问权限(不能比接口里面的方法的访问权限更低)
5:接口中的方法默认被public abstract 修饰,成员变量默认被 public static final 修饰(不加也默认),其他修饰符会报错6. 接口中不能有静态代码块和构造方法(这一点抽象类可以有这些)7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是 .classUSB接口
8. jdk8中:接口中还可以包含 default 方法。
首先我定义一个动物类(就只定义变量(大家公用嘛),活动让子类通过实现接口来重写)
然后我定义游泳,跑步,飞的接口(方法我没有方法体,让动物们来实现)
青蛙还是两栖的呢:既会跑又会游泳(那就实现两个接口)
鸭子:会跑,会游泳,会飞(实现三个接口)
接下来就是向上转型 (只要是你实现了这个IRunning接口,就可以被IRunning引用你的对象,你只需要把你的引用传过来,就发生了向上转型)

甚至机器人只要实现了这个接口,他也可以通过这个引用实现这个动作(只要实现了这个接口和是不是动物没关系)

类与类之间的继承只能单继承,但是接口之间的继承可以多继承(相当于把多个接口合并在了一起)(一个类也能继承多个接口)
说到合并(静态代码块也是合并)
接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字
抽象类中可以包含普通方法和普通字段,这样的普通方法和字段可以被子类直接使用 ( 不必重写 )而且抽象类里面有构造方法而接口中不能包含普通方法, 子类必须重写所有的抽象方法,(而且成员变量都是全局常量)接口里面没有构造方法
例如:
我们先了解这几种方法
首先我们看一下object类里面实现的equals方法(很显然就是两个引用在比较,就是比较两个地址是否一样)

既然是这样那么这个equals方法就和普通的比较没什么区别了(所以只要我们要用的话就只能重写这个方法(除非你就想这么用))

那么我们就重新写一下这个方法:
接下来再运行一下:

public String toString () {return getClass (). getName () + "@" + Integer . toHexString ( hashCode ());(进化过处理的地址)}
示例:
但是我们想要把两个名字相同,年龄相同的对象,存储在同一个位置,这个时候我们就要重写hashcode()方法了
结果:![]()
hashcode方法用来确定对象在内存中存储的位置是否相同,equals方法用来确定该对象的内容是否一样(我们重写的)
引用类型不能直接这么比较
如果要比较的话:要实现一个接口(并且重写它的比较方法)

比较名字大小的时候我们直接可以用String类的CompareTo进行比较(String类已经对它进行重写了(后面在认识String类的时候我会讲到))
我们就用数组排序的方法Arrays.sort排序
但是编译器报错了,你要排序但是你要按照什么排序呢?年龄?还是名字?

这里我们可以看到他要把数组里边的元素类型强转为Comparable类型(所以我们就要去建立这个联系,实现这个接口)
在 sort 方法中会自动调用 compareTo 方法. compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象.
结果:
在 sort 方法中会自动调用 compareTo 方法. compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象.

注意,单独比较年龄或者姓名之后,这个类整体会被交换(而不是单独交换年龄或者姓名)(你们一起被交换)

Comparable接口的耦合性是比较强的
当一个类实现了 Comparable 接口,它的比较逻辑就被硬编码在了类的定义中。这意味着如果需要改变比较逻辑,你必须修改这个类的源代码。这种实现方式的耦合性较强
目前我理解的是因为:Comparable的里的方法是compareTo,但是要比较名字的时候,Student实现Comparable接口,重写compareTo方法,你怎么在这个方法里面去比较字符串大小?(字符串大小比较需要String类重写的 compareTo方法去比较)
总不能compareTo里面嵌套compareTo吧?

冒泡呢?(就改了比较大小的呗,交换的步骤都不变)
浅拷贝:
深拷贝:
深拷贝这里就是全部都进行了拷贝,包括我们自定义的类型的值,由于异常我们现在还没有学习,具体的克隆我们放在异常的那一节进行讲解~~~
上述就是 Java面向对象之多态的全部内容了,能看到这里相信您一定对小编的文章有了一定的认可,接口的出现,其实也是一个老大带几个小弟的过程,我们的大家庭就这么水灵灵的又增加啦~
有什么问题欢迎各位大佬指出
欢迎各位大佬评论区留言修正
您的支持就是我最大的动力!!!!
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/4663.html



