标题: 接口中定义属性的问题 [打印本页] 作者: 黑马高明辉 时间: 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
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";
}
}
复制代码
我们知道,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修饰的:
接口中的属性使用 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
interface B {
[color=Red]public static final String a="StringB";
//这个不可改变值的静态共享的数据[/color]
[color=Red]public abstract void shwo();
//建议一个把规定的格式加上!这些
//修饰符虽说可写可不写,但最好写上![/color]}
class A implements B{
@Override
public void shwo() {
System.out.println("this is from A.");
[color=Red] a = "sdfsdf";[/color]
楼主相当于这个时候又给a这个字符串对象付了一个值!
}
}
复制代码
作者: 程潇 时间: 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修饰的变量是一个常量,只能赋值一次。由于在接口定义中已经赋值,不能重复赋值,所以这里会报错
}
}