第九天(上) final和static关键字

继承的出现提高了代码的复用性,方便开发,是多态的前提,但随之而来的也有问题,有些累在描述后不想被继承,或者里面的方法功能时固定的,不想让子类重写,可子类继承之后又可以重写该怎么办呢

这个时候就需要一个关键字final  意为 最终的 不可变的

Final是一个比较强的修饰符,可以用来修饰类,类的成员,以及方法

Final修饰类

在类的前面加上final

Final类不可以被继承,但可以继承其他类,是个太监.其成员方法也默认为final的,但成员变量是可以改变的

在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。

Final修饰方法

l 子类可以继承final修饰的方法,但不能重写.

l 父类中没有被final修饰的方法,子类继承后可以用final修饰

l 如果父类中final修饰的方法同时访问控制权限为private,将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。

注:类的private方法会隐式地被指定为final方法。

Final修饰局部变量:

修饰基本数据类型

Final修饰的变量称为常量,只能赋值一次,就不会被改变即使赋的新值与旧值一样也不可以。

修饰引用数据类型

引用数据类型的值是地址值,被final修饰后不可以改变地址值,但地址值所指的内容是可以改变的.

Final修饰成员变量

修饰成员变量时,成员变量需要在创建对象前复制

1直接赋值 通过等号

2构造方法中赋值 没有显式的赋值那么多个构造方法都要为其赋值

Final修饰成员变量时,固定的不是内存中的值,而是手动的赋值(成员变量是有默认值的)

Final修饰方法参数

有点懵比,查了好多没有找到一个令人信服的,说法也不一样

关于final的一些题

public class Test {

public static void main(String[] args)  {

String a = "hello2";

final String b = "hello";

String d = "hello";

String c = b + 2;

String e = d + 2;

System.out.println((a == c));

System.out.println((a == e));

System.out.println(a.equals(e));

}

}

结果true

false

True

为什么呢?

b被声明成了final的了,所以就是常量,常量表达式String c = b + 2;,JVM会优化成String c = "hello" + 2;,这个结果是变成编译期就是已知了,指向常量池中的hello2字符串,也就是a。

public class Test {

public static void main(String[] args)  {

String a = "hello2";

final String b = getHello();

String c = b + 2;

System.out.println((a == c));

}

public static String getHello() {

return "hello";

}

}

结果:
false

这里的b虽然是常量,但是在编译期是不能获得值的,只有在运行的时候才会调用函数,初始化赋值,所以这时的String c = b+2是运行期间计算出来的,而加号连接运算符,内部则是调用的StringBuilder,然后toString,所以c相当于是new出来的String,即c是指向堆内存的地址,c内部的char数组才指向常量池中的字符串,所以明显a != c.

希望看了深入理解jvm虚拟机后可以更好的理解这些问题.

Static

定义类的时候,类中会有相应的方法和属性,而方法和属性都是通过创建本类对象调用的,当调用对象的某个方法时,这个方法又没有访问特定的数据,创建这个对戏那个就有点多余,或者说没有对象都有一模一样的常量,每new一个就出现一次这个常量,又没有办法一劳永逸呢

要解决上面的问题就要用到关键字static.

代表全局,静态的意思,用来修饰成员变量,成员方法,以及代码块.其次还有静态内部类以后有机会了解.

Static的作用: 简单来说就是方便在没有创建对象的情况下来调用方法或者变量.

Java中并不存在全局变量的概念,但我们可以用static来实现一个伪全局变量的概念,

Static修饰变量:被static修饰(只能修饰成员变量)变量称为静态变量,没有使用static修饰的叫实例变量.伴随着类的加载完成初始化.分配一次内存.每一个对象对静态变量的操作都会反应到其他对象上。

什么时候该使用static修饰呢?

当这个成员会被类的所有对象所共享,一般我们把共性的数据定义为静态变量

有什么好处呢

对象之间共享数据,访问方便,节约内存

怎么调用呢

类名.静态成员变量名

对象名.静态成员变量名       ------不建议使用该方式,会出现警告

Static修饰方法:被static修饰的方法称为静态方法.

他在类加载的时候就存在了,它不依赖于任何实例,所以static方法必须实现,也就是说他不能是抽象方法abstract。

什么时候该使用static修饰

成员方法跟着变量走,静态方法只能访问静态变量,如果成员方法中引用了静态的其他成员,那么这个方法就要声明为静态的方法.

怎么调用

类名.静态成员方法名(参数)

对象名.静态成员方法名(参数) ------不建议使用该方式,会出现警告

注意事项:

静态方法不能操作非静态变量,也不能调用非静态方法。(这个可以这样理解:静态方法属于类,直接通过类名就可以调用,而此时可能没有任何实例,更谈不上操作实例变量和调用实例方法了。)

同理,静态也不能使用this和super关键字.

所以main方法中不能直接调用非静态的方法.

为什么mian方法时静态的

为了使在调用mian方法前不创建任何实例对象.

Static静态代码块

被static修饰的代码块,我们称之为静态代码块,静态代码块会随着类的加载一块执行,而且他可以随意放,可以存在于该了的任何地方。

用来初始化静态变量。

在类加载时,在执行main方法之前执行相关操作。

没有main方法的程序可以执行吗?

Jdk1.7之前可以

之后会报错

静态导包

感觉没什么用jdk1.5之后

其目的是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序。

采用static导入包后,在不与当前类的方法名冲突的情况下,无需使用“类名.方法名”的方法去调用类方法了,直接可以采用"方法名"去调用类方法,就好像是该类自己的方法一样使用即可。

建议对于静态导入,一定要遵循两个规则:

1.不要使用*(星号)通配符,除非是导入静态常量(只包含常量的类或接口)。

2. 方法名是具有明确、清晰表象意义的工具类。

静态内部类

内部类了解

原文地址:http://blog.51cto.com/10760006/2157444

时间: 2024-08-29 15:47:04

第九天(上) final和static关键字的相关文章

Java中final和static关键字总结

1.final: final关键字可用于类.方法.变量前. final修饰的类不可被继承,例如java.lang.Math就是一个 final类,不可被继承. final修饰变量,在显示初始化后不可改变变量值,用于常量定义.如果final变量是引用变量,则不可以改变它的引用对象,但可以改变对象的数据(属性). final修饰的方法不可被重写. 错误案例) package com.sp; public final class Fish {        final String name = "鱼

this,final super,static关键字

this关键字 this调用构造方法: 在之前学习方法之间调用时,可以通过方法名进行调用.可是针对构造方法,无法通过构造方法名来相互调用. 构造方法之间的调用,可以通过this关键字来完成. |------构造方法调用格式: this(参数列表); |------构造方法的调用: package com.oracle.demo01; public class student { private String name; private int age; public student(){ //t

Java final、static 关键字

问:谈谈 Java 中 final.finally.finalize 的区别?   答:这道题其实没有任何意义,无非就是考察开发者有没有区分这几个关键字的含义,仅仅关联是因为长得像而已. final 是一个修饰符,如果一个类被声明为 final 则其不能再派生出新的子类,所以一个类不能既被声明为 abstract 又被声明为 final 的:将变量或方法声明为 final 可以保证它们在使用中不被改变(对于对象变量来说其引用不可变,即不能再指向其他的对象,但是对象的值可变),被声明为 final

Java基础之final、static关键字

一.前言 关于这两个关键字,应该是在开发工作中比较常见的,使用频率上来说也比较高.接口中.常量.静态方法等等.但是,使用频繁却不代表一定是能够清晰明白的了解,能说出个子丑演卯来.下面,对这两个关键字的常见用法做点总结记录,方便之后的回顾以及突击知识点. 二.关键字 final final,一如字面意思 “最终的”,大体在 Java 中表示 “不可变的”.可用来修饰类.方法.方法参数以及变量. 1.修饰类 final 在修饰类的时候,代表的是此类不能被继承.也就是说如果一个类确定不会被继承使用,则

final、static关键字

Final 定义  在实际开发中,有些方法不能直接覆盖掉,不想让子类重写父类的方法,那么就引出final关键字(可以修饰类,变量,成员方法). 基本用法 final可以修饰类,但是该类不能被继承,但可以继承其他类. final可以修饰变量(成员变量,局部变量),(两种方法:一直接赋值,二用构造方法)但是该变量此时变成了一个常量. final可以修饰成员方法,但是该方法不能被重写,但可以被继承. final 修饰局部变量时,可以先定义使用时再赋值. final 不能修饰接口.抽象类.抽象方法. f

Java基础之final和static关键字

一.final        根据程序上下文环境,它可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的.        final方法不能被子类的方法覆盖,但可以被继承.        final成员变量表示常量,只能被赋值一次,赋值后值不再改变.        final不能用于修饰构造方法.        注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的. 1.fin

final和static关键字的个人认识

final fianl关键字可以修饰类.方法和变量. a. 修饰类 final修饰的类,该类没有子类,该类不能被继承. b. 修饰方法 final可以修饰方法.final修饰的方法不能被重写. c. 修饰变量 final修饰的变量,是一个常量,且只能被赋值 一次,可以是成员变量和局部变量. static a. static用于修饰成员,可以是成员变量和成员方法. b. 被static修饰后的成员,可以直接被类调用. 类名.静态成员 c. 随着类的加载而加载,随着类的消失而消失.类一加载,就有静态

java 中final和static关键字说明

final fianl关键字可以修饰类.方法和变量. a. 修饰类 final修饰的类,该类没有子类,该类不能被继承. b. 修饰方法 final可以修饰方法.final修饰的方法不能被重写. c. 修饰变量 final修饰的变量,是一个常量,且只能被赋值 一次,可以是成员变量和局部变量. static a. static用于修饰成员,可以是成员变量和成员方法. b. 被static修饰后的成员,可以直接被类调用. 类名.静态成员 c. 随着类的加载而加载,随着类的消失而消失.类一加载,就有静态

final与static关键字的区别?(skycto JEEditor)

都可以修饰类.方法.成员变量. static可以修饰类的代码块,final不可以.static不可以修饰方法内的局部变量,final可以. static修饰表示静态或全局,被修饰的属性和方法属于类,可以用类名.静态属性 / 方法名 访问static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块,只会被执行一次static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,只会被创建一次static修饰的变量可以重新赋值static方法中不能用this和su