今天碰到这个问题时候,还真不好理解,只知道interface中的变量默认是被public static final 修饰的,接口中的方法是被public和abstrct修饰的。查阅了很多资料,做了些例子,得出以下结论,不足的地方希望大家指出。
/*
* 关于抽象类和接口
*
* 1.定义变量时
* 抽象类定义的变量可以不被赋值。
*
* 接口中定义的变量(确切的说应该是常量)必须被赋值(final)。
*
* 2.定义方法时
*
* 抽象类中定义的方法,可以指定程序体也可以不指定。
* 程序员可以在非抽象方法中指定程序体 ,与其他普通类中的方法类似。
* 但在抽象方法中,必须不指定程序体(写程序体会报出:Abstract methods do not specify a body的错误),与接口中定义方法的形式很类似。
*
* 接口中的方法,所有方法都默认的是抽象的,所以必须不指定程序体。
*
* 3.设计初衷
*
* 抽象类是被java设计用来实现继承的。
* 接口是用来做多重继承的一个特例。
*
* 4.is a 和 like a(还需要再看看)
*/
public abstract class AbstratClassTest {
String name ;
//被final的变量,但不能指定一个有效的set方法(final作用的原因),没有体现封装的闭合原则。
final static int age =1;
// public void setAge(){
// this.age = 2;
// }
public static int getAge() {
return age;
}
public void test(){
}
public abstract void test1();
}
/*
* 为什么接口中的变量都用final修饰(常量)
* 因为接口本身就是用来定义一个标准、规范,是用来设计用户可用的细节(public)且不能随意更改的(final)
* 那么接口中的任何东西都应该被定义成统一,那么定义的数值应该是常量
* 再次思考:假如接口中可以定义非final,而仅仅是public和static修饰的,那么被实现的类可以随便修改(实现类中的static块中),这样会造成标准不统一
* (是不是有点牵强附会?)。
*
* 接口还是不要随意更改,如果可以随意更改会造成很大的麻烦,比如一个接口被很多类实现,那么修改接口后,还必须修改实现类,麻烦程度不言而喻。
*/
public interface InterfaceTest {
String name = "Tom";
public static final int age = 2;
public void test();
public abstract void test1();
}
例证、反证:银行的提款机
银行的提款机中的插卡口可以看做是一个接口,所有的提款机插卡口是被统一的标准(大小尺寸)所约束的,方便每个卡可以插入各个提款机中。假如可以随便修改插卡口接口的数值,某行在当地修改了插卡口的尺寸,当你去提款机取钱,却发现插卡口小了点,那么......
由上例得出,将接口中的数值定义成常量是有意义的。并且证明了此时用接口比用抽象类好些。
结论:因为接口本身就是用来定义一个标准、规范,是用来设计用户可用的细节且不能随意更改的,统一的值,所以用final来修饰是最好不过的。
参考文献:
1.http://forums.sun.com/thread.jspa?threadID=741407&messageID=4251167
2.http://www.7880.com/Info/Article-538dc540.html
分享到:
相关推荐
本文章是关于final部分知识所作的自我总结,内容为final对成员变量和局部变量修饰的简要解答,除了对自我java学习的一个小结,也希望能够帮助到在java路上对该内容疑惑的同行
day11_05_final关键字用于修饰成员变量
在Java编程语言中,`final`关键字有着重要的作用,它能用于修饰类、方法和变量,以限制它们的使用方式。下面将详细解释`final`修饰类、方法和变量的具体含义及其应用场景。 **final 修饰类** `final`修饰类的作用...
因此,当我们将变量 b 声明为 final 时,JVM 会将其复制给局部内部类,以便在方法调用结束后,局部内部类仍然可以访问该变量。这个过程是透明的,对程序员不可见。 在代码中,我们可以看到,当我们尝试访问局部变量...
标题中的“局部变量用final”的讨论主要聚焦于Java编程语言中的一个特性,即使用`final`关键字修饰局部变量。在Java中,`final`关键字有多种用途,包括但不限于定义不可变对象、创建常量以及限制变量的赋值次数。在...
Java 中的 final 变量是指不能被改变的变量,它有三个方面的作用:修饰变量、修饰方法和修饰类。在 Java 中,final 变量是一种常量,它只能被赋值一次,赋值后值不再改变。 final 变量的使用方法有多种,例如在变量...
- `final`类:当一个类被声明为`final`时,它无法被其他类继承。这通常用于防止他人滥用或修改你的类结构,确保类的封装性和完整性。例如,`String`类就是`final`的,以防止对其内部实现的篡改。 - `final`方法:...
1. 当final修饰成员变量(类变量和实例变量)时,这个变量一旦被赋值后,就不能再被修改。对于类变量,final可以在静态初始化块中指定初始值或声明时直接赋值;对于实例变量,可以在非静态初始化块、声明时或构造器...
例如,在设计公共接口时,通常使用 public 访问修饰符,以便让所有类都可以访问。在设计继承关系时,通常使用 protected 访问修饰符,以便保护继承关系中的成员变量和方法。在设计抽象类时,通常使用 abstract 修饰...
在局部变量中,基本类型的变量被 final 修饰后,只能赋值一次,不能再更改。例如,final int a = 10; 后,不能再赋值 a = 20;。对于引用类型的变量,虽然不能更改其地址,但可以修改对象内部的成员变量值。 成员...
final修饰变量时,表示该变量一旦获得了初始值之后就不可被改变,final既可修饰成员变量(包括类变量和实例变量),也可以修饰局部变量,形参。 final修饰成员变量 类变量:当类初始化时,系统会为类变量分配内存,...
`final`变量可以确保在内部类中引用外部类的变量时,该变量的值不会在内部类中被意外修改。 3. **使用方法**: - **修饰变量**:`final`成员变量一旦赋值就不能再次改变,常用于声明常量。静态`final`变量在类加载...
当一个变量被声明为final时,它的值一旦被赋值后就不能再改变。例如: ```java public final static double PI = 3.14; ``` 这样的常量可以提升代码的可读性,减少逻辑错误,并在需要修改其值时提供便利。常量的...
在Java中,某些修饰符可以组合使用,如`public static`、`protected final`等,以达到更精细的控制效果。例如,`public static`方法表示该方法是公共的且与类实例无关,而`protected final`变量则表示受保护的且不可...
synchronized 方法访问修饰符表示多线程的支持,当一个此方法被调用时,没有其它线程能够调用该方法,其它的 synchronized 方法也不能调用该方法,直到该方法返回。 接口访问修饰符 接口访问修饰符可以分为四种:...
当一个类、方法或变量被声明为`final`时,它将具有特定的不可更改性。本文档将详细介绍`final`修饰符的不同应用场景及其带来的影响。 #### 2. final修饰变量 - **定义与作用**:当`final`修饰一个变量时,意味着该...
012-JavaSE进阶-final修饰局部变量
本文总结了 Java 中的继承、接口和访问权限修饰符的概念和使用。继承是 Java 中的一种机制,允许子类继承父类的属性和方法,並且可以对父类的方法进行重写或重载。动态绑定是指在运行时确定方法的调用,而不是在编译...
当`final`修饰一个变量时,它表示该变量一旦被赋值后就不能再次改变。这分为两种情况: - **实例变量**:如果`final`修饰的是实例变量,那么必须在声明时、非静态初始化块或构造器中为其指定初始值。例如: ```...