从代码分析抽象类和接口

在项目开发中一直在用抽象类和接口,现在就对它们进行一个总结吧!

首先,从以下代码查错中我们分析下涉及的知识点,这样才能便于更深刻理解!

1、

abstract class Name
{
    private String name;
    public abstract boolean isStupidName(String name) {}
}
分析:考察了抽象类的抽象方法结构

答案错。abstractmethod必须以分号结尾,且不带花括号。

2、

abstract class Something
{
    private abstract String doSomething ();
}

分析:考察了抽象类的抽象方法修饰符

答案错。abstractmethods不能以private修饰。abstractmethods就是让子类implement(实现)具体细节的,怎么可以用privateabstractmethod封锁起来呢? (同理,abstract method前不能加final)


3、

interface Playable
{
        void play();
}
interface Bounceable
{
        void play();
}
interface Rollable extends Playable, Bounceable
{
        Ball ball = new Ball("PingPang");
}
class Ball implements Rollable
{
        private String name;
        public String getName()
{
            return name;
        }
        public Ball(String name)
{
            this.name = name;        
        }
       public void play()
{
            ball = new Ball("Football");
            System.out.println(ball.getName());
        }
}

分析:考察了接口的多继承和接口中的成员变量

答案: 错。"interface Rollable extends Playable,Bounceable"没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的"Ball ball = newBall("PingPang");"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说"Ball ball = new Ball("PingPang");"实际上是"public static finalBall ball = new Ball("PingPang");"。在Ball类的Play()方法中,"ball = newBall("Football");"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在"ball = newBall("Football");"这里显示有错。


4、

interface      A
{
       int x = 0;
}
class B
{
       int x =1;
}
class C extends B implements A
{
       public void pX()
{
        System.out.println(x);
     }
       public static void main(String[] args) {
          new C().pX();
       }
}
分析:考察了同时继承和实现时如何调用父类变量

答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确(输出的是1),而接口的属性默认隐含为 publicstatic final.所以可以通过A.x来明确(输出的是0)。


总结:

1.abstract class  Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface

2.abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

3.abstract classinterface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。

4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

7.接口中的方法默认都是 public,abstract 类型的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值