2018.02.04學(xué)習(xí)記錄
1、java的內(nèi)容介紹:
+ java編程可以分為三個方向:
1) java se(j2se)桌面開發(fā)
2) java ee (j2ee) web開發(fā)
3) java me(j2me) 手機(jī)開發(fā)
2、java中的類與對象
類:類是抽象的、概念的,代表一類事物比如人、電腦
對象:是具體的實(shí)際的,代表一個事物
類是對象的模板,對象是類的一個個實(shí)例、個體.
3、如何定義一個類:
一個全面的類定義比較復(fù)雜包含
package包名
class類名 extends 父類 implements
接口名{
成員變量:它是類的一個組成部分一般是基本數(shù)據(jù)類型,也可是引用類型(即使用了其他類)
構(gòu)造方法
成員方法
}
4、類的成員方法
public 返回數(shù)據(jù)類型 方法名(參數(shù)列表){
語句
}
1.參數(shù)列表:表示成員函數(shù)輸入
2.數(shù)據(jù)類型(返回類型):表示成員函數(shù)輸出
3.函數(shù)主體:表示為了實(shí)現(xiàn)某一功能代碼塊
5、java面向?qū)ο?--this代詞
java虛擬機(jī)給每個對象分配一個this,代表當(dāng)前對象。
注意事項(xiàng):this不能在類定義外部使用,只能在類定義的方法中使用。
6、類變量、類方法
1)類變量:類變量是該類所有對象共享的變量,任何一個該類的對象去訪問它時,取到的都是相同的值,同樣任何一個該類的對象去修改它時,修改的也是同一個變量。
2)如何定義類變量
定義語法:訪問修飾符static 數(shù)據(jù)類型
3)如何訪問類變量
類名.類變量名或者對象名.類變量名
static int i = 1;
static{
i++
system.out.println(i);
該靜態(tài)區(qū)域塊只能被執(zhí)行一次
}
4)什么是類方法,為什么有類方法?
類方法是屬于對象實(shí)例的,其形式如下:
訪問修飾符 static 數(shù)據(jù)返回類型 方法名(){}
注意:類方法中不能訪問非靜態(tài)變量
使用:類名 .類方法名或者對象名.類方法名
類方法屬于與類相關(guān)的,公共的方法
實(shí)例方法屬于每個對象個體的方法
類方法可以通過類名.類方法直接訪問
5)java對象的三大特征
封裝、繼承、多態(tài)。(抽象這一個特性可參考)
a、封裝:就是把抽象出來的數(shù)據(jù)和對數(shù)據(jù)的操作封裝在一起,數(shù)據(jù)被保護(hù)在內(nèi)部,程序的其他部分只有通過被授權(quán)的操作(成員方法)才能對數(shù)據(jù)進(jìn)行操作。
b、封裝--訪問控制修飾符
java 提供四種訪問控制修飾符號控制方法和變量的訪問權(quán)限:
. 公開級別:用public 修飾,對外公開
.受保護(hù)級別:用protected修飾,對子類和同一個包中的類公開。
.默認(rèn)級別:沒有修飾符號,向同一個包的類公開。
.私有級別: 用private修飾,只有類本身可以訪問,不對公開。

c、java 包有三大作用
.區(qū)分相同名字類
.當(dāng)類很多時,可以很好的管理類
.控制訪問范圍
d、打包命令
package com.river
f、包的命名規(guī)范
小寫字母 比如:com.sina.river
g、常用的包
一個包下,包含很多類,java中常用的包有:java.lang.包自動引入; java.util.工具包; java.net.網(wǎng)絡(luò)開發(fā)包;java.awt.窗口工具包。
6)繼承的注意事項(xiàng)
a、子類最多只能繼承一個父類(指直接繼承)
b、java所有類都是Object類的子類。
7)方法的重載注意事項(xiàng)
a、方法名相同
b、方法的參數(shù)類型,個數(shù),順序至少有一項(xiàng)不同
c、方法返回類型可以不同
d、方法的修飾符可以不同
###如果只是返回類型不同不能構(gòu)成重載#####
###如果只是方法的修飾符不同不能構(gòu)成重載#####
8)多態(tài)
多態(tài)就是指在一個引用(類型)在不同情況下的多種狀態(tài)即多態(tài)是指通過指向父類指針來調(diào)用在不同子類中實(shí)現(xiàn)的方法。
9)抽象類
抽象類解決之道:當(dāng)父類的一些方法不確定可以用abstract關(guān)鍵字來修飾方法【抽象方法】,用abstract來修飾的類是抽象類。
抽象類的注意事項(xiàng)
1、抽象類不能被實(shí)例化
2、抽象類不一定要包含abstract方法
3、抽象類一旦包含abstract方法則這個類必須聲明為abstract
4、抽象方法不能有主體
10)接口
a、接口:就是給出一些沒有內(nèi)容方法封裝到一起,到某個類要使用時候根據(jù)具體情況把這些方法寫出來,語法:
//定義接口
interface Usb{
//聲明兩個方法
public void start();
public void stop();
}
class 類名 implements 接口{
方法;
變量
}
小結(jié):接口是更加抽象的抽象類,抽象類里的方法可以有有方法體,接口里的所有方法都沒有方法體。接口體現(xiàn)了程序設(shè)計的多態(tài)和高內(nèi)聚低耦合的設(shè)計思想
當(dāng)一個類實(shí)現(xiàn)接口時候要求該類把接口所有方法都是實(shí)現(xiàn)
問題:請舉例說明接口怎樣體現(xiàn)多態(tài)?
interface Usb{
//聲明兩個方法
public void start();
public void stop();
}
//定義類實(shí)現(xiàn)了USB接口
//
class Camera implements Usb{
public void start() {
System.out.println("Camera start 開始");
}
public void stop() {
System.out.println("Camera stop 開始");
}
}
class Phone implements Usb{
public void start() {
System.out.println(" Usbstart 開始");
}
public void stop() {
System.out.println("Usb stop 開始");
}
}
class Computer {
public void useUseb(Usb usb) {
usb.start();
usb.stop();
}
}
public class jiekou {
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer computer = new Computer();
//只要改類實(shí)現(xiàn)了接口就可以這樣用了
Camera camera = new Camera();
computer.useUseb(camera);
Phone phone = new Phone();
computer.useUseb(phone);
}
}
b、接口注意事項(xiàng)
1、接口不能被實(shí)例化
2、接口中所有的方法不能有主體
3、一個類可以實(shí)現(xiàn)多個接口
4、接口中可以有變量【但變量不能用private 和 protected修飾】:
a、接口中變量,本質(zhì)上都是static的而且是final類型的(不管是否加static修飾)
b、在java開發(fā)中,我們經(jīng)常把常用的變量定義在接口中,作為全局變量使用。訪問形式:接口名.變量名。
5、一個接口不能繼承其他類,但是可以繼承別的接口.
11)綁定
綁定:將一個方法調(diào)用同這個方法所屬的主體(也就是對象或類)關(guān)聯(lián)起來叫做綁定 可以分為前期綁定和后期綁定
1、前端綁定:在程序運(yùn)行之前進(jìn)行綁定,由編譯器和連接程序?qū)崿F(xiàn),又稱靜態(tài)綁定比如static方法和final方法,注意這里也包括private方法因?yàn)樗请[式final的
2、后期綁定:在運(yùn)行時根據(jù)對象的類型進(jìn)行綁定,由方法調(diào)用機(jī)制實(shí)現(xiàn)又稱動態(tài)綁定
12)final
final 可以修飾變量或者方法
在某些情況下,程序員可能有以下需求:
1、當(dāng)不希望父類的某個方法被子類覆蓋(voerride),可以用final修飾。
2、當(dāng)不希望類的某個變量的值被修改可以用final修飾;如果一個變量用final來修飾,該變量必須賦初始值
3、當(dāng)不希望類被繼承時候可以用final修飾。
13)InputStreamReader輸入控制
14)數(shù)組排序:
a、插入式排序:
插入式排序的基本思想是:
把n個等待排序的元素看成一個有序表和一個無序表。
開始時有序表中只包含一個元素。
無序表中包含有n-1個元素;
排序過程中每次從無序表中取出第一個元素;
把它的排序碼依次與有序表元素的排序進(jìn)行比較;
將它插入到有序表中的適當(dāng)位置,使之成為新的有序表。
b、快速排序法
通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分
其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,
然后在按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序;
整個排序過程中可以遞歸進(jìn)行,以此到達(dá)整個數(shù)據(jù)變成有序序列
15)、集合類主要分為
List結(jié)構(gòu)的集合類:ArraryList類,LinkedList類,Vector類,Stack類;
Map結(jié)構(gòu)的集合類:HashMap類,Hashtable類;
Set結(jié)構(gòu)的集合類:HashSet類,TreeSet類;
Queue結(jié)構(gòu)的集合:Queue接口。
16)java中 字符串比較 “==”是比較是內(nèi)存中地址所以判斷字符串內(nèi)容相等是str1.equals(str2)
17)ArrayList 和Vector 的區(qū)別
ArrayList 與Vector 都是java的集合類,都可以用來存放java對象,它們也有區(qū)別:
1、同步性:
Vector 是同步的,這個類中一些方法保證Vector中的對象是線程安全的;
ArrayList 是異步的因此ArrayList中的對象并不是線程安全的。
故此同步的要求會影響執(zhí)行的效率,若不需要線程安全的集合可選ArrayList
2、數(shù)據(jù)增長:
從內(nèi)部實(shí)現(xiàn)機(jī)制來說ArrayList和Vector都是使用數(shù)組(Array)來控制集合中的對象。當(dāng)向這兩種類型中增加元素時候,如果元素數(shù)目超出內(nèi)部數(shù)組目前的長度它們都需要擴(kuò)展內(nèi)部數(shù)組的長度。
Vector缺省情況下自動增長原來一倍數(shù)組長度;
ArrayList是原來的50%,所以最后獲得的這個集合所占的空間總是比實(shí)際所需要的大,故在集合中保存大量數(shù)據(jù)使用Vector有優(yōu)勢。
18)HashMap與Hashtable的區(qū)別
1、歷史原因:
Hashtable是基于陳舊的Dictionary類的,HashMap是java1.2引進(jìn)Map接口的一個實(shí)現(xiàn)。
2、同步性:
HashTable是同步的,這個類中一些方法保證了HashTable中對象的線程安全;HashMap則是異步的。
3、值:HashMap可以讓你將控制座位一個表的條目的key和value,但HashTable是不能放入空值null的
19)java異常分類
1、檢查性異常:java.lang.Exception
2、運(yùn)行期異常:java.lang.RuntimeException
3、錯誤:java.lang.Error
頂層是java.lang.Throwable類,檢查性異常、運(yùn)行期異常、錯誤都是這個類的子孫類。java.lang.Exception和java.lang.Error都繼承自java.lang.Throwable。而java.lang.RuntimeException繼承自java.lang.Exception。
20)java中IO流對象結(jié)合一些對象實(shí)現(xiàn)數(shù)據(jù)儲存
1、Properties 表示一個持久的屬性集。它可以保存在流中或者從流中加載。屬性列表中每個鍵及其對應(yīng)值都是一個字符串。
特點(diǎn):
a、它是hashtable的子類,map集合中的方法都可以用。
b、該集合沒有泛類型。鍵值都是字符串。
c、它是一個可以持久化的屬性。鍵值可以存儲到集合中也可以存儲到持久化設(shè)備(硬盤、U盤、光盤)上。鍵值的來源也可以是持久化的設(shè)備
注意:對象序列化時候它的靜態(tài)變量不能被序列化。
對象的成員變量被 關(guān)鍵字 transient 修飾時,該成員變量不能被序列化.
21)java多線程
開啟多線程有兩種方式:
1、繼承Thread類,重寫run方法
public class subThread extends Thread {
public void run() {
for(int i = 0; i < 1000; i++){
System.out.println("subThread..... "+ i);
}
}
}
調(diào)用
subThread subThread = new subThread();
subThread.start();
2、實(shí)現(xiàn)Runable接口 重寫run方法
public class subRunable implements Runnable {
@Override
public void run(){
for(int i = 0 ; i < 1000; i++){
System.out.println("sunRunable...."+i);
}
}
}
調(diào)用
subRunable subRunable = new subRunable();
new Thread(subRunable).start();
21)java多線程的線程安全
多線程同時操作一個共享數(shù)據(jù)時候,往往會出現(xiàn)安全問題。
解決線程安全問題:線程同步技術(shù)<synchronized(任意對象){線程要操作的共享數(shù)據(jù)}>;jdk5以后用Lock替換了synchronized
22)線程通信
多個線程在處理痛一個資源,但是處理的動作(線程任務(wù))卻不相同,通過一定的手段使各個線程能有效的利用資源,而這種手段即--等待喚醒機(jī)制。
等待喚醒機(jī)制所涉及方法有以下幾種:
1、wait():等待,將正在執(zhí)行的線程釋放其執(zhí)行資格和執(zhí)行權(quán),并存儲到線程池中。
2、notify():喚醒線程池中被wait()的線程,一次喚醒一個而且是任意的。
3、notifyAll():喚醒全部即-----可以將線程池中所有wait() 的線程都喚醒
23)java之?dāng)?shù)據(jù)庫
1、mysql 使用6.0之前的版本是免費(fèi)的
mac 電腦安裝好mysql后需要修改密碼
若出現(xiàn)Mac上解決Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'這樣情況解決如下:
解決步驟:
1、首先在設(shè)置中關(guān)閉mysql服務(wù);
2、然后打開終端,輸入:sudo mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
再輸入:sudo mysql -u root mysql
進(jìn)入mysql>
執(zhí)行以下命令:update user set password_expired = "Y" where user="root";
再輸入:flush privileges;這一步很重要
然后:quit
3、進(jìn)行登陸
輸入:mysql -uroot -p
會提示你輸入密碼,這個密碼就是安裝mysql時出現(xiàn)的。
4、登陸成功之后可以修改密碼:
set password for root@localhost = password('123456');
之后登陸就用123456這個密碼了。
#####################################################
在Mac OS X啟動和停止MySQL服務(wù)的命令
啟動MySQL服務(wù)
sudo /usr/local/mysql/support-files/mysql.server start
停止MySQL服務(wù)
sudo /usr/local/mysql/support-files/mysql.server stop
重啟MySQL服務(wù)
sudo /usr/local/mysql/support-files/mysql.server restart
2、JDBC 鏈接數(shù)據(jù)庫
JDBC(Java Data Base Connectivity)是一種用于執(zhí)行SQL語句的Java API可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成,是Java訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范。
JDBC 需要連接驅(qū)動,驅(qū)動是兩個設(shè)備要進(jìn)行通信,滿足一定通信數(shù)據(jù)格式,數(shù)據(jù)格式由設(shè)備提供商規(guī)定,設(shè)備提供商唄設(shè)備提供驅(qū)動軟件,通過軟件可以與該設(shè)備進(jìn)行通信。
3、JDBC開發(fā)步驟
1、注冊驅(qū)動(告訴JVM虛擬機(jī)使用的是哪個一個數(shù)據(jù)庫)
----------------------------------------
try {
Driver driver = new Driver();
DriverManager.registerDriver(driver);
} catch (SQLException e) {
e.printStackTrace();
}//看源碼造成了注冊了兩次驅(qū)動
所以注冊驅(qū)動最好的方式就是使用反射機(jī)制將驅(qū)動類加入到內(nèi)存中。
推薦使用:
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}去注冊驅(qū)動。
----------------------------------------
2、獲得鏈接(使用JDBC類,完成對MySql數(shù)據(jù)庫鏈接)
獲得數(shù)據(jù)庫鏈接DriverMannager類中靜態(tài)方法:static Connection getConnection(String url,String user,String password)
返回值是Connection接口的實(shí)現(xiàn)類,在mysql驅(qū)動程序中的實(shí)現(xiàn)類。注意:url的鏈接方式:jdbc:mysql://連接主機(jī)Ip: 端口號//數(shù)據(jù)庫的名字。例如:String url = "jdbc:mysql//localhost:3306//mydatabase"
3、活動語句執(zhí)行平臺(通過連接對象獲取對Sql語句的執(zhí)行對象)
4、執(zhí)行sql語句(使用執(zhí)行對象,向數(shù)據(jù)庫執(zhí)行Sql語句;獲取到數(shù)據(jù)庫的執(zhí)行后的結(jié)果)
5、處理結(jié)果
6、釋放資源
4、JDBC 使用配置文件properties 配置文件來實(shí)現(xiàn)數(shù)據(jù)庫的鏈接
通常情況下以下要求:
1、文件位置:任意,建議src下;
2、文件名稱:任意,擴(kuò)展名為properties;
3、文件內(nèi)容:一行一組數(shù)據(jù),格式是“key=value”
a)key命名自定義,如果是多個單車習(xí)慣使用點(diǎn)分割。例如jdbc.driver;
b) value值不支持中文,如果需要使用非英文字符,將進(jìn)行unicode轉(zhuǎn)換
5、使用一個工具DButils
這個類中使用QueryRunner實(shí)現(xiàn)查詢操作
1、query(Connection conn,String sql,ResultSetHander<T>,Objcet... params)用來完成數(shù)據(jù)庫的查詢操作
ResultSetHander 結(jié)果集的處理類
1、ArrayHandler 將結(jié)果集中的第一條記錄封裝到一個 Objcet[]數(shù)組中,數(shù)組中的每一個元素就是這條記錄中的每一條字段值。
2、ArrayListHandler 將結(jié)果集中的每一條記錄都封裝到一個Object[]數(shù)組中,將這些數(shù)組在封裝到List集合中。
3、BeanHandler 將結(jié)果集中第一條記錄封裝到一個指定javaBean中。
4、BeanListHandler 將結(jié)果集中每一條記錄封裝到指定JavaBean中,將這些javaBean再封裝到LIst集合中。
5、ColumnListHandler 將結(jié)果集中指定的列的字段,封裝到一個LIst集合中。
6、ScalarHandler 它是用于單數(shù)據(jù),例如 select count(*)from 表操作
24)網(wǎng)絡(luò)編程
1、UDP協(xié)議
a、Java實(shí)現(xiàn)UDP協(xié)議的發(fā)送端
實(shí)現(xiàn)封裝數(shù)據(jù)的類:java.net.DatagramPacker 將數(shù)據(jù)包裝起來
實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)念悾簀ava.net.DatagramSocket 將數(shù)據(jù)發(fā)送出去
實(shí)現(xiàn)步驟:
1. 創(chuàng)建DatagramPacker對象,封裝數(shù)據(jù),接收端的地址和端口
2.創(chuàng)建DatagramSocket
3. 調(diào)用DatagramSocket 類方法send,發(fā)送數(shù)據(jù)包
4.關(guān)閉資源
b、java實(shí)現(xiàn)UDP協(xié)議的接收端
實(shí)現(xiàn)封裝數(shù)據(jù)包java.net.DatagramPacker 將數(shù)據(jù)接收
實(shí)現(xiàn)輸出傳輸 java.net.DatagramSocker 接收數(shù)據(jù)包
實(shí)現(xiàn)步驟:
1、創(chuàng)建DatagramSocker對象,綁定端口號,端口號要跟發(fā)送端設(shè)置的端口號一致。
2、創(chuàng)建字節(jié)數(shù)組,接收發(fā)來的數(shù)據(jù)。
3、創(chuàng)建數(shù)據(jù)包對象DatagramPacker
4、調(diào)用DatagramSocket對象方法 receive(DatagramPacker dp)接收數(shù)據(jù),數(shù)據(jù)放在數(shù)據(jù)包中
5、拆包:
發(fā)送的IP地址
接收到的字節(jié)個數(shù)
發(fā)送端的端口號
6、關(guān)閉資源
2、TCP協(xié)議
TCP通信是嚴(yán)格區(qū)分客服端和服務(wù)器端的,在通信時,必須先由客服端去鏈接服務(wù)器才能實(shí)現(xiàn)通信。服務(wù)器端不可以主動連接客戶端,并且服務(wù)器程序需要事先啟動,等待客服端連接。
在java的SDK中提供兩個類用于實(shí)現(xiàn)TCP程序,一個是SeverSocket類用于服務(wù)器端,一個Socket類用于客戶端。
通信時,首先創(chuàng)建代表服務(wù)器端的ServerSocket對象,該對象相當(dāng)于啟動一個服務(wù),并等待客戶端連接。然后客戶端的Scoket對象向服務(wù)器端發(fā)出連接請求,服務(wù)器端響應(yīng)請求,兩者建立連接開始通信。
25)java反射機(jī)制
1、類加載
當(dāng)程序要使用某一個類時候,如果該類還沒被加載到內(nèi)存中,則系統(tǒng)會通過加載、連接、初始化三步來實(shí)現(xiàn)對這個類初始化。
1、加載:就是指將class文件讀入到內(nèi)存并為之創(chuàng)建一個Class對象。任何類被使用時系統(tǒng)都會簡歷一個Class對象。
2、連接:驗(yàn)證是否正確的內(nèi)部結(jié)構(gòu),并和其他類協(xié)調(diào)一致準(zhǔn)備負(fù)責(zé)為類的靜態(tài)成員分配內(nèi)存,并設(shè)置默認(rèn)初始化值解析將類的二進(jìn)制數(shù)據(jù)中符號引用替換為直接引用
3、初始化:初始化步驟。