java超基础-接口篇+多态数组(重要)
目录侠在此🐱🚀
文章目录
接口
接口可以理解为一些规范性的操作处理
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来,语法
interface 接口名{
//属性
//方法(1.抽象方法2.默认实现方法(default)3.静态方法)
.jdk8后的接口可以有静态方法,默认方法,也就是说接口可以有方法的具体实现了。
};
package day04;
public class BB extends Template{
public void job(){
long sum=0;
for (int i = 0; i < 100000; i++) {
sum+=i;
}
}
}
interface AsA{
//这里注意一下就是 接口里面的方法都是加了abstract修饰的 我们没有必要去写的
void hi();
default void hello(){
System.out.println("hello");
}
static void bye(){
System.out.println("bye");
}
}
class 类名 implements 接口{
自己的属性;
自己的方法;
必须实现的接口的抽象方法
};
summary
1.在jdk7.0以前,接口所有方法都没有方法体,即都是抽象方法。
2.jdk8后的接口可以有静态方法,默认方法,也就是说接口可以有方法的具体实现了。
接口的应用场景
大家可能知道接口是个什么东西了,但是就是不知道如何在什么场景去使用这个接口,那么下面就带大家来具体看一下,什么时候我们才会使用接口
现在项目经理让两个程序员 分别写一个类,分别是连接MySQL和Oracle的数据库,所以说,然后项目经理应该写一个接口 去规范一下,然后具体由程序员去完成这个工作,去实现这个操作流程
package day04;
public interface InterfaceDB {//项目经理写的
void connect();
void close();
}
接口的实现
package day04;
import javax.jws.soap.SOAPBinding;
public class MysqlDB implements InterfaceDB{
@Override
public void connect() {
System.out.println("进行与MySQL数据库的链接");
}
@Override
public void close() {
System.out.println("进行与MySQL数据库的断开");
}
}
给我的感觉就是接口好似是一种认为 分配给你去做,然后你就去完成这个操作,还没有开发经验,很难去实际的操作这些东西。
接口的使用细节
1.接口不能被实例化(因为本质是抽象的,我们定义接口的目的其实是希望其他的类去实现这个接口)
2.接口中的所有方法都是public的,接口中的抽象方法是可以不用被abstract
我们这样证明了其实是public的
3.一个普通类实现该接口,就必须将该接口的所有方法都去实现才行。不能只写一个 可以输入alt+enter进行补全
4.抽象类去实现接口时,可以不实现接口的抽象方法。
5.一个类可以同时实现多个接口
举例说明
interface A{
}
interface B{
}
class D implements A,B{
}
6.接口中的属性,只能是final的而且只能是被public static final修饰的 下面举例说明
interface B{
int a=10;//实际上是 public static final int a=10; 必须在一开始就赋值才行
}
7…接口中属性的访问形式:接口名.属性名
8.一个接口 不能继承其他的类,但是可以继承多个接口,因为接口和类直接是实现关系,不是继承关系!!!!!
9.接口的修饰符,只能是public 和default ,这一点和类的修饰符是一样的,下面举例说明
interface a{
}
public interface b{
}
接口小练习
看一下下面语句都输出什么
package day04;
public class InterfaceDetails01 {
public static void main(String[] args) {
B b = new B();
System.out.println(B.a);//23
System.out.println(b.a);//23 因为这个b已经实现了这个方法所以说是可以进行访问的 并且我们知道这个接口里面的属性是public static final修饰的所以说是可以通过类名进行访问的
System.out.println(A.a);//23
}
}
interface A{
int a=23;
}
class B implements A{
}
接口VS继承
我们通过抛出一个问题来进行解决处理,首先,引出一个小故事,
有一个小猴子,天生具有爬树的能力,但是有一天,看到鱼儿可以在水中游泳,什么羡慕,希望自己也可以学会,然后又看到鸟儿在控制飞翔,自己也想拥有这种飞翔的能力,所以小猴子问老猴子,自己如何才能学到这些本领,老猴子呵呵一笑,说你把这些接口都实现了,就行啦。
好了 有些扯,现在进入正言,小猴子踏上了学习之路
package day04;
public class ExtendsVSInterface {
public static void main(String[] args) {
littleMonkey littleMonkey = new littleMonkey("悟空");
littleMonkey.fly();
littleMonkey.swim();
littleMonkey.climbing();
}
}
class Monkey{
private String name;
public void climbing(){
System.out.println(name+"天生就会爬树");
}
public Monkey(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class littleMonkey extends Monkey implements Fly,Swim{//这个时候小猴子已经继承了父亲的爬树能力
public littleMonkey(String name) {
super(name);
}
@Override
public void fly() {
System.out.println(getName()+"通过后天的努力正在学习飞翔");
}
@Override
public void swim() {
System.out.println(getName()+"通过后天的努力正在学习水下功夫");
}
}
interface Fly{
void fly();
}
interface Swim{
void swim();
}
总结一下 由于我们java里面不存在多继承,但是存在一种局限就是,子类的所拥有的能力就会显得很少,就像我们今天的例子一样,父亲不会,游泳和飞翔,但是子类需要学习,那么这个时候接口就显得尤为重要了 当然这也是我个人的观点存在在里面,希望大家可以参考一下我的理解。
小结一下
接口更加灵活于继承,继承是满足 is a 比如说 小猫is动物,而接口只需要满足 like a的关系才行
like a的意思是指 小猫可以像 鸟儿一样飞翔 小猫可以像 鱼儿一样游泳。
接口的价值在于可以设计好各种规范然后让其他类去实现这些方法,显得更加灵活。
继承价值在与解决代码的复用性和可维护性
接口多态的特性
接口多态的特性就是说,
接口类型的变量可以指向实现了该接口的对象实例
package day04;
public class InterfacePolyParameter {
public static void main(String[] args) {
IF if1=new Monster();
IF if2=new Car();//是不是看出来了 就是 接口类型的变量可以指向实现了该接口的对象实例
}
}
interface IF{
}
class Monster implements IF{
}
class Car implements IF{
}
继承体现的多态
父类类型的变量 ,可以指向继承了该父类的对象实例
多态数组(接口版本)
这个的意思就是说我刚刚不是说我们的接口类型的变量 可以指向实现这个接口的对象实例 那么我们定义一个接口类型的数组,
把我们这几个实现这个接口的对象放到这个数组里面去,那么我们就可以进行实现操作了。
下面是代码的演示
package day04;
public class InterfacePolyParameter {
public static void main(String[] args) {
//多态数组 因为这个数组里面放了 不同的类 接口类型数组
Usb[] usbs=new Usb[2];
usbs[0]=new Phone();
usbs[1]=new Camera();//既可以放不同类的实例
for (int i=0;i<usbs.length;i++){
usbs[i].work();//动态绑定
//1.我们要进行
if(usbs[i] instanceof Phone){//判断运行类型是什么 是phone我们就调用这个类型
((Phone)usbs[i]).call();
}
}
}
}
interface Usb {
void work();
}
class Phone implements Usb{
public void call(){
System.out.println("手机可以进行通话功能");
}
@Override
public void work() {
System.out.println("手机工作中");
}
}
class Camera implements Usb{
@Override
public void work() {
System.out.println("相机工作中");
}
}
接口的多态传递现象(就是接口直接的继承关系)
那么我们如何操作使这个代码成立那 我们只需要让IG去继承IF就行
接口小练习
要求我们掌握这个 调用属性 会不会调用父类和接口的属性 切记 接口里面的属性默认是Public static final的
多态数组(接口版本)
这个的意思就是说我刚刚不是说我们的接口类型的变量 可以指向实现这个接口的对象实例 那么我们定义一个接口类型的数组,
把我们这几个实现这个接口的对象放到这个数组里面去,那么我们就可以进行实现操作了。
下面是代码的演示
package day04;
public class InterfacePolyParameter {
public static void main(String[] args) {
//多态数组 因为这个数组里面放了 不同的类 接口类型数组
Usb[] usbs=new Usb[2];
usbs[0]=new Phone();
usbs[1]=new Camera();//既可以放不同类的实例
for (int i=0;i<usbs.length;i++){
usbs[i].work();//动态绑定
//1.我们要进行
if(usbs[i] instanceof Phone){//判断运行类型是什么 是phone我们就调用这个类型
((Phone)usbs[i]).call();
}
}
}
}
interface Usb {
void work();
}
class Phone implements Usb{
public void call(){
System.out.println("手机可以进行通话功能");
}
@Override
public void work() {
System.out.println("手机工作中");
}
}
class Camera implements Usb{
@Override
public void work() {
System.out.println("相机工作中");
}
}
接口的多态传递现象(就是接口直接的继承关系)
那么我们如何操作使这个代码成立那 我们只需要让IG去继承IF就行
接口小练习
要求我们掌握这个 调用属性 会不会调用父类和接口的属性 切记 接口里面的属性默认是Public static final的
结语
🆗 本次分享到这里 如果对大家有帮助 希望大家点赞支持 谢谢啦
加油 xdm