您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页关键字

关键字

来源:化拓教育网
三个关键字:static, final, abstract static

有时你希望定义一个类成员,使它的使用完全于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调main()所以它被声明为static。

声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。 static

注意:声明为static的方法有以下几条: 1 它们仅能调用其他的static 方法。 2 它们只能访问static数据。

3 它们不能以任何方式引用this 或super 小结:

1 static可修饰属性,方法,语句块和内部类; 2 它代表类相关;

3 static修饰的所有对象共享在静态池(static池)中。

static属性和方法可以使用 对象.调用,也可用类名. 但最好用类名.调用(不用再创建对象)

在使用类名. 调用时,static 方法不能使用非static 属性,因为内存中可能无对象存在。 4 static方法重写后也必须是static的。

所有static修饰的属性,方法,语句块都在类加载时完成。 static使用示例:

class UseStatic {

static int a = 3; static int b; static void meth(int x) {

System.out.println(\"x = \" + x); System.out.println(\"a = \" + a); System.out.println(\"b = \" + b); } static {

System.out.println(\"Static block initialized.\"); b = a * 4; }

public static void main(String args[]) { meth(42); } } 运行过程:

一旦UseStatic 类被装载,所有的static语句 被运行。首先,a被设置为3,接

着 static 块执行(打印一条消息),最后,b被初始化为a*4 或12。然后调用main(),main() 调用meth() ,把值42传递给x。3个println ( ) 语句引用两个static变 量a和b,以及局部变量x 。

运行结果: Static block initialized. x = 42 a = 3 b = 12

注意:在一个static 方法中引用任何实例变量都是非法的。 final

final方法

之所以要使用final方法,可能是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采取这种做法。 采用final方法的第二个理由是程序执行的效率。将一个方法设成final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。只要编译器发现一个final方法调用,就会(根据它自己的判断)忽略为执行方法调用机制而采取的常规代码插入方法(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理)。 相反,它会用方法主体内实际代码的一个副本来替换方法调用。这样做可避免方法调用时的系统开销。

当然,若方法体积太大,那么程序也会变得雍肿,可能受到到不到嵌入代码所带来的任何性能提升。因为任何提升都被花在方法内部的时间抵消了。

Java编译器能自动侦测这些情况,并颇为“明智”地决定是否嵌入一个final方法。然而,最好还是不要完全相信编译器能正确地作出所有判断。通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为final。

类内所有private方法都自动成为final。由于我们不能访问一个private方法,所以它绝对不会被其他方法覆盖(若强行这样做,编译器会给出错误提示)。可为一个private方法添加final指示符,但却不能为那个方法提供任何额外的含义。 final类

如果说整个类都是final(在它的定义前冠以final关键字),就表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。换言之,出于这样或那样的原因,我们的类肯定不需要进行任何改变;或者出于安全方面的理由,我们不希望进行子类化(子类处理)。

注意数据成员既可以是final,也可以不是,取决于我们具体选择。应用于final的规则同样适用于数据成员,无论类是否被定义成final。将类定义成final后,结果只是禁止进行继承——没有更多的。然而,由于它禁止了继承,所以一个final类中的所有方法都默认为final。因为此时再也无法覆盖它们。所以与我们将一个方法明确声明为final一样,编译器此时有相同的效率选择。 小结:

1 final可修饰类,方法和变量; 2 final类不可被继承;

3 final方法不可以重写,但可以重载;

4 final的变量只能被赋值(只能被初始化),而且必须被初始化;

5 final类的变量赋值可以在方法中,构造中,也可以放在非静态的语句块中;

6 final属性不能与set方法(set方法可多次调用,多次赋值) 7 final属性不是常量,存在堆中;

8 static final属性是常量 abstract

abstract修饰类和成员方法

1:用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能

被实例化。

2:用abstract修饰的方法表示抽象方法,

抽象方法 没有方法体。抽象方法用来描述系 统具有什么功能,但不提供具体的实现。 abstract 规则:

1:抽象类可以没有抽象方法,但是有抽象方法的类必须定义为抽象类,如果一个子类

继承子类也要定义为抽象类,否则的话编译会出错的。

2:抽象类没有构造方法,也没有抽象静态方法。但是可以有非抽象的构造方法

3:抽象类不能被实例化,但是可以创建一个引用变量,类型是一个抽象类,并让它引用非抽象类的子类的一个实例 4:不能用final 修饰符修饰 小结

1 Abstract只能修饰类或方法,代表未实现的方法或不可实现的类(不能创建对象) 2 抽象类的语法格式:

public abstract class 类名 { }

3 抽象方法的语法格式:

public abstract 返回类型 方法名(参数列表)[ 抛出异常 ] ;

4 抽象类:

(1) 抽象类可以声明抽象类型变量,也可以有构造,但不能直接new+构造 (2)抽象类的引用可以指向一个非抽象子类对象 (3)抽象方法的实现是自类重写后的实现

注意:抽象类中不一定有抽象方法,但含有抽象方法的类一定是抽象类

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务