JAVA基础3——常见关键字解读(1)

常见的JAVA中的关键字

static

static静态变量

静态变量:使用static关键字定义的变量。static可以修饰变量和方法,也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。

static修饰的field字段,不管类初始化多少遍,此field对象只会初始化一次,且所有new出来的类对象中,对此static修饰的field字段进行操作,其余所有的类对象中的此field值都会被改变。

静态变量的优势:
A,静态对象的数据在全局是唯一的,一改都改。如果你想要处理的东西是整个程序中唯一的,弄成静态是个好方法。 非静态的东西你修改以后只是修改了他自己的数据,但是不会影响其他同类对象的数据。
B,引用方便。直接用 类名.静态方法名 或者 类名.静态变量名就可引用并且直接可以修改其属性值,不用get和set方法。
C,保持数据的唯一性。此数据全局都是唯一的,修改他的任何一处地方,在程序所有使用到的地方都将会体现到这些数据的修改。有效减少多余的浪费。

注意:static静态变量是线程非安全的,静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。

static静态方法

使用约束点:

  1. static方法中无法访问非static全局变量;
  2. static方法中无法访问非static方法;
  3. static方法中无法使用this和super关键字(因为this关键字指向该方法所属的对象,而静态方法是属于类级的,不存在对象一说;至于super关键字,只要不是用在构造方法里,那么它就是指向父类对象的,而静态方法是不能引用实例对象的,因此也不能使用super关键字)。

静态方法的多线程问题分析:

  1. 如果静态方法中没有使用全局变量,则肯定是线程安全的;
  2. 如果访问且修改了全局静态变量,可能会出现数据不一致问题,线程非安全。
  3. 是否会出现线程等待卡死?(待确认)

final

一言概之,final即为“最终的、最后的”的意思,使用final类似于一种显式的声明,强调这个final所修饰的内容是不可变更的。

  1. final修饰的变量:此变量的值不能被修改、不能被重复赋值(声明的时候、代码块、构造函数三者任选一个地方初始化,有且只能有一个地方初始化值,其余地方不能修改其值);
  2. final修饰的类:此类不能被继承;
  3. final修饰的方法:此方法不可被子类重写,用于父类中为了防止子类覆写某些特殊的方法(在早期的JAVA版本中,对于final方法,编译的时候会转换位内嵌调用提升性能,但是近期的JAVA版本中已经不再需要final进行方法优化了,所以不再考虑此情况了)。

对final修饰变量的情况具体说明如下:

final修饰变量为基本类型时

final修饰基本类型的变量的时候,此变量值不可变更,不可修改,不可重新赋值。

final修饰变量为基本类型时

final修饰引用类型的变量的时候,此变量不可被重新赋值,但是此变量的对象内容可以被修改。可以理解为final固定了此变量指向的对象地址,但是对于此对象中的内容属性,是可以修改的。

final的其它冷知识

  1. 类的private方法,会被隐式的指定为final类型的。
  2. 当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该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));}
}输出:
true
false
因为b已经声明为final且值固定,编译期的时候就已经将c编译为hello2,与a相同,所以第一个是true。

更详细的解释,可以参考下http://www.cnblogs.com/dolphin0520/p/3736238.html,解释的很到位,举的例子也很好。

final 与 finalize() 区别

final关键字是用于标示不可修改、不可变更相关的含义,具体上面已经说明了。

finalize()是个方法名,Object对象默认提供一个protected类型的此方法。此方法尽量不要在代码中主动去调用。

finalize()的功能 : 一旦垃圾回收器准备释放对象所占的内存空间, 如果对象覆盖了finalize()并且函数体内不能是空的, 就会首先调用对象的finalize(), 然后在下一次垃圾回收动作发生的时候真正收回对象所占的空间.finalize()有一个特点就是: JVM始终只调用一次. 无论这个对象被垃圾回收器标记为什么状态, finalize()始终只调用一次. 但是程序员在代码中主动调用的不记录在这之内.

尽量避免使用finalize():

  1. finalize()不一定会被调用, 因为java的垃圾回收器的特性就决定了它不一定会被调用
  2. 就算finalize()函数被调用, 它被调用的时间充满了不确定性, 因为程序中其他线程的优先级远远高于执行finalize()函数线程的优先级。也许等到finalize()被调用, 数据库的连接池或者文件句柄早就耗尽了.
  3. 如果一种未被捕获的异常在使用finalize方法时被抛出,这个异常不会被捕获,finalize方法的终结过程也会终止,造成对象出于破坏的状态。被破坏的对象又很可能导致部分资源无法被回收, 造成浪费.
  4. finalize()和垃圾回收器的运行本身就要耗费资源, 也许会导致程序的暂时停止.

finally

常常与try...catch语句一起出现,用于保证try语句执行完成之后总会执行finally语句,在finally中常常进行一些资源释放等操作。

即使在try语句中有return操作、或者出现某些没有catch住的运行时异常需要提前退出的时候,也会执行finally语句。

看下下面这个代码片段:

private static int test()
{int i = 1;try{return i;}finally{i = 2;}
}
执行结果:
1

test()方法执行的返回值是1,即虽然在return之前会执行一下finally中的方法,但是在finally中对返回对象进行重新赋值操作是不会改变原有待返回的值的。

通常情况下,尽量避免在finally分支中进行赋值操作,因为也不会生效,主要是用于一些资源的释放操作。

throw & throws

throw 是具体的语句抛出异常。
throws 是方法声明的时候声明可能抛出的异常时使用。

abstract

abstract 可以用于修饰类或者方法。

如果将一个类设置为abstract,则此类必须被继承使用。此类不可生成对象,必须被继承使用。 Abstract可以将子类的共性最大限度的抽取出来,放在父类中,以提高程序的简洁性。 Abstract虽然不能生成对象,但是可以声明,作为编译时类型,但不能作为运行时类型。 Final和abstract永远不会同时出现。

当abstract用于修饰方法时,此时该方法为抽象方法,此时方法不需要实现,实现留给子类覆盖,子类覆盖该方法之后方法才能够生效。 如果方法想要声明为abstract,则此方法所在的类必须也是abstract类型的。子类必须实现父类中的abstract方法, 否则编译会报错。

转载于:https://www.cnblogs.com/veezean/p/7647687.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL PL / java简介

现代数据库允许以多种语言编写存储过程。 一种常见的实现语言是java.NB,本文讨论了PostgreSQL特定的Java实现。 其他数据库的详细信息会有所不同,但是概念是相同的。 PL / Java的安装 在Ubuntu系统上安装PL / Java很简单。 我将首先创建一个新模板templ…

强连通分量 圆桌骑士

题目描述 圆桌骑士是一个非常吸引人的职业。因此,在最近几年里,亚瑟王史无前例的扩招圆桌骑士,并不令人惊讶。现在这里有许多圆桌骑士,每个圆桌骑士都收到一份珍贵的邀请函,被邀请去英灵殿圆桌。这些骑士将要环绕着坐在…

微信小程序echarts层级太高

项目中因为需求,底部的tab导航栏是自己写的,在开发者工具中一切正常;但是在真机上页面滑动时,echarts的层级比tab高,调过两者的z-index后仍然如此。 经过查找后发现cover-view和cover-image替换tab的view后&#xff0…

php解密 码表,php拼音码表的生成

php拼音码表的生成发布于 2014-09-07 11:12:52 | 90 次阅读 | 评论: 0 | 来源: 网友投递PHP开源脚本语言PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛…

angular js 使用pdf.js_排名靠前的几个JS框架发展趋势和前景

转载自:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。原文出处:https://blog.bitsrc.io/top-5-javascript-frameworks-past-present-and-future-8b6fda39de02随着信息技术领域的发展,企业…

工厂设计模式案例研究

我有一份工作来检查我们的项目代码质量。 如果我在项目中发现任何障碍,必须将其报告给我的团队负责人。 我发现了很多漏洞,我认为可以在博客上进行讨论。 不是嘲笑作者,而是一起学习和改进自己。 像这段代码一样,这是我在我们的代…

【javascript】DOM操作方法(3)——document节点属性

document.doctype //document.documentElement //来获取html元素 document.defaultView //返回document对象所在的window对象 document.body //返回当前文档的<body>节点 document.head //返回当前文档的<head>节点 document.activeElement //返回当前文…

debian dhcp服务启动不了_DHCP服务器配置

DHCP &#xff1d; Dynamic Host Configuration Protocol 基于TCP/IP&#xff0c;用于动态配置工作站网络接口&#xff0c;使工作站的网络接口管理自动化。DHCP服务器软件dhcpd网站&#xff1a;http://www.isc.org安装方法&#xff1a;#tar -zxvf dhcp-4.0.0.tar.gz#cd dhcp-4.…

泽西岛的JSON模式生成

因此&#xff0c;在上一篇文章中&#xff0c;我讨论了一个允许在WADL中使用JSON-Schema的建议&#xff0c;这篇文章探讨了如何使它与最近构建的Jersey一起使用。 在1.16发布之前&#xff0c;您将必须下载/参考1.16SNAPSHOT。 如果您使用的是Maven&#xff0c;那么假设您已经有…

C++map类型 之 简单介绍

一&#xff1a;map的前世今生&#xff08;1&#xff09;从关联容器与顺序容器说起。关联容器通过键&#xff08;key&#xff09;存储和读取元素。而顺序容器则通过元素在容器中的位置顺序存储和訪问元素&#xff08;vector,queue,stack,list等&#xff09;。关联容器&#xff0…

MySql Socket 完成数据库的增查Demo

需求: 利用MySql数据库结合前端技术完成用户的注册(要求不使用Web服务技术),所以 Demo采用Socket技术实现Web通信. 第一部分:数据库创建 数据库采用mysql 5.7.18, 数据库名称为MyUser, 内部有一张表 user.字段有 Id,UserName,Psd,Tel 第二部分:数据库连接与Socket通信 创建控…

oracle导数卡死,oracle-审计导数

1、因审计需求&#xff0c;需要将MySQL、Oracle数据库中需要的表数据导入到SqlSERVER进行审计。2、之前的方法&#xff1a;A. oracle组将表dump下来&#xff0c;进行压缩&#xff0c;传送到oracle导数服务器(中转服务器)&#xff0c;再进行还原&#xff0c;然后修改表结构&…

苹果桌面主题_看腻了手机自带的桌面主题,试试这个

在这个看脸的时代&#xff0c;颜值似乎越来越重要了。尤其是我们每天都要看到的手机桌面&#xff0c;如果它的颜值好一点&#xff0c;也许我们的心情会更好&#xff0c;所以有不少人都用手机自带的主题来美化桌面&#xff0c;但是对于喜欢个性的我们&#xff0c;手机自带的主题…

Java SE 11:推动Java向前发展

介绍 在我看来&#xff0c;这篇文章提出了Java语言应该如何发展以保持其作为首选语言的地位。 它还提供了一些我喜欢但有时&#xff08;可能永远不会&#xff09;成为Java一部分的功能&#xff0c;由于我将要解释的某些原因&#xff0c;这些功能有时我已经爱上了。 我真的很想…

python之property属性

Property的概念&#xff1a;property是一种特殊的属性&#xff0c;访问它时会执行一段功能&#xff08;函数&#xff09;&#xff0c;然后返回值。 import mathclass Circle:def __init__(self,radius):#园的半径radiusself.radiusradiusproperty#areaproperty(area)def area(s…

Hexo使用细节及各种问题

解决markdown图片不显示(返回403 forbidden)、添加本地图片无法显示、修改文章page模板、同时部署发布同步到多个仓库站点(Github、coding、gitee 码云) 图片不显示 在使用过程中&#xff0c;会发现有的引用图片无法显示的问题。但是如果直接复制图片地址到浏览器打开的话显示…

oracle的等保,Oracle等保测评相关指令

Oracle用户管理:SQL*Pluscreate user 用户名 identified by 密码; //创建用户grant 权限(dba管理员&#xff0c;resource普通用户&#xff0c;connect访客) to 用户名; //授权drop user 用户名 cascade; //删除用户&#xff0c;加cascade会把用户创建的所有东西删除Linux设置用…

Spring3 + JPA2 + Java EE6 App Server =配置混乱

Spring很棒&#xff0c;JavaEE6很棒&#xff0c;最新的JavaEE6 Application服务器也很棒。 这篇文章不是Spring Vs JavaEE6上的专栏文章&#xff0c;而是我在JBoss AS-7.1 App Server上移植Spring3 JPA2&#xff08;Hibernate&#xff09;应用程序的经验。 我的应用程序要求非…

python面向对象进阶(1)

面向对象进阶 isinstance(obj,cls) 检查是否obj是类cls的对象class Foo(object): passobj Foo() isinstance(obj,Foo)issubclass(sub,super) 检查sub是否是super的派生类class Foo(object): passclass Bar(Foo): passissubclass(Bar,Foo) 反射python面向对象中的反射&#xff…

智能小车37:异常在ARM、JAVA、硬件里的实现

几乎所有编程语言都有异常&#xff0c;可以说有程序就有异常。今天学习Arm的中断(异常)处理,联想到Java的异常,硬件中如何实现等问题&#xff0c;下面给大家分享一下。 一、Arm的中断。 1.触发异常 2.保存现场 3.cpu进入异常工作模式&#xff0c;程序指针(pc)跳入异常入口&…