Java 语法总结
Posted ayanwan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 语法总结相关的知识,希望对你有一定的参考价值。
一、语法基础:
1.1 变量与常量
1、关键字:其实就是某种语言赋予了特殊含义的单词。
保留字:其实就是还没有赋予特殊含义,但是准备日后要使用过的单词。
2、标示符:其实就是在程序中自定义的名词。比如类名,变量名,函数名。包含 0-9、a-z、$、_ ;
注意:1)数字不可以开头。
2)不可以使用关键字。
3、常量:是在程序中的不会变化的数据。
4、变量:其实就是内存中的一个存储空间,用于存储常量数据。
作用:方便于运算。因为有些数据不确定。所以确定该数据的名词和存储空间。
特点:变量空间可以重复使用。
什么时候定义变量?只要是数据不确定的时候,就定义变量。
变量空间的开辟需要什么要素呢?
1)这个空间要存储什么数据?数据类型。
2)这个空间叫什么名字啊?变量名称。
3)这个空间的第一次的数据是什么? 变量的初始化值。
(1)变量的作用域:作用域从变量定义的位置开始,到该变量所在的那对大括号结束;
(2)生命周期:变量从定义的位置开始就在内存中活了;变量到达它所在的作用域的时候就在内存中消失了;
5、数据类型:
1)基本数据类型:byte、short、int、long、float、double、char、boolean
2)引用数据类型: 数组、类、接口。
级别从低到高为:byte,char,short(这三个平级)-->int-->float-->long-->double
自动类型转换:从低级别到高级别,系统自动转的;
强制类型转换:什么情况下使用?把一个高级别的数赋给一个别该数的级别低的变量;
1.2 运算符
1)算术运算符。+ - * / % %:任何整数模2不是0就是1,所以只要改变被模数就可以实现开关运算。+:连接符。++,--
2)赋值运算符。= += -= *= /= %=
3)比较运算符。特点:该运算符的特点是:运算完的结果,要么是true,要么是false。
4)逻辑运算符。& | ^ ! && || 特点:逻辑运算符除了 ! 外都是用于连接两个boolean类型表达式
& : 只有两边都为true结果是true。否则就是false。
| :只要两边都为false结果是false,否则就是true
^ :异或:和或有点不一样。两边结果一样,就为false;两边结果不一样,就为true。
& 和 &&区别:& :无论左边结果是什么,右边都参与运算。
| 和|| 区别:&&:短路与,如果左边为false,那么右边不参数与运算。
|:两边都运算。
||:短路或,如果左边为true,那么右边不参与运算。
5)位运算符:用于操作二进制位的运算符。& | ^ << >> >>>(无符号右移)
1.3 控制语句
switch细节:
1)break是可以省略的,如果省略了就一直执行到遇到break为止;
2)switch 后面的小括号中的变量应该是byte,char,short,int四种类型中的一种;
3)default可以写在switch结构中的任意位置;如果将default语句放在了第一行,则不管expression与case中的value是否匹配,程序会从default开始执行直到第一个break出现。
while和for可以进行互换。区别在于:如果需要定义变量控制循环次数。建议使用for。因为for循环完毕,变量在内存中释放。
break:作用于switch ,和循环语句,用于跳出,或者称为结束。break语句单独存在时,下面不要定义其他语句,因为执行不到,编译会失败。当循环嵌套时,break只
跳出当前所在循环。要跳出嵌套中的外部循环,只要给循环起名字即可,这个名字称之为标号。
continue:只作用于循环结构,继续循环用的。作用:结束本次循环,继续下次循环。该语句单独存在时,下面不可以定义语句,执行不到。
1.4 数组
1、数组:用于存储同一类型数据的一个容器。好处:可以对该容器中的数据进行编号,从0开始。数组用于封装数据,就是一个具体的实体。
1)声明数组
语法: 数据类型[ ] 数组名; 或者 数据类型 数组名[ ];
2)分配空间:简单地说,就是指定数组中最多可存储多少个元素
语法: 数组名 = new 数据类型 [ 数组长度 ];
其中,数组长度就是数组中能存放元素的个数,
3)赋值:分配空间后就可以向数组中放数据了,数组中元素都是通过下标来访问的。
在 Java 中还提供了另外一种直接创建数组的方式,它将声明数组、分配空间和赋值合并完成。如:
int[] scores = 11,12,13,14; 等价于 int[] scores = new int[]11,12,13,14;
4) 数组名.length 用于获取数组的长度;
5) 使用 Arrays 类操作 Java 中的数组:
Arrays.sort(数组名) 对数组进行升序排序;Arrays.toString(数组名):将数组转换为字符串
1.5 函数
重载的定义是:在一个类中,如果出现了两个或者两个以上的同名函数,只要它们的参数的个数,或者参数的类型不同,即可称之为该函数重载了。
判断方法重载的依据:
1、 必须是在同一个类中
2、 方法名相同
3、 方法参数的个数、顺序或类型不同
4、 与方法的修饰符或返回值没有关系
java分了5片内存。
1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。
栈:存储的都是局部变量 ( 函数中定义的变量,函数上的参数,语句中的变量 );
只要数据运算完成所在的区域结束,该数据就会被释放。
堆:用于存储数组和对象,也就是实体。啥是实体啊?就是用于封装多个数据的。
1:每一个实体都有内存首地址值。
2:堆内存中的变量都有默认初始化值。因为数据类型不同,值也不一样。
3:垃圾回收机制。
二、面向对象三大特性
2.1 类与对象
类的特点:是具有相同属性和方法的一组对象的集合。类是对象的类型。
通过 类名 对象名 = new 类名(); 可以创建类的对象
1、成员变量和局部变量
(1)作用域不同
局部变量的作用域仅限于定义它的方法
成员变量的作用域在整个类内部都是可见的
(2)初始值不同
Java会给成员变量一个初始值,却不会给局部变量一个初始值;
2、构造函数
(1)一般的 new 一个新对象时,系统是执行一个构造方法,如果class中没有定义构造方法,系统自动生成无参的构造方法;
(2)当没有指定构造方法时,系统会自动添加一个无参构造方法;而当class中定义了构造方法,不管是有参的还是无参的,系统都不会在生成构造方法。
3、static静态变量
使用 static 可以修饰变量、方法和代码块。Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。
静态成员可以使用类名直接访问,也可以使用对象名进行访问。当然,鉴于他作用的特殊性更推荐用类名访问~~
4、static静态方法
1)静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员;
如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。
2)静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。
3)在普通成员方法中,则可以直接访问同类的非静态变量和静态变量;
5、static静态代码块
在类的声明中,可以包含多个初始化块,当类的实例化时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。
需要特别注意:静态初始化块只在类加载时执行,且只执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
6、toString()方法
toString是Object类的方法,所有类都从Object类继承。
(1)如果你定义的类没有覆盖toString方法,则对象在调用toString方法时用的是Object类toString方法,返回的是“类名@hashcode"。如果是byte[] 类型的话,则是“[B@hashcode”
System.out.println(obj)在参数是一个对象时,会默认调用该对象的toString方法。
(2)String类和StringBuffer类都覆盖了toString方法,都是返回字符串。所以带不带toString效果是一样的。
String s1 = "hello";
StringBuffer s2 = new StringBuffer(s1);
s2.append(" world");
System.out.println(s2.toString());
System.out.println(s2);
结果:
hello worldhello world
【PS : getBytes() vs new String()】
(1)String的getBytes()方法是得到一个系统默认的编码格式的字节数组。
(2)通过String.getBytes(String decode)方法来得到byte[],通过new String()将byte[]数组还原。
String str = "570FF26603A91CC3";
byte[] bStr = str.getBytes();
System.out.println(new String(bStr));
结果:570FF26603A91CC3
分析:bStr = [53, 55, 48, 70, 70, 50, 54, 54, 48, 51, 65, 57, 49, 67, 67, 51] ascii码的十进制显示。
【PS: hex编码】
Hex就是16进制,本质上是将字节数组转化为16进制,然后用字符串的形式表现出来,我们知道16进制的取值范围就是在0-f之间,这样就可以将无法显示的字节数组数据显示出来。
原理:一个8bit的数据,也就是(xxxx xxxx),每4个bit可以转化为一个16进制表示,也就是8个bit会转化为(00-ff)之间的16进制数字。
hex编码 :指将数据编码16进制字符串;hex解码:指16进制字符串解码为数据。
public static void main(String[] args)
/************* getBytes() new String() toString() hex ****************/
String str = "570FF26603A91CC3";
byte[] bStr = str.getBytes();
String Bhex = bcd2str(bStr);// hex编码
byte[] hex2b = hexStringToBytes(Bhex);// hex解码
String b2s = new String(hex2b);
System.out.println("Bhex = " + Bhex);
System.out.println("hex2s = " + b2s);
public static byte[] hexStringToBytes(String hexString)
if (hexString == null || hexString.equals(""))
return null;
hexString = hexString.toUpperCase();
int length = hexString.length() / 2;
char[] hexChars = hexString.toCharArray();
byte[] d = new byte[length];
for (int i = 0; i < length; i++)
int pos = i * 2;
d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
return d;
private static byte charToByte(char c)
return (byte) "0123456789ABCDEF".indexOf(c);
public static String bcd2str(byte[] bcds)
char[] ascii = "0123456789abcdef".toCharArray();
byte[] temp = new byte[bcds.length * 2];
for (int i = 0; i < bcds.length; i++)
temp[i * 2] = (byte) ((bcds[i] >> 4) & 0x0f);
temp[i * 2 + 1] = (byte) (bcds[i] & 0x0f);
StringBuffer res = new StringBuffer();
for (int i = 0; i < temp.length; i++)
res.append(ascii[temp[i]]);
return res.toString().toUpperCase();
2.2 封装
类的封装:类的封装使用户通过类的作者指定的方法修改类的数据成员,而不使用户直接操作数据成员,这叫做类的封装。封装是为了隐藏属性,通过方法给属性赋值。
1、包的作用:管理Java文件;解决同名文件冲突
注:必须放在Java源程序的第一行,必须小写。
2、访问控制符
3、this
this关键字代表当前对象
this.属性 操作当前对象的属性
this.方法 调用当前对象的方法
封装对象的属性时,经常用this关键字
4、内部类
内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
作用是:
1)内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类;
2)内部类的方法可以直接访问外部类的所有数据,包括私有的数据;
3)内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。
内部类可分为以下几种:
(1)成员内部类:
A、 外部类是不能直接使用内部类的成员和方法
B、如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。
(2)静态内部类:
静态内部类是 static 修饰的内部类,这种内部类的特点是:
A、静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
B、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
C、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
(3)方法内部类
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
(4)匿名内部类
2.3 继承
继承是类与类之间的关系,是一种is a的关系。子类拥有父类的所有属性和方法,private修饰的无效。
1、重写:如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法。
语法规则:a.返回值类型 b.方法名 c.参数类型及个数,都要与父类继承的方法相同,才叫方法的重写。
2、继承的初始化顺序:
1)初始化父类再初始子类
2)先执行初始化对象中属性,再执行构造方法中的初始化
3、final中文的意思就是最终的意思;它可以修饰类,方法,属性和变量;final修饰类,则该类不能被继承;
final修饰方法,则该方法不能被重写或覆盖; final修饰属性,则该属性在类的初始化时必须有值;或者,在构造方法赋值(只能选择其一); final修饰变量,则该变量就只能赋一次值,==常量。4、super 1)子类的构造的过程当中必须调用其父类的构造方法。 2)如果子类的构造方法中没有调用父类的构造方法,则系统默认调用父类无参的构造方法。
3)如果显示的调用构造方法,必须在子类的构造方法的第一行。
4)如果子类构造方法中既没有显式调用父类的构造方法,而父类又没有无参的构造方法,则编译出错。(如果自定义一个有参的构造方法,系统就不会帮我们自动生成一个无参的构造方法)
5、object类 1)在Object类里面定义toString()方法的是返回的对象的哈希code码(对象地址字符串) 2)当我们new一个类的时候,得到的对象叫做 类的对象(对象的属性值的信息,或者说这个对象数据信息);如果这个对象调用getClass()方法,得到的是 类对象(类对象描述的是类的代码信息)
2.4 多态
1、多态:对象的多种形态 1)引用多态:父类引用(对象)可以指向本类对象也可以指向子类对象; 2)方法多态:不能调用子类独有方法,父类引用调用父类方法、子类引用调用子类方法(或父类的方法重载);如果子类没有方法,则调用的是父类对应的方法。 2、多态的引用类型转换: 1)向上类型转换(隐式/自动类型转换),是小类型到大类型的转换 无风险;2)向下类型转换( 强制类型转换),是大类型到小类型 有风险; 3) instanceof运算符, 用来判断对象是否有相同属性,从而解决引用对象的类型,避免类型转换的安全性问题; 3、抽象类 在某个父类只知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法时候使用抽象类。抽象类没有方法体,以分号结束 ,抽象类不能直接创建变量,可以定义引用,限制规定子类必须使用某些方法但不关注实现细节。 4、接口 接口可理解为一种特殊的类,由全局常量和公共的抽象方法组成。类是一种具体实现体,而接口定义了某一批类所必须遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。和类定义不同,定义接口不再使用class,使用interface关键字。
匿名内部类:就是直接new 接口,在接口里面实现方法。
三、常用工具类
3.1 异常处理
3.1.1 异常分类:
1)Java中的所有不正常类都继承于Throwable类。Throwable主要包括两个大类,一个是Error类,另一个是Exception类; 2)Error类中包括虚拟机错误和线程死锁,一旦Error出现了,程序就彻底的挂了,被称为程序终结者;3)Exception类主要指编码、环境、用户操作输入出现问题,Exception主要包括两大类,非检查异常(RuntimeException)和检查异常(其他的一些异常)
4)RuntimeException异常主要包括以下四种异常:空指针异常、数组下标越界异常、类型转换异常、算术异常。
5)检查异常:IOException(文件异常)和SOL异常。
3.1.2 异常处理原则
1)程序出现后会终止运行,然后将程序的控制权交给catch块中的异常处理程序;2)当使用多个catch块时,须按照先子类后父类的顺序;
3)finally 为 catch后 最终要执行的一些代码;finally 语句的优先级比较高 所以不管是否已经return 完 ,都会执行;
3.1.3 异常抛出
需要用到throw和throws:
1)throw:将产生的异常抛出(动作);
2)throws:在添加方法的时候添加。声明将要抛出何种类型的异常;
3.1.4 自定义异常与异常链
1、自定义异常 格式:class 自定义异常类 extends 异常类型注意:自定义异常: 必须继承相似的类或直接继承Exception 2、Java中的异常链:将捕获的异常包装成新的异常,然后在新的异常中添加对原始异常的引用,再把这个新的异常抛出。就像是链式反应一样,一个导致一个。
【总结】 1、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
2、在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
3、对于不确定的代码,也可以加上try-catch,处理潜在的异常
4、尽量去处理异常,切记只是简单的调用printStackTrace()去打印
5、具体如何处理异常,要根据不同的业务需求和异常类型去决定
3.2 集合框架
集合框架有两大家族:分别是Collection接口,Map接口 (1)Collection中有三个常用的子接口:List,Queue,Set(无序不可重复)。他们下面又有3个实现类:ArrayList(数组序列),LinkedList(链表),HashSet。 (2)Map中有一个常用子接口:HashMap它是以(entry)键值对的形式存储数据的,就相当于一个字典集。3.2.1 Collection接口
List(元素排列有序,可重复:序列)-ArrayList(数组序列) Queue(有序,可重复,不常用:队列)LinkedList(链表)(也属List) Set(无序,不可重复:集)HashSet(哈希集) Map接口:----<key,value>----HashMap(哈希表)
3.2.2 Map接口
(1)Map提供了一种映射关系,其中的元素是以键值对(key - value)的形式存储的,能够实现根据key快速查找value (2)Map中的键值对以Entry类型的对象实例形式存在 (3)键(key值)不可重复,value值可以重复 (4)每个键最多只能映射到一个值 (5)Map接口提供了分别返回key值集合,value值集合以及Entry(键值对)集合的方法 (6)Map支持泛型,形式如:Map<K,V>
四、文件操作
4.1 进制转换
4.1.1 java进制转换
4.1.2 Java中类型数据转为字节
1、int类型:1.1、byte(Byte):8bit;
1.2、short(Short):16bit;
1.3、int(Integer):32bit;
1.4、long(Long):64bit;
2、float类型:
2.1、单精度:float(Float),32bit;
2.2、双精度:double(Double),64bit;
3、boolean(Boolean)类型:取值true或false;
4、char(Character)类型:Unicode字符,16bit;
【int转byte】
//int转为byte
public static byte[] int2Bytes(int id)
byte[] arr = new byte[4];
for (int i = 0; i < arr.length; i++)
arr[i] = (byte) ((int) (id >> i * 8) & 0xff);
return arr;
//byte转为int
public static int byte2Int(byte[] arr)
int result = 0;
for (int i = 0; i < arr.length; i++)
result += (int) ((arr[i] & 0xff) << i * 8);
return result;
【String转byte】
(1)字符串转换为字节数组
String s = "hello";
byte[] bs = s.getByte();
(2)字节数组转换为字符串:
byte[] bs = new byte[int];
String s = new String(bs);或
String s = new String(bs,"UTF-8"); //指定编码方式
以上是关于Java 语法总结的主要内容,如果未能解决你的问题,请参考以下文章