final定义的变量可以看做一个常量,不能被改变;
final定义的方法不能被覆盖;
final定义的类不能被继承。
final static 就是再加上static的特性就可以了
static 和final是没有直接关系的
static 是在内存中分配一块区域,供整个类通用,所有的类的对象都享有它的共同的值
static 和final的区别
一、static :
什么情况下我们要使用static呢?
1、只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创 建对象。
2、我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。
为满足这两方面的要求,可使用static(静态)关键字。
下面我先举个例子:
一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个static方法,或访问一些static数据。
为了将数据成员或方法设为static,只需在定义前置和这个关键字即可。
例如,下述代码能生成一个static数据成员,并对其初始化:
class StaticTest {
static int i = 47;
}
现在,尽管我们制作了两个StaticTest对象,但它们仍然只占据StaticTest.i的一个存储空间。这两个对象都共享同样的i。
请考察下述代码:
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
此时,无论st1.i还是st2.i都有同样的值47,因为它们引用的是同样的内存区域。
有两个办法可引用一个static变量。正如上面展示的那样,可通过一个对象命名它,如st2.i。亦可直接用它的类名引用,而这在非静态成员里是行不通的(最好用这个办法引用static变量,因为它强调了那个变量的“静态”本质)。
StaticTest.i++;
其中,++运算符会使变量增值。此时,无论st1.i还是st2.i的值都是48。
类似的逻辑也适用于静态方法。既可象对其他任何方法那样通过一个对象引用静态方法,亦可用特殊的语法格式“类名.方法()”加以引用。静态方法的定义是类似的:
class StaticFun {
static void incr() { StaticTest.i++; }
}
从中可看出,StaticFun的方法incr()使静态数据i增值。可用典型的方法调用incr():
StaticFun sf = new StaticFun();
sf.incr();
或者,由于incr()是一种静态方法,所以可通过它的类直接调用:
StaticFun.incr();
对方法来说,static一项重要的用途就是帮助我们在不必创建对象的前提下调用那个方法。
举简单一例如下:
public class TestStatic {
public static void main(String args[]){
PhoneCard mycard_1 = new PhoneCard();//创建第一张卡对象
PhoneCard mycard_2 = new PhoneCard();//创建第二张卡对象
mycard_1.addFee = 0.8;//给第一张卡的附加费addFee赋值为0.8
//注意到我们没有给第二张卡赋值
System.out.println("第一张卡的附加费:" + mycard_1.addFee);
System.out.println("第二张卡的附加费:" + mycard_2.addFee);
//发现没有?输出结果中第二张卡的附加费也是0.8 了。
System.out.println("卡的附加费:" + PhoneCard.addFee);
//该句的打印输出表明卡类的附加费都是0.8
}
}
class PhoneCard{
static double addFee;//静态域addFee
}
该例创建了两个类,PhoneCard类只定义了一个变量,TestStatic类里创建了两个PhoneCard类对象,并给其中的一个对象的附加费addFee赋值,而另一个对象没赋值。
由上例可以看出,静态域保存在类的公共存储单元,而不是保存在对象的存储单元内。
static 修饰方法时是同理。
二、final:
final可修饰类、域(变量和常量)、方法 (而static不修饰类)
1、final修饰类,表示该类不可被继承。
如定义了一个final类:
final class SnowBird{
int i;
String s;
static void fly(){
System.out.println("snowbird is flying");
}
}
//现在定义一个类,试图继承SnowBird类:
public class Bird extends SnowBird{
public static void main(String[] args){
SnowBird.fly();
}
}
把上面的两个类拷贝到文件中,文件名保存为Bird.java ,现在编译看看会出现什么问题?
出错信息是:cannot inherit from final SnowBird
表明final 类不可被继承。
那么,final修饰变量是怎么样呢?
2、final修饰变量
程序中经常需要定义各种类型的常量,如:3.24268,"201"等等。这时候我们就用final来修饰一个类似于标志符名字。如:
final String connectNumber = "201";
final表明 connectNumber是一个常量,它的取值在整个过程都不会改变。
如果把final 去掉则connectNumber就成为变量了。
有时我们为了节省空间,常量通常声明为 static .因为如上所说的 static 用的是类的内存空间。
3、修饰方法:
final修饰的方法,称为最终方法。最终方法不可被子类重新定义,即不可被覆盖。
如父类定义了public void fly(){ ....}
则子类就不能定义
public void fly(){。。。。。。}
但注意覆盖与重载的区别。不能被覆盖并不是不能被重载,如你还可以定义
public void fly(int i){.....},
举个例子如下:
class FinalValue {
static final int i = 1;
final void fly(){
System.out.println("SnowBird is flying over FinalValue ");
}
}
class TestFinal extends FinalValue {
int i = 2;
void fly(){
System.out.println("SnowBird is flying over TestFinal");
System.out.println("In class FinalValue static Final i = "+ FinalValue.i);
System.out.println("In class TestFinal i = "+ i);
}
void fly(String s){
System.out.println("fly("+ s + ")");
}
}
public class Test {
public static void main(String args[]){
TestFinal tf = new TestFinal();
tf.fly();
tf.fly("ok");
System.out.println(tf.i);
}
}
把上面的程序保存为Test.java编译看看,出现什么错误?
然后,把TestFinal类中的 void fly(){ ... } 注解掉
即 如下
/* void fly(){
System.out.println("SnowBird is flying over TestFinal");
System.out.println("In class FinalValue static Final i = "+ FinalValue.i);
System.out.println("In class TestFinal i = "+ i);
}*/
现在再编译看看通过了吗? 可见重载与覆盖的区别了吧。 还发现 FinalValue中的 i 与 TestFinal中的 i 没关系 。因为对于变量而言,重定义只是父类的同名域被隐藏了而已。
分享到:
相关推荐
Java中的`final`和`static`关键字是编程中非常重要的两个修饰符,它们分别用于不同的场景,以确保代码的稳定性和高效性。 首先,`final`关键字主要用于表示不可变性。它可以用来修饰类、方法和变量。对于类,如果一...
### Java中的final关键字详解 #### 一、final的概述与用途 `final`关键字在Java中扮演着重要的角色,它通常被用来表示“不可变”的特性。`final`可以用来修饰类、方法以及变量,其核心目的是为了保护数据的安全性...
### Java关键字总结 Java是一种广泛使用的面向对象编程语言,它具备简单性、可移植性、高性能等特点。在Java中,关键字具有特殊的语法含义,不能用作标识符(例如变量名或方法名)。以下是对给定文件中提到的Java...
总之,`final`和`static`是Java中不可或缺的关键字,它们各自有其特定的使用场景。理解并正确使用它们可以提高代码的可读性、安全性和效率。在设计类和接口时,明智地使用`final`和`static`可以帮助实现更好的设计...
abstract关键字不能应用于static、private或final方法,因为这些方法不能被重写。 示例: public abstract class MyClass{} public abstract String myMethod(); 2. boolean boolean关键字用于定义布尔类型变量...
Java 中的 static 关键字 Java 中的 static 关键字是用于声明类的成员变量和成员方法的,它可以使得变量和方法属于类本身,而不属于某个对象。静态变量也称为类变量,静态方法也称为类方法。静态变量和静态方法可以...
通过这份总结,我们可以看到Java关键字在定义行为和数据时起到的作用。理解这些关键字的含义和使用方式是掌握Java语言基础的关键。这些概念包括区分对象内部变量和方法、处理继承关系中的方法覆盖、定义类级别的属性...
Java 中的 final 和 static 关键字详解 Java 中的 final 和 static 关键字是两个重要的关键字,它们在 Java 编程...final 和 static 关键字在 Java 编程中扮演着重要的角色,正确使用它们可以提高代码的效率和可读性。
黑色为保留字(现阶段没有在 Java 程序当中使用,但是先预约保留下来,以备日后使用),保留字跟关键字具有同样的等级,不可被用来作为标识符。 常用的 Java 关键字包括: * 访问修饰符:public、private、...
面向对象部分让人搞晕的几个关键字,我这里专门针对这几个关键字进行了整理相关的面试题,只要你能做对80%,就证明你面向对象基本学懂了
### Java关键字分类解释 #### 一、类与接口定义关键字 - **class**: 在Java中,`class`关键字用于声明一个类。类是面向对象编程的基本单元,它定义了一组属性(成员变量)和方法(成员函数),这些共同构成了一个...
Java关键字大全 Java语言中有多种关键字,每个关键字都有其特定的用途和作用。下面是Java关键字大全的详细解释: 1. abstract关键字 abstract关键字可以修改类或方法。abstract类可以扩展(增加子类),但不能...
了解并熟练使用变量是编写Java程序的基础,而关键字则是Java语法的精髓,如public、private、static、final等,它们各有特定含义,用于控制代码的行为和访问权限。 接着,我们关注“MyEclipse快捷键大全”。...
在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被用来声明一个变量、方法或类为不可变的。在这个学习demo中,我们将深入理解`final`关键字的各种用法及其背后的原理。 首先,`final`关键字用于变量...
Java 中 final 和 static ...通过上面的解释,我们可以看到 final 和 static 关键字在 Java 中的不同用法。final 关键字用于表示不可变的变量、方法、类等,而 static 关键字用于表示静态的成员变量、方法、代码块等。
总结来说,`final`和`static`关键字在Java中扮演着关键角色,`final`用于保证不变性和防止覆盖,而`static`用于定义类级别的成员,简化访问和管理。理解并正确使用这两个关键字对于编写高效、可维护的Java代码至关...