java基础知识和常见关键字

final、static、abstract

static

static 关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。

  • static 作用于代码块:称作静态代码块
  • static 方法(类方法)只能访问 static 方法,不能访问非 static 方法
  • static 方法只能访问 static field, 不能访问非 static field
  • static方法不能访问本类中的非static变量
  • 非 static 方法可以访问 static fields 和 static methods
  • static method 的两种访问方式 oject.method 和 class.method, 非 static method 只有 object.method 一种访问方式
  • static method 中不支持 this 和 super
  • static 不可以修饰局部变量(局部变量包括:函数级局部变量和块级局部变量)
  • static属性放在静态空间,不会在程序运行时被释放,它永远占着内存直到程序终止,这也是static不能修饰局部变量的原因。

final

  • final 类不能被继承(final 类内的 method 自动为 final,但不包括属性)
  • final 方法可以被继承但不能被 override
  • final 属性不能被重新赋值可以被继承,但不可以修改)定义时可以初始化,也可以不初始化,而在语句块中初始化或者构造函数中初始化(最晚要在构造函数中初始化,只能初始化一次),final 定义的成员变量可以在代码块 (类变量则静态代码块,实例变量普通代码块) 里初始化
  • final 属性只能人为赋值一次,继承与父类的 final 属性不能被修改
  • final 可以修饰局部变量表示局部常量(方法级局部变量(形参及局部变量,方法体级局部变量)或块级局部变量)

abstract

  • abstract 类不能实例化对象
  • abstract 类可以不包含 abstract 方法,但是只要有一个 abstract 方法那么该类必须为 abstract 类
  • abstract 方法没有方法体,需要被 override
  • abstract 类的子类要么实现其父类全部的 abstract method,要么也是一个 abstract 类
  • abstract 不能修饰属性
  • abstract 不能修饰局部变量(方法级局部变量(形参级局部变量,方法体级局部变量)或块级局部变量)
final 、abstract和static之间的关联
  • final、abstract 不能共存(无论在类、方法、属性、局部变量上都不能共存)
  • static、abstract 不能共存(无论在类、方法、属性、局部变量上都不能共存)
  • 可以出现 final static field(该类成员属性不能被修改)
  • 可以出现 final static method(该类成员方法不能被 override)
  • 只有final能修饰局部变量,static可以修饰成员变量不能修饰局部变量,abstract不能修饰属性

String StringBuffer StringBuilder

1.运算速度比较(通常情况下):StringBuilder > StringBuffer > String

String 是 final 类不能被继承且为字符串常量,而 StringBuilder 和 StringBuffer 均为字符串变量。String 对象一旦创建便不可更改,而后两者是可更改的,它们只能通过构造函数来建立对象,且对象被建立以后将在内存中分配内存空间,并初始保存一个 null,通过 append 方法向 StringBuffer 和 StringBuilder 中赋值。

2.线程安全性

2.1 String(线程安全)

不可变类(Immutable Class)是一旦被实例化就不会改变自身状态(或值)的类。String 就是一种典型的不可变类。(使用字符串自带的函数改变string内容都是相当于创建一个新的string,即 new String)。不可变类的主要用途是在多线程环境下确保对象的线程安全。

2.2 StringBuffer(线程安全的)

StringBuffer 中大部分方法由 synchronized 关键字修饰,在必要时可对方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致,所以是线程安全的。

2.3 StringBuilder(非线程安全)

StringBuilder 的方法不能保证线程安全性。StringBuilder 是 JDK1.5 新增的,该类提供一个与 StringBuffer 兼容的 API,但不能保证同步,所以在性能上较高。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

3.总结

  • String:适用于少量的字符串操作

  • StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。

  • StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。

其他常见关键字

volatile 关键字

volatile 是 java 中的一个类型修饰符。它是被设计用来修饰被不同线程访问和修改的变量。volatile具有如下两个特性:

  • 可见性,指的是在一个线程中对该变量的修改会马上由工作内存(Work Memory)写回主内存(Main Memory),所以会马上反应在其它线程的读取操作中。顺便一提,工作内存和主内存可以近似理解为实际电脑中的高速缓存和主存,工作内存是线程独享的,主存是线程共享的。
  • 禁止指令重排序优化,大家知道我们写的代码(尤其是多线程代码),由于编译器优化,在实际执行的时候可能与我们编写的顺序不同。编译器只保证程序执行结果与源代码相同,却不保证实际指令的顺序与源代码相同。这在单线程看起来没什么问题,然而一旦引入多线程,这种乱序就可能导致严重问题。volatile 关键字就可以从语义上解决这个问题。
native关键字

native 关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如 C 和 C++)实现的文件中。Java 语言本身不能对操作系统底层进行访问和操作,但是可以通过 JNI 接口——Java Native Interface (Java 本地接口)调用其他语言来实现对底层的访问

Java的保留字和关键字

goto 和 const 是保留字也是关键字。

Java 关键字列表 (依字母排序 共 50 组):

 abstract, assert, boolean, break, byte, case, catch, char, class, const(保留关键字),  continue, default, do, double, else, enum, extends, final, finally,  float, for, goto(保留关键字), if, implements, import, instanceof, int,  interface, long, native, new, package, private, protected, public,  return, short, static, strictfp, super, switch, synchronized, this,  throw, throws, transient, try, void, volatile, while

保留字列表 (依字母排序 共 14 组),Java 保留字是指现有 Java 版本尚未使用,但以后版本可能会作为关键字使用:

byValue, cast, false, future, generic, inner, operator, outer, rest, true, var, goto (保留关键字) , const (保留关键字) , null

基础知识概念

1.java 基本类型的默认值和取值范围

  • 整数类型 byte(1 个字节)short(2 个字节)int(4 个字节)long(8 个字节)
  • 字符类型 char(2 个字节)
  • 浮点类型 float(4 个字节)double(8 个字节)

2.Java 标识符有如下命名规则

  • 由 26 个英文字母大小写,数字:0-9 符号:_ $ ¥ 组成
  • 标识符应以字母、_ 、$ 开头
  • 标识符不能是关键字。

3.java 中 IO 流

  • 按照流的流向分,可以分为输入流和输出流

  • 按照操作单元划分,可以划分为字节流和字符流

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。

  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

    4.字符流和字节流的区别

    字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:

  • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

  • 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

  • 字节流:一次读入或读出是8位二进制。通过字节的形式一个字节一个字节或者字节数组来操作文件中内容,可以操作一切文件。

  • 字符流:一次读入或读出是16位二进制。通过单个字符或者是字符数组的形式来操作文件的,存在一定的局限性,是专门用于对文本文件操作的,默认的版本为GBK

    5.JRE和JDK区别

  • JRE:Java Runtime Environment( java 运行时环境)。即 java 程序的运行时环境,包含了 java 虚拟机,java 基础类库。

  • JDK:Java Development Kit( java 开发工具包)。即 java 语言编写的程序所需的开发工具包。JDK 包含了 JRE,同时还包括 java 源码的编译器 javac、监控工具 jconsole、分析工具 jvisualvm 等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值