Java基础语法
1、变量类型及其占用字节数
类型 | 占用存储空间/字节 | 表数范围 | 说明 | 使用场景举例 |
---|---|---|---|---|
byte | 1字节 = 8 bit | -128 ~ +127 | ||
short | 2 | -2 15 ~215 -1 | ||
int | 4 | 同理 | ||
long | 8 | 2的(8*8-1)次方 | 后面必须加一个L,如Long num = 12313112L | UUID、序列号、MD5密码、雪花算法主键 |
float | 4 | |||
double | 8 | |||
char | 2 |
2、运算符
运算 | 作用 | 示例 | 说明 |
---|---|---|---|
instanceof | 检查A是否是类B或类B的子类的对象 | A instanceof B | 返回true或false |
“&”和“&&” | 逻辑与 | 单&时,左边无论真假,右边都进行运算; 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 | |
“|”和“||” | 逻辑或 | 同理, | |
^ | 逻辑异或 | 异或,追求的是“异”,当左右相同时,结果为false | |
三元运算符 | (条件表达式)?表达式1:表达式2; | 当条件表达式的值为true,执行表达式1;为false,执行表达式2。 |
3、数组
数组算法
基本会冒泡会快速排序就OK了
Arrays工具类的使用:java.util.Arrays
说明 | 方法 | 作用 |
---|---|---|
判断两个数组长度和值是否相等 | boolean equals(int[] a,int[] b) | 判断两个数组是否相等。 |
将数组转换成String类型输出的 | String toString(int[] a) | 输出数组信息。 |
这个方法感觉用户不大啊 | void fill(int[] a,int fromIndex, int toIndex,int val) | 将值val分配给数组的指定范围的每个元素;当无 int fromIndex, int toIndex这两个参数时,替换整个数组 |
快速排序 | void sort(int[] a) | 对数组进行排序。 |
二分查找 | int binarySearch(int[] a,int key) | 对排序后的数组进行二分法检索指定的值。 |
数组常见异常
-
数组脚标越界异常(ArrayIndexOutOfBoundsException)
-
空指针异常(NullPointerException)。
4、面向对象
1、匿名对象
如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。 我们经常将匿名对象作为实参传递给一个方法调用。
我们也不定义对象的变量引用,而是直接调用这个对象的方法。这样的对象叫做匿名对象。
如:new Person().shout();
关于匿名对象的生命周期:仅仅使用一次就不能再使用了;当然,当他作为一个方法参数时,在方法体内部还能多次使用。
2、Java方法的参数传递
Java里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本 (复制品)传入方法内,而参数本身不受影响。
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参;
形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
3、常用关键字
-
static:静态的,可修饰方法、属性,修饰方法时,方法里面调用的方法和属性也应该是静态的。
一个有趣的题目:
public static void main(String[] args) { int a = 10; int b = 10; method(a,b);//要求method方法调用后仅打印出a=100,b=100,请实现method方法 System.out.println("a="+a); System.out.println("b="+b); } //题目看似在考查方法的参数传递,但是仔细观察会发现,这题压根不能按照正常的情况解决 //所以正确解答是: public static void method(int a,int b){ System.out.println("a=100"); System.out.println("b=100"); System.exit(0);//直接让程序退出执行 }
4、四种权限修饰符
修饰符 | 类内部 | 同一个包 | 不同包的子类 | 整个工程/module |
---|---|---|---|---|
private | Yes | |||
缺省 | Yes | Yes | ||
protected | Yes | Yes | Yes | |
public | Yes | Yes | Yes | Yes |
其中,对于class的权限修饰只可以用public和default(缺省);protected是不同包的子类才能访问
5、关于类的构造器与继承关系
-
当类中未显示声明构造器时,系统会默认提供一个无参构造器,当声明构造器后这个默认构造器就失效了(其实是方法的重写)
-
Java中所有的类(除了枚举类)都直接或间接的继承object类,object类提供了一个无参构造器。
6、多态性
-
编译时:要查看引用变量所声明的类中是否有所调用的方法;运行时:调用实际new的对象所属的类中的重写方法;
-
属性无多态性;
-
多态是运行时行为,因为只有真正运行时才知道new的是哪个类对象。
7、对象类型转换
-
从子类到父类的类型转换可以自动进行,因为父类有的子类都有
-
从父类到子类的类型转换必须通过造型(强制类型转换)实现,因为子类有的父类不一定有
-
无继承关系的引用类型间的转换是非法的
-
在造型前可以使用instanceof操作符测试一个对象的类型
8、object类
-
Object类是所有Java类的根父类
-
如果在类的声明中未使用extends关键字指明其父类,则默认父类 为java.lang.Object类
Object类的主要结构:一般这几个方法都要重写
方法名称 | 描述 |
---|---|
public Object() | 构造器 |
public boolean equals(Object obj) | 对象比较 |
public int hashCode() | 获取对象Hash码 |
public String toString() | 对象转化为字符串打印 |
9、equals和==的区别:
-
== 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址;
-
equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点;
-
具体要看自定义类里有没有重写Object的equals方法来判断;
-
4 通常情况下,重写equals方法,会比较类中的相应属性是否都相等。
10、基本类型、包装类与String类间的转换
-
自动拆箱与自动装箱可以自动完成基本类型与包装类的相互转换。
-
调用包装类的.xxxValue(String str)方法,返回值就是相应的基本类型;
-
调用字符串重载的valueOf(基本数据类型)方法,返回值类型就是String
11、抽象类与抽象方法
-
用abstract关键字来修饰一个类,这个类叫做抽象类;
-
用abstract来修饰一个方法,该方法叫做抽象方法。
-
抽象方法:只有方法的声明,没有方法的实现。以分号结束: 比如:public abstract void talk();
-
含有抽象方法的类必须被声明为抽象类;
-
抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重 写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类;
-
abstract只能用来修饰类和方法。
12、final关键字
-
final标记的方法不能被子类重写;
-
final标记的类不能被继承;
-
final标记的变量(成员变量或局部变量)即称为常量。名称大写,且只 能被赋值一次;
13、接口interface
-
一个类可以实现多个接口,接口也可以继承其它接口;
-
接口的主要用途就是被实现类实现;
-
接口中的所有抽象方法和成员变量都默认是由public abstract修饰的。
-
接口中没有构造器
5、异常处理
两种异常处理方式
-
try-catch-finally:不论在try代码块中是否发生了异常事件,catch语句是否执 行,catch语句是否有异常,catch语句中是否有return, finally块中的语句都会被执行;finally语句和catch语句是可选的;
-
在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
异常类的两个常用方法
-
getMessage() 获取异常信息,返回字符串;
-
printStackTrace() 获取异常类名和异常信息,以及异常出 现在程序中的位置。返回值void;
-
一般是在catch语句中使用:
//异常类方法 try{ }catch(Exception e){//当匹配到这个异常类时执行该catch语句 e.getMessage(); }
用户自定义异常
要求:
-
一般地,用户自定义异常类都是RuntimeException的子类;
-
自定义异常类通常需要编写几个重载的构造器;
-
自定义异常需要提供serialVersionUID;
-
自定义的异常通过throw抛出,不是throws!!!;
-
自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型。
示例如下:
//用户自定义异常类MyException,用于描述数据取值范围错误信息。用户 //自己的异常类必须继承现有的异常类。 class MyException extends Exception { static final long serialVersionUID = 13465653435L; private int idnumber; public MyException(String message, int id) { super(message); this.idnumber = id; } public int getId() { return idnumber; } } //可以定义一个测试类如下: public void manager() { try { regist(100); } catch (MyException e) { System.out.print("登记失败,出错种类" + e.getId());//调用getId方法 System.out.print(e.getMessage("登记失败"));//这里调用的就与构造器方法 } System.out.print("本次登记操作结束"); }