A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马高明辉 中级黑马   /  2012-7-20 20:03  /  8744 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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或者是缺省的哦。为什么接口中定义的属性不能在实现类中重新赋值?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

11 个回复

正序浏览
因为我们定义接口的理由是要用其它的类来实现它,所以,如果你不能用“private”或“protected”只能为“public”或者缺省。一楼的同志,他已经说的很明白了,具体观点和他的一样……
回复 使用道具 举报
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修饰的变量是一个常量,只能赋值一次。由于在接口定义中已经赋值,不能重复赋值,所以这里会报错
        }
}

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

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
简单的说,是这样的接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
希望可以帮到你。
回复 使用道具 举报
本帖最后由 焦晨光 于 2012-7-20 20:42 编辑

   ....努力看视频ing...
回复 使用道具 举报
关于接口中定义属性的问题:
1.接口中可以定义属性,但是不能定义private变量
2.接口中定义的属性,必须初始化;
3.接口中所定义的属性都自动强制是常量(public static 的),所以不能修改;
4.接口中的成员都有固定的修饰符:
常量:public static final
方法:public abstract
记住,接口中的成员都是public的;
毕老师的视频里讲的很清楚,楼主可以参考毕老师的视频。
回复 使用道具 举报
接口中所有变量必须是 Public, Final, Abstract 因为你这样定义
interface B {
public  String a="StringB";

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

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

public abstract l void shwo();
}

话句话说接口中只能声明常量,不能声明实例变量。希望可以帮到你。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  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....”,当你在接口中定义属性没有加上前面我所说的格式时,系统会自动给你加上这种格式

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马