java就_GitHub - IammyselfYBX/This_is_how_Java_should_be_learned: 《Java就应该这样学》
Java就該這么學
說明
這里使用 centos7 的openjdk,不是Oracle的JDK
yum search java|grep jdk
yum install java-1.8.0-openjdk
#set Java environment
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64
export CALSSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
第一部分 認識Java程序
1.java純粹的面向對象語言,程序是由一個一個類組成的
java不能直接寫主函數,因為基于面向對象。
java中類名大寫
MyTest.java
通俗理解函數調用:
你吃早飯,喊一聲我要吃早飯,早飯就來了,你不用知道早飯是怎么做的,只要調用一下就可以了。
2.類名與文件名相同
源文件中有類名值 public 的話,文件名與該類同名。
3.java語言不能直接畫在窗體上,必須是畫布上才行,好在存在畫布類
Frame fr = new Frame();
Paint p = new Paint();
w.add(p);
4.80%思考任務,20%思考知識
5.Math.random() 產生的是0-1之間的數字
6.傳數值的時候,需要考慮是否需要強制類型轉換
7.不要寫成——T1.6
int x[] = new int[300] ;
int y[] = new int[300] ;
//類里面不要直接寫語句,應該放到方法里面
for(int i = 0 ; i < 300 ; i ++){
x[i] = (int)(Math.random()*1024) ;
y[i] = (int)(Math.random()*768) ;
}
正確關系
所以應該寫成
class MyPanel{
int x[] = new int[300] ;
int y[] = new int[300] ;
public MyPanel(){
for(int i = 0 ; i < 300 ; i ++){
x[i] = (int)(Math.random()*1024) ;
y[i] = (int)(Math.random()*768) ;
}
}
}
8.Ctrl+Shift+Alt+R——30s
gsettings set org.gnome.settings-daemon.plugins.media-keys max-screencast-length 60
以秒為單位將’60’值替換為您想要的長度,例如300分鐘5分鐘,600分鐘10分鐘等等。
9.一般java API規律
得到信息是 get 開頭
eg:getKeyCode()
改變信息是 set 開頭
eg:f.setSize(300, 400);
11.將字符轉換成字符串方法
將字符c變成對象 new Character(c)
然后調用 toString() 方法
new Character(c[i]).toString()
12.線程與進程的區別
線程是通過利用CPU的輪轉,讓程序中不同的代碼段同時執行的機制。
進程:獨立運行的程序,一個運行的記事本和瀏覽器是兩個進程,啟動兩個記事本也是兩個進程。
線程:在一個進程里面能夠共同運行的代碼。
13.接口需要實現,任何類都可以實現接口 implements Runnable
class MyPanel extends Panel implements Runnable{//實現接口Runnable
public void run(){//計算機在合適的時間片就輪轉到 run() 執行
}
}
public static void main(String args[]){
MyPanel mp = new MyPanel();
Thread t = new Thread(mp);//讓線程 t 與 mp 關聯。
t.start();//啟動線程,調用內部的 run() 方法。
}
14.實現鍵盤監控接口
import java.awt.event;
class MyPanel extneds Panel implements KeyListener{
public void keyPressed(KeyEvent e){
if(e.getKeyCode() == 37){
x--;
}
repaint();
}
public void keyReleased(KeyEvent arg0){
}
public void keyTyped(KeyEvent arg0){
}
}
public static void main(String args[]){
Frame f = new Frame();
MyPanel mp = new MyPanel();
f.addKeyListener(mp);
mp.addKeyListener(mp);
}
15.常見ASCII碼
空格——32
0~9——48~57
A——65
a——97
第二部分 開始一個項目
一、頁面的3種布局
1.BorderLayout——邊框布局管理器
NORTH——北
SOUTH——南
WEST——西
EAST——東
CENTER——中間
2.GridLayout
事先算好行列的個數,從左到右,從上到下
3.FlowLayout
往中間排,一排不夠換下一排
二、常用組件
Java采用布局的方式,而不是根據坐標
下面的所有組件最終都要放在 JFrame 上面。
1.JPanel——畫布
JPanel可以放在JFrame上面,也可以放在JPanel上面
2.JLabel——文本提示
3.JTextField——單行文本輸入
4.JPasswordField——密碼
5.JComboBox——下拉框
6.JTextArea——多行文本輸入
7.JScrollpane——滾動條
注冊事件
參數應該是實現接口的類的對象
QQLogin e = new QQLogin();
btnLogin.addActionListener(e);
btnReg.addActionListener(e);
btnCancel.addActionListener(e);
僅事件相應分不清到底是哪一個
細化具體是什么相應
想看是不是一個對象加個 . 實驗一下。
equal比較內容
== 比較是否同一個
== 實例
使用 new 得到的是地址, 所以是 false
equal實例
哈希碼——hashCode()
構造方法一般用于初始化
public class QQLogin extends JFrame{
QQLogin(){
//w.setSize(300, 400);
this.setSize(300, 400);
}
}
開始QQ項目
Java分為 客戶端 與 服務器端 編程,這兩者被互聯網隔開,只能依賴簡單的消息傳遞讓兩者一起工作。所以,不一定使用同一種技術開發兩端,前端使用HTML(其實是HTML, CSS, JavaScript的統稱), 后端使用Java。
早期java也負責前端有一個組件——Applet,他可以嵌入到HTML里面,但后來Flash成功以后,Applet就沒落了。
如果 getActionCommand 的內容和聲明的時候不一致就會出錯
三、面向對象
1.super 與 this
super 與 this 一樣都是引用
super 是指向父類的引用
this 是指向當前的引用
2.繼承注意事項
A c = new B();
這句話之后,結果是父類的成員變量,子類的方法。
3.面向對象思想來編寫代碼
假定用戶名是 aaa, 密碼是123,登入響應
4.面向對象中不應該引用另一個 class 中的成員變量,而應該是成員方法
將聊天信息發送到服務器在 test1引用變量中引用變量不符合面向對象的思想
//QQMain.java
Socket s
//QQLogin.java
QQMain w = new QQMain();
w.s = s;//錯誤用法
w.setVisible(true);
正確用法
//QQMain
private Socket s;
public void setSocket(Socket value){
s = value;
}
//QQLogin.java
QQMian w = new QQMain();
w.setSocket(s);
w.setVisible(true);
四、I/O流
變量——new是對內存的操作
語句——是對CPU的操作
語句是對CPU的操作,程序是在內存里面,操作內存比較方便,但是操作外設(鍵盤,硬盤,打印機,網絡)就比較麻煩,程序想與他們打交道,需要用到I/O流
到內存——入、到內存外面——出
對I/O流的操作一般3步
1.定位
對于硬盤:到那個硬盤,那個目錄大那個文件
對于網絡:網絡地址的那個端口
2.建立管道
就是數據源的方向
3.操作管道
所有離開內存的操作都是存在隱患的,需要try{} ... catch(){}
文件不存在
硬盤損壞
網絡不通
數據庫服務器沒啟動
import java.io.*;
public class MyReadFile {
public static void main(String args[]){
try{
//Step1:定位數據源
File f = new File("./test.txt");//使用 File類 定位文件
//Step2:建立管道
FileInputStream fis = new FileInputStream(f);//用 FileinputEtream類 確定方向是到內存里面。
//Step3:操作管道
int length = fis.available() ;//操作管道,管道對象是——fis。
for (int i = 0; i < length ; i ++ ) {
System.out.print((char)fis.read());//.read()方法是操作 管道fis 讀一個字符。
}
}catch(Exception e){}
}
}
如果有時間可以看看 java 家目錄里面的 src.zip 里面的java代碼,都是開源人寫的不錯的代碼
方法——動作,變量——承擔動作的對象
eg:洗(衣服)???#動作需要參入參數
復制大文件
首先對于 read 方法一共有3中方式重載
對于 write 方法也有3中方式重載
分析如果采用 方式1 的話需要復制21103945 次,浪費資源,時間
缺點就是因為不是整除,所以復制的結果會更大一些,
建議數組長度采用2的n次方
先用方式2大塊復制減少時間,在用方式1 處理剩余的
字節流操作FileInputStream、FileOutputStream不能直接操作 Unicode 字符,不符合 Java “一次編寫,處處運行”
為了解決這個問題,需要提出——字符流
字符流FileReader、BufferedReader、FileWriter、PrintWriter
需要 flush、close
// 字符流適應不同的操作系統
import java.io.*;
public class MyReadFile {
public static void main(String args[]){
try{
File inFile = new File("C:/work/test.txt") ;
File outFile = new File("c:/work/test1.txt") ;
FileReader fr = new FileReader(inFile) ;
BufferedReader br = new BufferedReader(fr) ;
FileWriter fw = new FileWriter(outFile) ;
PrintWriter pw = new PrintWriter(fw) ;
while(br.ready()){
pw.println(br.readLine()) ;
}
pw.close();//close()會自動調用 flush() 把緩沖區的內容寫入文件。
}catch(Exception e){}
}
}
建立網絡通信
協議——我寫的是漢語、你能看懂我寫的是什么,漢語就是協議,大家都認同的規則。
防止堵塞
1.令牌環
2.以太網
以太網原理:看線路上有沒有信號,有就等待,沒有就發送
3.隔離
使用交換機建立虛擬電路,
其他概念
1.網關——將兩個網絡連在一起
網關——一臺有兩塊網卡裝有網關軟件的計算機,下圖當中方塊就是網關。
假設左側的子網掩碼是 255.255.255.0,右側的子網掩碼是 255.255.0.0,則網關連接 159.226.43 與 226.196兩個網絡。
2.子網掩碼
子網掩碼——區分主機號和網絡號
一個IP是 159.226.43.26,如果子網掩碼是 255.255.0.0,那么網絡號是 159.226, 主機號是 43.26;
如果子網掩碼是 255.255.255.0,那么網絡號是 159.226.43,主機號是26;
3.端口
對于計算機網絡需要找到對應的進程——端口
80是http協議的端口、25是發送郵件的端口、1433是 SQLServer、3306是MySQL、1521是Oracle、8080是網絡服務器飾演端口
上傳消息
服務器并不是一個強大的計算機,只是一直監聽而已
import java.net.*;
public class MyServer{
public static void main(String args[]){
try{
ServerSocket ss = new ServerSocket(8000);
System.out.println("Listening ....");
Socket s = ss.accept();
System.out.println("Listened.");
}catch(Exception e){}
}
}
客戶端就是發送請求的計算機
import java.net.*;
public class MyClient{
public static void main(String args[]){
try{
Socket s = new Socket("localhost", 8000);
}catch(Exception e){}
}
}
I/O字節流
//Server
import java.net.*;
public class MyServer{
public static void main(String args[]){
try{
ServerSocket ss = new ServerSocket(8000);
System.out.println("Listening ... ");
Socket s = ss.accept();
System.out.println(s.getInputStream().read());
//System.out.println("Listened");
}catch(Exception e){}
}
}
//Client
import java.net.*;
public class MyClient{
public static void main(String args[]){
try{
Socket s = new Socket("localhost", 8000);
s.getOutputStream().write(122);
}catch(Exception e){}
}
}
字節流缺點:
只能發送數字
不能發送大于 255 的數字
I/O字符流
//Server
import java.io.*;
import java.net.*;
public class MyServer{
public static void main(String args[]){
try{
ServerSocket ss = new ServerSocket(8000);
System.out.println("Listening ... ");
Socket s = ss.accept();
InputStream is = s.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
System.out.println(br.readLine());
}catch(Exception e){}
}
}
//Client
import java.net.*;
import java.io.*;
public class MyClient{
public static void main(String args[]){
try{
Socket s = new Socket("localhost", 8000);
OutputStream os = s.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
PrintWriter pw = new PrintWriter(osw, true);//自動刷新
pw.println("YBX is the most handsome man in NCEPU");
}catch(Exception e){}
}
}
面向對象編程不建議使用變量,而是方法。
對于 A a = new B();,a.變量是A 的變量,a.方法是B 的方法。
五、數據庫操作
關于數據庫訪問是屬于 javaEE 的內容,在 javaSE 里面找不到
問題
訪問權限
解決方案
MariaDB [(none)]> grant all privileges on QQ.* TO 'tony'@'%' identified by '12345' with GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
使用docker
$> docker exec -it mariadb /bin/bash
索引
數據庫本身存放數據有一個原始順序——原表排序
但是這些數據可以根據不同的條件重新排序,這些排序結果放在——索引表
在不同的產品里面對原表排序和索引表的稱呼不同
SQLServer:
聚集索引——原表排序
非聚集索引——索引表
Oracle:
索引組織表——原表排序
索引——索引表
表
數據庫的表就是二維表
表的特點是——列固定、行增加或減少。
庫
表太多了,為了方便管理,把相關的表組織成為庫。
數據類型
因為數據庫需要分配空間,所以需要給分配的內容定義數據類型以便于分配空間。
因為數據庫很專業,所以數據類型種類很多,但是不超過三類——數字、字符串、日期
Mysql 支持存儲文章(text)和圖片(blob),但是其他數據庫可能不支持。
數字
1.整數——int
一般大小自己用數字定義。eg:int(10)——占10位的整數
2.小數——float、double
大小自己用數字定義。eg:float(5, 2)——一共5位,小數點后2位小數
字符串
1.char()
2.varchar()
區別:
char(5)存放'ab',varchar(5)存放'ab',在取出的時候,char的是'ab '(ab加上3個空格); varchar的是'ab'
字符穿這里使用'',與C語言java語言不同,雖然Myql支持" ",但是需要照顧其他數據庫。
日期——一般用于存放學生的生日
1.datetime——存放 年/月/日/時/分/秒
2.date——存放 年/月/日/
習慣一般存放人員生日而不是年齡,因為每年新年就要把所有人年齡加1,很麻煩。
權限管理——GRANT
新建的普通用戶是沒有權限建立數據庫的
使用root用戶授權
MariaDB [(none)]> GRANT create
-> ON *.*
-> TO tony@'%'
-> IDENTIFIED BY '12345';
這時在使用create就可以了。
第一范式——得到純粹二維表
第二范式——消除主鍵依賴
第三范式——消除函數依賴
2.JDBC
放在 $JAVA_HOME/jre/lib/ext/ 下面
3.訪問數據庫
查詢
import java.sql.*;
public class TestSQL{
public static void main(String[] args) {
try{
Class.forName("org.mariadb.jdbc.Driver");
Connection cn = DriverManager.getConnection("jdbc:mysql://192.168.122.104:3306/test", "tony", "12345");
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery("SELECT id, name FROM student");
while(rs.next()){
String id = rs.getString("id");
String name = rs.getString("name");
System.out.println(id+" "+name);
}
}catch(Exception e){}
}
}
增刪改
import java.sql.*;
public class TestSQL{
public static void main(String[] args) {
try{
//注冊驅動
String driver ="org.mariadb.jdbc.Driver";
Class.forName(driver);
//獲取數據庫連接
String url="jdbc:mysql://192.168.122.104:3306/test";
String user = "tony";
String password = "12345";
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("Connection Success!!!");
//Select
System.out.println("\nThe original data:");
Statement statement = connection.createStatement();
ResultSet result1 = statement.executeQuery("SELECT id, name FROM student");
while(result1.next()){
String id = result1.getString("id");
String name = result1.getString("name");
System.out.println("id: "+id+"\t"+"name: "+name+" ");
}
//Insert
System.out.println("\nInsert");
String sql1 = "INSERT INTO student VALUES(2, 'Jerry')";
int result_insert = statement.executeUpdate(sql1);
System.out.println("Change Line: "+result_insert);
//Select
System.out.println("\nAfter Insert:");
ResultSet result2 = statement.executeQuery("SELECT id, name FROM student");
while(result2.next()){
String id = result2.getString("id");
String name = result2.getString("name");
System.out.println("id: "+id+"\t"+"name: "+name+" ");
}
//Update
String sql2 = "UPDATE student SET name='tony' WHERE id=2";
int result_update = statement.executeUpdate(sql2);
System.out.println("Change Line: "+result_update);
//Select
System.out.println("\nAfter Update:");
ResultSet result3 = statement.executeQuery("SELECT id, name FROM student");
while(result3.next()){
String id = result3.getString("id");
String name = result3.getString("name");
System.out.println("id: "+id+"\t"+"name: "+name+" ");
}
//Delete
String sql3 = "DELETE FROM student WHERE id=2";
int result_delete = statement.executeUpdate(sql3);
System.out.println("Change Line: "+result_delete);
//Select
System.out.println("\nAfter Delete:");
ResultSet result4 = statement.executeQuery("SELECT id, name FROM student");
while(result4.next()){
String id = result4.getString("id");
String name = result4.getString("name");
System.out.println("id: "+id+"\t"+"name: "+name+" ");
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
result1.close();
result2.close();
result3.close();
result4.close();
statement.close();
connection.close();
}catch(Exception e){}
}
}
}
4.反射
只有一個類被使用,而不是聲明,其對應的靜態語句塊才會執行
class A{
static {
System.out.println("aaaaaaaaaaaaaaaaaaaa");
}
}
public class MyTest{
public static void main(String[] args){
A a; //是聲明不會執行
}
}
Class.forName 能自動調用運行類的靜態語句塊,返回值是 Class,Class.forName 提供使用字符串來new對象的途徑。
public class Demo{
public static void main(String args[]){
String choice = "YBX";
try{
Class a = Class.forName(choice);
Object o = a.newInstance();
Hero h = (Hero) o;
h.function(); //父類引用指向子類對象,執行依照 子類(YBX)方法。
}
}
}
增加靈活性這樣以后只需要更改SQL.ini就可以實現數據庫切換,密碼更改等操作。
第三部分 獲得邏輯能力
一、鏈表
在C語言結構體只有數據,沒有方法,但是可以使用 Java 的類來替代。
//定義結構體
class Node{
public char value = ' ';
public Node next = NULL;
}
二、面向對象與面向過程
無論編程技術發展到那一天,面向過程都是必要的基礎。
面向對象進行封裝,這樣兩個人進行合作,一個人負責寫類,一個人負責寫計算機內部實現邏輯,這樣類內部與外部進行完美的隔離。
這樣對于代碼用數組實現記事本與用鏈表實現記事本,只需要改動一句話
ArrayList al = new ArrayList();
//只需要該定義其他的都不需要變
LinkedList ll = new LinkedList();
三、泛型
四、Set
沒有二分查找就沒有二叉樹。
點擊按鈕彈出目錄對話框——JFileChooser
本書實例
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java就_GitHub - IammyselfYBX/This_is_how_Java_should_be_learned: 《Java就应该这样学》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java bitset_Java Bit
- 下一篇: enumset.allof_Java E