1.文件的命名:
主要是指当一个类被public关键字修饰时,该源文件的命名应该为 类名.java
若不被public修饰则源文件的命名可以是(任意.java)
2.标识符:熟悉标识符命名规则
命名规则:
注意点:标识符不能以数字开头、关键字不能作为标识符使用、汉字也可以为标识符
Java中采用的字符集是Unicode字符集
3.数据类型:基本数据类型和引用类型
基本数据类型:byte,char,short,int,long,double,float,boolean
引用类型:类、接口、数组
掌握类型转换:自动转换和强制类型转换
引用类型:类,数组,接口
字面量:小数默认double类型,整数默认int类型
例如4.5 是double类型,45 是int 类型
4.字符串:
定义:String str1=“hello”;
String str2= new String(“hello”);
String st3 = new String(char arr[]);
常用方法:
- length():获取字符串的长度
- charAt(int index):返回指定索引处的字符
- substring(int beg,int end):返回指定范围内的子串
- equals(String str):比较两个字符的内容是否相同,相同返回true,否则返回false
- indexOf(String str):功能是返回指定子字符串在此字符串中第一次出现处索
- toUpperCase():功能是将此 String 中的所有字符都转换为大写。
- valueOf(int i):功能是返回 int 参数的字符串表示形式。
扩展:如何将一个字符转换为int型数据:
例如
String age1 = “15”;
int age2 =Integer.parseInt(age1);
String str1,str2;若str1==str2比较的是地址;str1.equals(str2)比较的是内容
注意点:String内容是固定的,不能改变
StringBuffer和StringBuilder:字符串可以改变,StringBuffer是线程安全的,可以应用这两个类实现对字符的插入和追加,对应方法为insert()、append()
5.类与对象:
成员变量:定义在类中,方法体外的变量
局部变量:方法中的变量,包括方法中的参数、方法内的变量、返回值。局部变量要赋初值
构造方法:在一个类中,方法名与类名相同的方法
方法重载:在一个类中,方法名相同,参数列表不同。其中参数列表包括参数类型、参数个数、参数排列顺序
6.访问控制修饰符
public:修饰类、变量和方法,公有的,任何包都可以访问
private:私有的,修饰变量和方法,只能在类的内部使用
protected:受保护的,修饰变量和方法,在同一包下或不在同包下但是具有继承关系的类
中可以访问
default:默认的,可以修饰类、变量和方法,只在同包中可以访问
7.static和final关键字
被static修饰的成员为类成员,可以通过类名.成员名
静态方法引用的变量必须是静态的,静态变量对所有对象来说是共享的
final修饰的类是最终的类,不能被继承,final修饰的方法不能被子类重写,final修饰的变量是常量。
8.数组:
存储相同数据类型的数据结构。(既可以存储基本数据类型也可以存储引用类型数据),数组的长度不可以改变,定义数组一定要给出长度
- 一维数组
定义:静态定义 int[] arr ={1,2,3,4,5}
动态定义 int[] arr= new int[10];
使用:通过数组下标引用数组中的元素 arr[i],下标从0开始
数组长度=数组名.length;
遍历数组:通过for循环或增强for循环
2.二维数组
定义:静态定义int[][] arr={{1,2,3},{4,5,6}}
动态定义数据类型[][] 数组名=new 数据类型[n][m];
其中:n:为行,m为列,n必须存在,m可以有也可以没有
使用:通过数组下标引用数组的元素arr[n][m]
数组长度=数组名.length;
二维数组中某行中的元素:数组名[n].length;
9.集合:
集合中只能存储对象或对象的引用,不能存储基本数据类型的数据,集合的长度是可变的,集合的接口和类在java.util.包中
Collection接口:是List和Set接口的父接口
- List接口:继承Collection接口,列表类型,允许集合存储重复对象,而且有序
- ArrayList:List接口的实现类,使用此类来实现对列表的随机访问操作,但对插入和删除操作效率较低
- ArrayList的常用方法
- int size():返回当前集合中的元素个数
- Object get(int index):返回集合中指定位置的元素
- boolean add(Object o):向集合中加入指定的元素
- LinkedList:对需要频繁从列表的中间位置添加和除去元素使用的类,执行此操作效率比ArrayList要高
- add(int index, E element): 在此列表中指定的位置插入指定的元素。
- addFirst(E e) :将指定元素插入此列表的开头。
- get(int index):返回此列表中指定位置处的元素
- remove(int index):移除此列表中指定位置处的元素。
- set(int index, E element):将此列表中指定位置的元素替换为指定的元素。
- Set接口:继承Collection接口,无序,存储对象不可以重复HashSet,TreeSet
- TreeSet底层是用自平衡的排序二叉树实现
- HashSet是按Hash算法来存储集合中的元素,通过自身调用hashCode()方法算出一个值,然后通过这个值查找元素在集合中的位置。
- 常用方法
- add(E e):如果此 set 中尚未包含指定元素,则添加指定元素。
- remove(Object o):如果指定元素存在于此 set 中,则将其移除。
- size():返回此 set 中的元素的数量(set 的容量)。
- contains(Object o):如果此 set 包含指定元素,则返回 true。
- iterator():返回对此 set 中元素进行迭代的迭代器
- Map接口:以“键-值对”方式存储元素,每个元素都包括键和值两部分,键是值的标签信息,不可以重复,键和值之间存在单向一对一关系,键由Set存储
- HashMap常用方法
- object put(K key,V value)
- Set keySet():获取键值
- Object get(Object key
- HashMap常用方法
10.Java常用类
(1)Object类:Java中所有类的基类
常用方法:
- Object clone():创建并返回该对象的拷贝对象
- boolean equals(Object obj):比较两个对象是否是同一个对象(即地址是否相同)
- String toString():返回该对象的字符串表示形式
- hashCode():返回该对象的哈希码值。
(2)Scanner类:获取用户从键盘输入的不同数据,以完成数据的输入,此类在java.util包中。
创建对象:Scanner sc = new Scanner(System.in);
常用方法:String sc.next():接收键盘输入的内容,并以字符串返回
int sc.nextInt();接收键盘输入的整数
(3)包装类:
将基本数据类型封装成对象使用。有Integer、Short、Character、Float、Double、 Byte、Boolean、Long
拆箱:将对象转换成基本数据类型
装箱:将基本数据类型转换成引用类型
常用方法:包装类.xxxValue():将对象转换为基本数据类型。其中xxx为基本数据类型包装类.parseXxx(String s):把字符串转换为对应的基本类型
包装类.valueOf(String s):将基本类型的字符串生成相应类型的对象
11继承:
Java中的继承是单继承的,但通过接口间接的实现了多继承
通过“extends”关键字实现继承
变量的隐藏:当子类的成员变量与父类成员变量相同时,则子类的成员变量会隐藏父类的成员变量
方法的重写:子类中定义与父类相同的方法(方法名、参数、返回值类型相同);子类的访问权限不能比父类方法中的访问权限低
若要使用父类中被子类隐藏的成员变量或被重写的成员方法,则使用super关键字,使用方法:super.变量名、super.成员方法([实参列表])
也可以使用super关键字在子类中调用父类的构造方法
super()或super([实参列表])
向上转型:父类类型 变量名 = 子类对象
变量名.父类方法()
向下转型:强制类型转换
引用类型变量 instanceof 引用类型:用于判断引用类型变量是否是引用类型或其子类或实现类的实例 “java” instanceof Object
- 抽象类:由abstract修饰的类
什么是抽象,抽象就是从多个事物中将共性的,本质的内容抽取出来。
抽象方法:多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,所以只有功能声明,没有功能主体的 方法(即没有具体方法体和操作实现的方法,仅有一个方法投)称为抽象方法,有抽象方法的类一定是抽象类。
抽象类怎么使用,由抽象类派生出子类,有子类来创建对象使用
-
- 由abstract修饰的方法是抽象方法,含有抽象方法的类一定是抽象类,但抽象类中不一定含有抽象方法
- 抽象方法只需要定义,不需要实现(连大括号都不能有)
- 抽象类中可以有抽象方法也可以有非抽象方法
- 抽象类不能被实例化,要通过其子类创建对象
- 抽象类不能被final修饰
- 实现抽象类就要实现抽象类中的所有抽象方法,否则,该类还是一个抽象类
public abstract class Animal{
}
public abstract class Person{
public abstract void run();
}
public abstract class Flower{
public void bloom(){
}
}
- 接口
定义: [修饰符] interface 接口名 [extends 父接口列表]
{
静态常量;
方法声明;
}
- 修饰符只有public和默认两种
- 接口中的数据成员默认是public static final 修饰的,即数据成员是全局静态
常量
- 从JDK8开始允许在接口中定义默认方法,默认方法使用default关键字修饰,
默认方法要有方法实现(方法体)
- 从JDK8开始允许在接口中定义类方法,类方法必须使用static关键字修饰,类方法必须有方法实现(方法体),可以通过接口来调用
- 一个接口可以继承多个接口
实现:
- Implements关键字用于实现接口
- 一个类可以实现多个接口(接口与接口之间使用逗号隔开)
- 一个类实现接口,就要实现该接口的所有抽象方法
接口与抽象类的相同点
- 接口和抽象类都不能被实现化,需要被其他类实现或继承
- 接口和抽象类的类型变量都可以指向实现类或子类的实例对象
- 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类时要实现这些抽象方法
接口与抽象类的不同点
- 接口体现的是一种规范,是系统各模块应该遵循的标准,以便实现各模块之间的松耦合
- 抽象类体现的是一种模板设计,抽象类可以被当成系统实现过程中的中间产品,该产品已实现了部分功能但不能当成最终产品,必须进一步完善,而完善可能有几种不同方式
- 接口中除了默认方法和类方法,不能为普通方法提供方法实现,而抽象类则完全可以为普通方法提供方法实现
- 接口中的变量是静态常量,其实现类不能重新定义,也不能改变其值,抽象类中的变量与普通类一样可以重新定义,也可以改变其值
- 接口中的方法都默认是public
- 接口中不包含构造方法,而抽象类可以包含构造方法
- 抽象类是单继承,接口是多继承
- 内部类:在一个类的内部定义的类。内部类是外部类的一个成员,并且依附于外部类而存在。
- 内部类能够隐藏起来,不为同一包的其他类访问
- 内部类可以访问其所在的外部类的所有属性
- 在回调方法处理中,匿名内部类尤为便捷,特别是事件处理时经常使用
- 成员内部类
- 成员内部类可以访问外部类的私有成员属性
- 外部类可以通过内部类对象来访问内部类的私有成员属性
- 在外部类的方法中可以访问内部类的成员,同时也可以在外部类的外部直接实例化内部类的对象。内部类对象实例化语法格式:外部类.内部类 对象名=new 外部类对象.new.内部类构造方法
- 局部内部类:定义在方法中的局部内部类
注意:局部内部类不能用public或private访问修饰符进行声明,作用域只在方法内;
除了所在的方法外,对其他方法而言是不透明的
局部内部类可以访问包含它的外部类的成员,还可以访问局部变量,但这些局部变量必须被声明为final
-
- 静态内部类:使用static关键字修饰的一个内部类
静态内部类属于外部类本身,不属于外部类的某个对象,静态内部类可以包含静态成员,静态内部类不能直接访问外部类的实例成员,只能直接访问外部类的静态成员即类成员,要想访问外部类的实例成员,必须通过外部类的实例去访问;
-
- 匿名内部类:没有名字的内部类
匿名内部类不能有构造方法;匿名内部类不能定义任何静态成员、方法和类
只能创建匿名内部类的一个实例;一个匿名内部类一定跟在new 的后面,创建其实现的接口或父类的对象
12.异常处理
Java异常分为Checked(检查)异常<编译时发生>和Runtime(运行时)异常<运行时异常>,所有RuntimeException类及其子类的异常被称为Runtime异常,不属于该异常的都被称为CheckedException(检查异常),检查异常必须进行异常处理
检查异常(Checked 异常)有:
- ClassNotFoundException
- FileNotFoundException
- IOException
- SQLException
运行时异常有
- NullPointerException:空指针异常
- ClassCastException:类对象强制转换异常
- ArrayIndexOutOfBoundsException:数组下标越界
- ArithmeticException:算术异常
- NumberFormatException:字符串转换为数值所产生的异常
异常处理
- 异常捕获:try{}catch(Exception e)finally{}
- 抛出异常:throws(方法定义时),throw(抛出异常对象,方法内抛出,只能抛出一个对象)
异常常用方法
- printStackTrace():输出错误信息,用来跟踪异常事件发生时执行的堆栈内容
- getMessage():得到有关异常的信息
- getCause():j获得异常的原因
自定义异常对象
【修饰符】自定义异常类名 extends Exception<或其子类>
13.输入输出流
字节输入输出流:InputStream、OutputStream
字符输入输出流:Reader、Writer
文件类:File
上面四个都是抽象类。
FileInputStream读操作:read(byte[] b.int off,int len)
FileOutputStream写操作: write(byte[] b,int off,int len)
FileReader读操作: read(char[] c)
FileWriter写操作:write(char[] c)
InputStreamReader:是字节流通向字符流的桥梁,将字节输入流转换为字符流
OutputStreamWriter:是字节流通向字符流的桥梁,将字节输出流转为字符流
BufferedInputStream//字节输入缓冲流
BufferedOutputStream//字节输出缓冲流
BufferedReader//字符输入缓冲流
BufferedWriter//字符输出缓冲流
14.线程
Thread
启动线程调用:start()
执行线程调用:run()
线程休眠sleep(long l):参数是毫秒为单位,需要异常处理
线程生命周期中的四个状态:新建状态、就绪状态、运行状态、阻塞状态、死亡状态
线程同步:synchronized
同步方法
class 类名{
public synchronized 返回值 方法名(){
}
}
同步代码块
Synchronized(obj){
}//当线程执行到同步代码块时,必须获取obj对象的锁才能执行同步代码块,否则线程只能等待获得锁
线程创建
方法一:通常继承创建线程
public class TreadA extends Thread {
Public void run(){
}
}
Class Test{
Public static void main(String[] args){
ThreadA a = new ThreadA();
a.start();
}
}
方法二:通过实现Runnable接口创建多线程
Class ThreadB implements Runnable{
Public void (){
}
}
Class Test{
Public static void main(String[] args){
Thread t= new ThreadB();
Thread b = new Thread(t);
b.start();
}
}
15.JDBC
JDBC操作数据库的基本步骤及对应的代码
(1)装载数据库的驱动;Class.forName(“驱动器名称”)(
(2) 创建数据库的连接
Connection con = DriverManager.getConnect(“url”,”user”,“密码”);
(3)执行各种SQL语句
Statement sta = con.createStatement();
ResultSet rs = sta.executeQuery(sql);
sta.executeUpdate(sql);
(4)获取查询结果
While(rs.next()){
System.out.println(rs.getXXX(列号));
}
(5)关闭创建的各个对象
rs.close();
sta.close();
con.close();
掌握JDBC操作数据库的方法
DAO模式
DriverManager.getConnection()
Driver
Class.forName()
Connection
Statement
ResultSet