Java基础语法-关键字的使用介绍

// 尝试执行可能会发生异常的代码块

} catch(…) {

// 捕捉try块中发生的异常并处理

} catch(…) {

// 多重catch时父类异常必须写到子类之后,同级的异常没有先后顺序。

} finally {

// 必须执行块,无论try中是否发生异常,该块都会被执行,即使try中有return也会在return之前被执行,但是如果try中有System.exit(),则Java虚拟机会退出,则不会执行finally。

}

###类方法和变量修饰符

在Java中一共有4中访问修饰符。用于控制类和数据的访问权限。

按权限范围由小到大依次为:private、空(default)、protected、public.

控制的范围如下所示:

| 访问范围 | public | protected | default | private |

| — | — | — | — | — |

| 同类 | ok | ok | ok | ok |

| 同包 | ok | ok | ok | |

| 子类(不同包) | ok | ok | | |

| 不同包无继承的类 | ok | | | |

  • 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

  • 接口中的方法必须是public abstract的

类和接口的相关修饰符

class:用来声明新的 Java类,该类是相关变量和/或方法的集合。类是面向对象的程序设计方法的基本构造单位。类通常代表某种实际实体,如几何形状或人。类是对象的模板。每个对象都是类的一个实例。要使用类,通常使用 new 操作符将类的对象实例化,然后调用类的方法来访问类的功能。

interface :用来声明新的Java接口,接口是方法和常量的集合。接口是 Java 语言的一项强大功能。任何类都可声明它实现一个或多个接口,这意味着它实现了在这些接口中所定义的所有方法。任何非抽象类如果实现了接口则必须提供在该接口中的所有方法的实现,若是抽象类实现了接口则抽象类或其子类要实现接口中的全部方法。

abstract:可以修改类或方法。abstract类可以扩展(增加子类),但不能直接实例化。abstract方法不在声明它的类中实现,但必须在某个子类中重写。采用abstract方法的类一定是抽象类,并且必须声明为abstract类。

extends:用在 class 或 interface 声明中,用于标识所声明的类或接口是 extends 关键字后的类或接口的子类或子接口。子类继承父类的所有 public 和 protected 变量和方法。 子类可以重写父类的任何非 final 方法。

class ContextImpl extends Context {}

public interface Closeable extends AutoCloseable {

public void close() throws IOException;

}

implements:在 class 声明中使用,表示所声明的类提供了在 implements 关键字后面的名称所指定的接口中所声明的所有方法的实现。类必须提供在接口中所声明的所有方法的实现。一个类可以实现多个接口。

this :用于引用当前实例。 当引用可能不明确时,可以使用 this 关键字来引用当前的实例。

super :用于引用使用该关键字的类的超类。 作为独立语句出现的 super 表示调用超类的构造方法。 super.methodName() 表示调用超类的方法。

new:用于创建类的新实例。 new 关键字后面的参数必须是类名,并且类名的后面必须是一组构造方法参数(必须带括号)。

static

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。

只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。static表示不要实例化就可以使用,这样就容易理解多了。

static变量

被static修饰的变量,叫静态变量或类变量;没有被static修饰的变量,叫实例变量。

对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。

对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

static方法

静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。

static代码块

static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次,利用静态代码块可以对一些static变量进行赋值。

final:final可以修饰类、方法和变量。

修饰类: 最终类,不能被继承。

修饰方法:最终方法,不能被重写。

修饰变量:最终变量,常量,一旦赋值不能被改变。

enum:枚举是Java中一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。

enum Color {

RED, GREEN, BLUE;

}

枚举可以用来创建单例模式,枚举类中也可以定义变量和方法。

public enum Singleton {

INSTANCE;

public void method() {

}

}

native :修饰方法,表示该方法是用 Java 以外的语言实现的。Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到

操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。

可以将native方法比作Java程序同C程序的接口,其实现步骤:

1. 在Java中声明native()方法,然后编译;

2. 用javah产生一个.h文件;

3. 写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);

4. 将第三步的.cpp文件编译成动态链接库文件;

5. 在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。

strictfp:strictfp的意思是FP-strict,也就是精确浮点的意思。在Java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,Java的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令人满意。而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果想让浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就用关键字strictfp。可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字。

transient :修饰类的成员变量,表示该类对象在序列化时,这个变量不被序列化。

我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。

然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

synchronized:可以应用于方法或语句块,并为一次只应由一个线程执行的关键代码段提供保护。 可防止代码的关键代码段一次被多个线程执行。 如果应用于静态方法,那么,当该方法一次由一个线程执行时,整个类将被锁定。 如果应用于实例方法,那么,当该方法一次由一个线程访问时,该实例将被锁定。 如果应用于对象或数组,当关联的代码块一次由一个线程执行时,对象或数组将被锁定。

volatile :用于表示可以被多个线程异步修改的成员变量。 volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,所有线程所看到的指定变量的值都是相同的。Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。

instanceof :instanceof 是 Java 的一个二元操作符,类似于 ==,>,< 等操作符。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。

import:使一个包中的一个或所有类在当前 Java 源文件中可见。可以不使用完全限定的类名来引用导入的类,使用*来引入包下面所有的类。

package:指定在 Java 源文件中声明的类所驻留的 Java 包。

goto :但无任何作用。结构化程序设计完全不需要 goto 语句即可完成各种流程,而 goto 语句的使用往往会使程序的可读性降低,所以 Java 不允许 goto 跳转。

const:是一个类型修饰符,使用const声明的对象不能更新。与final某些类似。

总结

三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。

  • 第一个是算法

关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。

而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本

《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

《算法的乐趣》共有23个章节:

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)

基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

]

[外链图片转存中…(img-wF9rSKeh-1714353141098)]

  • 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)

基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)

[外链图片转存中…(img-ZhFW8fDH-1714353141098)]

  • 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)

[外链图片转存中…(img-LLtwBhOe-1714353141098)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值