黑马程序员技术交流社区

标题: 接口中定义属性的问题 [打印本页]

作者: 黑马高明辉    时间: 2012-7-20 20:03
标题: 接口中定义属性的问题
interface B {
public  String a="StringB";

void shwo();
}

class A implements B{

@Override
public void shwo() {
  System.out.println("this is from A.");
  a = "sdfsdf";
}
}
这段程序会报错,据说是接口中定义属性的问题,定义的属性都可以是哪几种类型的?我试过了不能是private的,只能是public或者是缺省的哦。为什么接口中定义的属性不能在实现类中重新赋值?
作者: 全海波    时间: 2012-7-20 20:24
  1. interface B {
  2. public  String a="StringB";

  3. void shwo();
  4. }

  5. class A implements B{

  6. @Override
  7. public void shwo() {
  8.   System.out.println("this is from A.");
  9.   a = "sdfsdf";
  10. }
  11. }
复制代码
我们知道,interface中的内容都必须是最大权限的,也就是说,必须用public修饰符修饰,而至于为什么?不能进行第二次赋值,你首先应该想到的是final关键字的作用,被fianl关键字修饰的属性,方法,是不能进行第二次赋值的(属性),而方法则不能覆盖
在这里final就派上了用场,在interface类中,属性的声明格式为:“public static final....”,当你在接口中定义属性没有加上前面我所说的格式时,系统会自动给你加上这种格式

作者: 王贵朝    时间: 2012-7-20 20:34
接口中所有变量必须是 Public, Final, Abstract 因为你这样定义
interface B {
public  String a="StringB";

void shwo();
}
在编译器中会默认替换为

interface B {
public abstract final String a="StringB";

public abstract l void shwo();
}

话句话说接口中只能声明常量,不能声明实例变量。希望可以帮到你。
作者: 焦晨光    时间: 2012-7-20 20:40
关于接口中定义属性的问题:
1.接口中可以定义属性,但是不能定义private变量
2.接口中定义的属性,必须初始化;
3.接口中所定义的属性都自动强制是常量(public static 的),所以不能修改;
4.接口中的成员都有固定的修饰符:
常量:public static final
方法:public abstract
记住,接口中的成员都是public的;
毕老师的视频里讲的很清楚,楼主可以参考毕老师的视频。
作者: 焦晨光    时间: 2012-7-20 20:40
本帖最后由 焦晨光 于 2012-7-20 20:42 编辑

   ....努力看视频ing...

作者: 张凯    时间: 2012-7-20 21:01
简单的说,是这样的接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
希望可以帮到你。
作者: 陈冲    时间: 2012-7-20 22:21
首先要知道接口的定义格式:
  1. interface 接口名称
  2. {
  3.         final 数据类型 成员名称 常量 ;//数据成员必须赋初值
  4.         abstract 返回值的数据类型 方法名称 (参数...);//抽象方法,不定义方法的主体
  5. }
复制代码
接口中的成员都是用public修饰的:
接口中的属性使用 public static final 定义,而且数据成员一定要赋初值,我们知道使用final修饰的变量相当于常量,所以接口中的属性不能再类中重新赋值;
而接口中的抽象方法则用 public static 修饰;
而在我们不手动指定修饰符的时候,Java会为我们自动添加,但是这会降低程序的可读性,因此不推荐省略修饰符。
作者: 陈欢    时间: 2012-7-20 22:42
在interface里面的变量默认都是public static final 的。所以可以直接省略修饰符: String param="ssm";//变量需要初始化 为什么接口要规定成员变量必须是public static final的呢? 答: 首先接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public 的 ,是所有实现类共有的 .否则具体实现类不能使用该变量,则就没有了定义的意义。 至于不能赋值是final关键字的问题,public static final 中有final关键字修饰 不能重新赋值的,其实这是个小问题  或者你编译时候着急一下没想起来  希望可以帮你解决这个问题
作者: 陈欢    时间: 2012-7-20 22:42
在interface里面的变量默认都是public static final 的。所以可以直接省略修饰符: String param="ssm";//变量需要初始化 为什么接口要规定成员变量必须是public static final的呢? 答: 首先接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public 的 ,是所有实现类共有的 .否则具体实现类不能使用该变量,则就没有了定义的意义。 至于不能赋值是final关键字的问题,public static final 中有final关键字修饰 不能重新赋值的,其实这是个小问题  或者你编译时候着急一下没想起来  希望可以帮你解决这个问题
作者: 吴立杰    时间: 2012-7-20 23:30
  1. interface B {
  2. [color=Red]public static final  String a="StringB";
  3. //这个不可改变值的静态共享的数据[/color]

  4. [color=Red]public abstract void shwo();
  5. //建议一个把规定的格式加上!这些
  6. //修饰符虽说可写可不写,但最好写上![/color]}

  7. class A implements B{

  8. @Override
  9. public void shwo() {
  10.   System.out.println("this is from A.");
  11. [color=Red]  a = "sdfsdf";[/color]
  12. 楼主相当于这个时候又给a这个字符串对象付了一个值!
  13. }
  14. }
复制代码

作者: 程潇    时间: 2012-7-21 07:52
interface B {
        public String a = "StringB"; // interface中的成员都是常量,有固定修饰符public static final, 若定义时没有写全,JVM会自动补全。所以这里的a就是一个final的变量

        void shwo();
}

public class A implements B {

        @Override
        public void shwo() {
                System.out.println("this is from A.");
                a = "sdfsdf"; // 由于a是接口B的成员被final修饰,而被final修饰的变量是一个常量,只能赋值一次。由于在接口定义中已经赋值,不能重复赋值,所以这里会报错
        }
}


作者: themoon    时间: 2012-7-21 08:37
因为我们定义接口的理由是要用其它的类来实现它,所以,如果你不能用“private”或“protected”只能为“public”或者缺省。一楼的同志,他已经说的很明白了,具体观点和他的一样……




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