JAVA基础知识总结
1.面向对象分析、设计、编程。面向对象编程特点:抽象(提取我们需要的东西)、继承、封装、多态。面向对象的思想更加接近我
们现实生活中的处理问题的思路
2.类、对象、成员变量、局部变量(方法内定义)。成员变量分为常量(final修饰的,声明时初始化,不可改)、实例变量、类变量
(用static修饰)类变量是在类的对象被创建之前就初始化了,加载字节码的时候初始化,所以在实例化对象后,分配内存的时
候,类变量是不分配的,但会保存一个对类变量的引用,类变量是放在全局代码区中。变量作用域:成员变量在整个类中,局部变
量(在局部变量创建开始到本层第一个”}”结束)
3.如果一个类中,多个方法使用同名的局部变量,就可以把此局部变量声明为成员变量;如果一个类中,多个方法中使用几行相同
的代码,就可以把这几行代码抽象出来,形成一个新的方法;在多个类中,如果使用了几个相同的成员变量或成员方法,就可以把
这几个成员变量和成员方法抽象为一个类;定义方法时的局部变量可以不初始化,在调用的时候要初始化
4.Java中传参方式,只有一种,是传值方式,又可以分为基本数据类型的传值,形参的改变时不会影响实参的。一种是引用数据类
型的传值,传递的是地址,所以形参与实参是指向同一内存空间,形参改变,实参也会改变
5.方法重载:方法名称相同,参数不同,表现在参数个数不同、类型不同、顺序不同
6.构造方法:与类名必同,没有返回值,必省略void。构造方法的创建,作用是生成对象并对对象初始化
7.方法分类:实例方法,通过对象访问,可以调用实例变量和类变量,实例方法可以调用实例方法和类方法。类方法,static修
饰,可以通过类名和对象来访问,但是只能调用类变量,类方法为类所有实例共享,只能调用类方法。This调用当前类的成员变
量,this(参数)调用当前类的构造方法,必须放在构造方法的第一行,this只能在构造方法和实例方法中使用,针对其调用成员方
法的情况,如果是this()只能用在构造方法中调用构造方法,且放在构造方法的第一行。要想知道详细的程序执行过程要使用debug
来操作。New操作的时候会去调用构造方法,在执行构造方法之前先去初始化成员变量。
8.修饰符有四个:public、protected、默认、private
在当前类体内,此类的对象可以访问此对象中所有的成员变量和成员方法
在同一个包中,此类的对象只能访问此对象中非私有的成员变量和成员方法
在不同的包中,此类的对象只能访问此对象中公有权限的成员变量和成员方法
在同一个包中,子类可以继承父类中非私有的成员变量和成员方法
在不同的包中,子类只能继承public和protected修饰的成员变量和方法
对类来讲修饰符只有两个,public和默认,不包括内部类
9.基本数据类型及其对应的封装类:使用这些封装类是的不同数据类型相互转为操作方便
byte short int long float double char boolean
java.lang.Byte java.lang.Short java.lang.Integer java.lang.Long
java.lang.Charactor java.lang. java.lang.Byte
因为提供封装类,类中有成员方法,需要查阅API,其中会提供很多转换的成员方法
10.继承的优点:减少代码冗余、易于维护、方便扩展,extends 单继承。同一个包中,子类可以继承父类中非私有的成员变量和方
法不同包中,子类只能继承父类中public和protected修饰的成员变量和方法。方法的重写发生在子类和父类之间,子类中重写的方
法的权限不可以比父类中定义的权限低。Super指当前类的直接父类的对象,super.成员变量 super.成员方法的方式调用父类被重
写的方法。重载、重写是多态的一种表现方式,体现可扩展性,属性的重写道理是一样的。在调用成员变量和成员方法的时候,默
认会在其前面加上this关键字。
11.子类在实例化的时候会先去实例化父类,没有父类就没有子类的存在。父类和子类的初始化顺序
加载字节码的时候,先初始化父类的静态成员变量->子类的静态成员变量->到main方法中,实例化子类的对象时->先初始化父类中
的实例变量->执行父类构造函数->实例化子类中的实例变量->在执行子类的构造方法。Super()当前类的直接父类的构造函数,在子
类构造方法中使用,且必须是在第一行。
12.向上转型可以掉用继承父类的方法,可以调用父类中被子类重写的方法,且只能调用父类中定义的成员变量和方法,上转型丢失
了子类自己定义的成员变量和方法,上转型对象点成员变量,则成员变量肯定是父类中的成员变量。上转型对象调用的方法中所操
作的成员变量是该方法所在类的成员变量,可以将上转型对象强制转换为子类对象,此时子类对象拥有其所有的成员变量和方法,
不可以直接将父类对象强制赋值给子类引用,在下转型之前必须要先上转型操作
13.Final修饰的类不可被继承,方法不可重写,但是可以重载 变量定义时必须初始化,之后不可修改。Finalize(),用户回收当前
对象,回收条件是当前对应没有引用了。Abstract类,包含了abstract方法的类,只声明不实现,必须被继承,注意抽象类也可以
没有抽象方法的。接口:interface修饰,所有方法是抽象的public abstract,所有成员变量是public static final,接口回调
接口 接口引用 = new 接口实现类();接口的权限修饰符为public或默认类型。接口与接口之间是可以多重继承的,类可以实现多个
接口,接口并不是一个类,但是将成员变量放到接口中并不是好的方式
14.异常:中断程序正常执行的任何条件,
程序出错的时间:编译时出错 -----------一般语法错误
运行时出错---------异常
异常的分类:error 运行时,发生的错误,但此错误不可处理,例如 机器故障
Exception 运行时,发生的错误,错误可处理 例如 int i = 2/0
我们通常说的异常是指exception,所有的异常类的父类是java.lang.Throwable,但是该类不能直接使用。当在Eclipse中保存java
文件的时候,就会编译成字节码,错误会提示,所以不会出现编译时异常,我们只讨论运行时异常
Throwable-------error、exception
其中exception的子类runtimeexception以及runtimeexception的子类是不需要我们处理的,当然也可以处理的但是没有必要,其他
异常都需要处理
异常处理:throws try{}catch(){}finally{}
采用throws处理异常,一旦出错,程序立刻结束执行,被动处理异常向上抛
Try catch主动处理异常,一旦出错,程序可以继续执行,一般情况会在catch语句块中使用throw 异常对象,继续想上抛异常,程
序也不会在想下运行了
自定义异常:创建一个类,继承已有异常类,重写方法,创建此类的构造方法,让其调用父类的构造方法,重写getMessage()
printStackTrace() ,toString() ,这三个方法是相互调用的,一般是不需要重写的,
printStackTrace{toString();/// } toString(){ this.getClass().getName()+getMessage() ;}如果要重写只要重写一个就可
以了,一般不要重写,没有必要
15.java集合collection接口 list set 接口 map
接口list的实现类arraylist,接口继承了接口collection,arraylist间接的实现了collection接口,其是一个容器,内部可以放
各种类型的数据,但是要求是对象。
List list = new ArrayList();
List.add(“object类型的对象”); list.get(“0开始下标”)取出的是object类型的对象,要向下转型,因为在存的过程中已经向
上转型了,所以这里向下转型是没有问题的;
集合迭代的迭代器:Iterator hasNext() ,next() remove().从迭代器指向的集合中移除迭代器返回的最后一个元素
List的三个常用的实现类arraylist LinkedList vector
Arraylist:元素的存储的顺序是连续的 LinkedList:元素存储地址是不连续的 vector:与Arraylist基本一致,但是vector是线
程安全的
Set接口,就像数学概念中的集合,其中的对象是无序的,且不能重复,list是有序可重复的,实现类hashset,只要两个对象的值
(equals())相等,就不会重复存储该对象,通过String来测试。Set接口的另个实现类是treeSet,其中对象是升序排列的,hashset
中可以存储任意类型的对象,treeset只能存储可以和当前对象进行比较的对象
Map接口,map不像list set(下标集合自动生成的) 下标是自己手动指定的,我们称为key ,对应的值是value,一个key对应一个
value形成的键值对构成一个entry,map是有多个entry构成的。其实现类是hashmap
Map<String,String> map = new HashMap();
map.put(1,”hello”);
map.get(1);
通过keySet获取到map中所有key的映射:
TreeSet keyset = new TreeSet(map.keySet());//创建对象的方式,第一:看是否通过其他的方法返回所需要的对象,第二:使用
构造方法来获取对象,第三:查看相关API
获取keyset的迭代器,拿到key,根据key取到value
Map的另一个实现类似TreeMap, map中存放的是对象以键值对的形式存储。Hashmap和treemap都可以存储null建和null值。
hashtable不可以,Hashmap和hashtable存储对象无序,treemap是按键升序排列,注意如果在存储时出现键值重复的情况,会用新
的value替换掉之前的value
16.JavaI/O流:数据输入输出的管道
按流的方向:
输入输出流是相对概念不是绝对的概念 inputstream(abstract),fileinputstream,reader(abstract) filereader(extends
reader) outputstream ,fileoutputstream, writer(abstract) filewriter(extends writer)
按输入输出数据块的大小:
字节流:一次读一个字节的数据,在输入输出图像数据的时候,就必须要字节流了, inputstream,fileinputstream
outputstream ,fileoutputstream,
字符流:一次读一个字符数据,一个字符占用两个字节,要读的快,如果是汉字,一个汉字占用两个字节,如果按字节流输入输
出,就会将汉字拆分成两个字节,造成乱码了, reader(abstract) filereader(extends reader) writer(abstract) filewriter
(extends writer)
Iuputstream in = new FileInputStream(“c:\\test”);
Ouputstream out = new FileOnputStream(“c:\\test1”,true);如果文件中有内容,则采用追加的方式加入数据,为了控制和源
来数据之间的换行,在输出信息后,在多输出一个”/r/n”,表示输出数据后,光标自动换行
把一个文件中的内容拷贝到另一个文件中,涉及到两个流,注意,后打开的流先关闭
注意在使用功能流,带缓冲区的输出流的时候,会将数据先放到缓冲区的,如果缓冲区满了,会写到文件中,如果没有满,需要调
用的flush方法,将缓冲区的数据写到文件中。
按流的功能:
节点流:以上都是节点流
功能流:bufferedinputstream bufferedoutputstream bufferedreader bufferedwriter
在使用功能的流的前提是先打开了节点流,依赖于节点流
Bufferedreader :readline()一次读一行,BufferedWriter:newLine()写入换行,调用一次,在
写到文件的时候就会换行,通过判断readline()!=null,可以统计文件行数
17.File操作:
可以获取到file对象代表文件的绝对路径
File.listFiles()
File.getAbsolutePath();
File.isFile()
递归的列出所有的目录和文件
Public void listDir(String url){
File f= new File(url);
If(!f.exist()){
Return;}
If(file.isDirectory(){
File[] fs = file.listFiles();
For(int i=0 ; i <fs.length ; I ++){this.lsitDir(fs.getAbsolutePath());}}else{
If(file.getAbsolutePath() .endwith(“.java”){System.out.println((file.getAbsolutePath())})//控制输出java后缀的文件
})
}
return;结束方法体
18.线程的创建方式:
继承Thread 实现Runnable接口
一般类和线程类的区别:
Os:多个进程以时间轮询的方式在运行,一个进程中可以有多个线程,在同一个时间只能有一个线程在运行。
线程类的创建:定义一个实现runnable接口类,实现run方法,然后启动线程类 Thread t = new Thread(实现runnable接口的对
象) t.start();
线程类的创建方式2:创建一个继承Thread的类,调用start()方法,
改变程序的执行路线,相当于有多个应用程序在执行,main方法也是一个线程在执行,
线程是抢占式的,有各种运行状态,
Thread.sleep(1000);//单位是毫秒,控制线程状态
Thread.yield();//暂停当前正在执行的线程对象,执行其他的线程
19.使用java程序连接oracle数据库:
注意:Oracle安装好后,其中带有jdk,会自动将其bin目录加到环境变量path的最前端,这样的覆盖了之前配置的jdk,所以需要将
之前配置的jdk放到path的最前端。
String url = “Jdbc:oracle:thin:@localhost:1521:数据库名称”;
Class.forname(“oracle.jdbc.driver.OracleDriver”)//在jar包中取找,对应的包名加类名
Connection conn = DriverManager.getConnection(url,username,password);
Blob和clob类型数据的读取
在oracle中
ps.setBlob(1,Blob,getEmpryBlob());
ps.setClob(1,Clob,getEmpryClob());
先将blob和clob对象设置为空
查询空对象:
Blob b = (Blob)rs.getBlob(“image”)
Clob c = (Clob)rs.getClob(“context”)
在查询时防止其他人修改,要加乐观锁
InputStream in = new FileInoutStrean(“xx.jpg”)//将文件拷贝到项目的跟目录下,可以直接访问到
OutputStream out = b.getBinary OutputStream();
Byte [] t = new byte[1024];
While(){}
Out.flush();
Out.close();
注意使用hibernate就避免这种问题