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 world

hello 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 语法总结的主要内容,如果未能解决你的问题,请参考以下文章

Java基础语法09-面向对象下-内部类

java之内部类

Java之内部类的继承(附源码)

java内部类总结

java内部类总结

Java学习之内部类