多态 5-7

多态 5-7

1、在接口INet里写了默认方法connection:

//default:默认方法  可以带方法体  jdk1.8后新增

default void connection() {

System.out.println("我是接口中的默认链接");

}

在实现类SmartWatch类里没有重写,

INet net=new SmartWatch();

net.connection();

为什么还能使用net调用到在实现类里没有重写的connection方法?是实现类继承了connection方法,还是调的就是接口里的connection方法?


2、老师,默认方法:

default void connection() {

System.out.println("我是接口中的默认链接");

}

这个默认方法的访问修饰符是public吗?那default算什么?


3、INet.super.***这是一种什么调用方式?能实现什么?


4、INet net=new SmartWatch();

System.out.println(net.TEMP);//接口的引用调用接口里的常量,OK!

但是,为什么同样都是经过static修饰,net.就不能调用接口里的静态方法?

5、接口的static静态方法的作用是什么?感觉没啥用啊

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

        同学你好:1、在接口里有default connection默认方法,在实现类里没有去重写,那么实现类会不会隐藏继承这个default connection默认方法?

         答:在接口定义的方法的访问修饰符前加上关键字default,那么实现类就无需这个方法的重新实现了,可以直接调用了,这就是JDK8中接口增加的新特性,但是注意接口的实现不是继承,所以这里不能说隐藏继承!

        2、老师说default void connection()方法的访问修饰符就是default,但是在实现类去重写connection方法时,为什么一定要是public,而不能是default,要知道重写方法的访问修饰符大于等于原有方法就可以了啊。

        答:在JDK8以前,接口中都是只允许有公开的静态常量和抽象方法,而在JDK8后,在接口中添加了新的特性,那就是加上default表示的默认方法和static表示的静态方法,这里加上这两个关键字表示的是在接口中允许写方法体,这里的default和atatic都是表示特殊方法的关键字,而不是访问修饰符!

        接口中所有成员的属性都为public static final,也就是说接口中声明的变量都是常量,接口中所有方法的访问属性为public,所以实现接口中的方法必须标识为public!

        3、老师对于第三个问题的回答里有问题,你说:这里INet.super.***;中的super可以理解成是指向接口对象的引用。老师啊,接口是没有对象的,接口是不能实例化的,哪里来的指向接口对象的引用?

          答: 是这样的,INet.super.*可以调用接口默认方法,INet.super看成一个整体去记就行,不用拆开了分别理解,这其实就是在实现类中调用接口默认方法的一个语法规则!

        4、接口里的常量,被实现类所继承了吗?

        答:实现类实现接口,需要实现接口中的普通方法,默认获得接口中的常量和默认方法等内容,例如:

http://img1.sycdn.imooc.com//climg/5d54d4980001987703360121.jpg

http://img1.sycdn.imooc.com//climg/5d54d4a900014f2c04910264.jpg

        如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 鱼儿0001 提问者 #1
    好的,谢谢老师!老师,你再看看下面这位慕酷酷老师的回复,我问的几个问题,他有的都回答错误,我服了!- -!这样不行啊,会扰乱我对概念的理解啊!
    2019-08-24 15:34:44
  • 好帮手慕酷酷 回复 提问者 鱼儿0001 #2
    同学你好,很抱歉给同学带来了不好的体验,深表歉意。祝学习愉快!
    2019-08-24 15:51:49
  • 鱼儿0001 提问者 回复 好帮手慕酷酷 #3
    没事。谢谢老师!
    2019-08-25 14:54:58
好帮手慕酷酷 2019-08-14 17:53:42

同学你好,

1、net.connection();这里调用就是接口里的connection();方法!这里使用到的是JDK1.8的一个新特性,接口中使用default的方法可以将方法进行具体实现了,不需要一定使用实现类实现!

2、

default void connection() {

System.out.println("我是接口中的默认链接");

}

这个默认方法的访问修饰符是default,并不是public了!

Java中访问修饰符分为public、default、protect、public,这个方法的修饰符为default不是public,访问修饰符只能存在一个。

3、这里INet.super.***;中的super可以理解成是指向接口对象的引用,也就是INet接口的引用,然后通过“.***”进行调用其他方法。

主要是为了调用接口类的方法。

4、静态接口方法不被实现类或接口继承,静态方法的调用只能通过接口名来调用!这是java所规定的,同学记住即可,不用过多纠结~

5、接口中的静态方法和普通类中的静态方法作用一样,都可以通过类名调用。以前接口是没有静态和默认方法的,JDK8以后的版本中开始引入。具体是否需要接口静态方法,还是要看具体需求,不是必须的。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 鱼儿0001 #1
    谢谢老师。1、在接口里有default connection默认方法,在实现类里没有去重写,那么实现类会不会隐藏继承这个default connection默认方法?2、老师说default void connection()方法的访问修饰符就是default,但是在实现类去重写connection方法时,为什么一定要是public,而不能是default,要知道重写方法的访问修饰符大于等于原有方法就可以了啊。3、老师对于第三个问题的回答里有问题,你说:这里INet.super.***;中的super可以理解成是指向接口对象的引用。老师啊,接口是没有对象的,接口是不能实例化的,哪里来的指向接口对象的引用?4、接口里的常量,被实现类所继承了吗?
    2019-08-14 20:50:28
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师