黑马程序员技术交流社区

标题: 是否要去掉abstract?求解大虾们 [打印本页]

作者: 于清云    时间: 2012-4-22 18:58
标题: 是否要去掉abstract?求解大虾们
计算机实现了 USB 接口,则示例代码如下:
                    public class Computer implements USB{
                                /**内存容量*/
                                int memorySize;
                                public abstract byte[] readData(){
                                           //读数据的逻辑
                                }
                                public abstract void writeData(byte[] data){
                                           //写数据的逻辑
                                }
                    }
我的疑问:这段代码中,是不是错了?是不是需要将readData和writeData两个方法前面的那个abstract修饰符去掉?
作者: 武庆东    时间: 2012-4-22 19:17
抽象类和抽象方法中的abstract是不可以省略的! 默认类和方法都是非抽象的!
作者: 蒋亮    时间: 2012-4-22 19:26
既然你把类定义为了非abstract类,那类中就不应该存在abstract方法,所以你要么去掉方法前的abstract修饰符,要么将类定义为abstract类,还有你的方法名前有abstract修饰符,就应该以分号结尾,你加了大括号,这里错了。。。
作者: 真真姐    时间: 2012-4-22 19:28
本帖最后由 杨国祯 于 2012-4-26 22:47 编辑

纠正个概念
静态类都是应用程序启动就自动加载到内存的,
而非静态只有使用的时候才加载,你不可能进入到非静态的内部去加载静态方法吧

这样写就不会错误了,

public class Computer implements USB
    {
       int memorySize;
       public static void main(String[] args)
           {
              /** 内存容量 */
           }
       public byte[] readData()
           {
              // 读数据的逻辑
              return null;
           }
       public void writeData(byte[] data)
           {
              // 写数据的逻辑
           }
   }

或这样  当前类为静态,然后静态方法去掉方法体;这样也是符合语法的
public abstract class Computer implements USB      
    {
       int memorySize;
       public static void main(String[] args)
           {
              /** 内存容量 */
           }
       public abstract byte[] readData();
           
       public void writeData(byte[] data)
           {
              // 写数据的逻辑
           }
为什么明白了吧,很直观吧,管理员看到了给分了啊!



作者: 于清云    时间: 2012-4-22 20:00
谢谢各位大虾啊 我这问的问题 我再具体说下啊 我上面的这段代码 之前已经声明了一个USB接口了:
  public interface USB{
                                /**电压*/
                                public static final int V = 5;
                                /**读取数据*/
                                public abstract byte[] readData();
                                /**写入数据*/
                                public abstract void writeData(byte[] data);
                    }
这里USB接口内使用abstract 来修饰方法时,不能用方法体,而用分号。我的问题是:computer子类实现USB接口时,重写USB内的方法时候,是不是需要把原先USB接口内部的abstract去掉?
作者: 韩新凯    时间: 2012-4-22 22:22
抽象方法只能定义在抽象类中。
子类要实现父类的抽象方法除非子类也是抽象类。
作者: 魏征    时间: 2012-4-23 01:27
类中有抽象方法那么这个类也要修饰为抽象的类:abstract class   或者可以设置为接口 interface 如果要调用该类中的方法则要复写所实现接口或继承父类的抽象方法,该方法不可以为抽象。一个类实现了抽象接口必须复写全部抽象方法 否则该类还是抽象类。
在computer复写usb的方法时,把usb中的抽象方法全部复写,便可调用computer中复写usb中的这些方法。不能把接口usb中方法的abstract去掉,方法中没有定义内容,没有{},去掉abstract编译是失败的。
作者: 于清云    时间: 2012-4-23 08:00
魏征 发表于 2012-4-23 01:27
类中有抽象方法那么这个类也要修饰为抽象的类:abstract class   或者可以设置为接口 interface 如果要调用 ...

接口USB中方法的abstract不能去掉,这个我还是懂的,我真的想问的是computer实现USB接口时,在computer内部覆盖USB中方法时,要不要去掉abstract?
作者: 毕博    时间: 2012-4-23 10:17
于清云 发表于 2012-4-22 20:00
谢谢各位大虾啊 我这问的问题 我再具体说下啊 我上面的这段代码 之前已经声明了一个USB接口了:
  public i ...

子类里的方法必须去掉,否则还是抽象的。
作者: 于清云    时间: 2012-4-23 10:21
毕博 发表于 2012-4-23 10:17
子类里的方法必须去掉,否则还是抽象的。

我也这么觉得 没有疑惑了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2