Java學習周記week02
1.面向對象的思想
面向對象是基於面向過程的編程思想.
面向過程:強調的是每一個功能的步驟
面向對象:強調的是對象,然後由對象去調用功能
特點
是一種更符合我們思考習慣的思想
可以將復雜的事情簡單化
將我們從執行者變成了指揮者
角色發生了轉換
定義一個學生類
1 public class Student { 2 //成員變量 3 //姓名 4 String name; 5 //年齡 6 int age; 7 8 //成員方法 9 //學習的方法 10 public void study() {11 System.out.println("學習"); 12 } 13 14 //吃飯的方法 15 public void eat() { 16 System.out.println("吃飯"); 17 } 18 }
定義一個手機類
1 public class Phone { 2 //品牌 3 String brand; 4 //價格 5 int price; 6 //顏色 7 String color; 8 9 //打電話 10 publicvoid call(String name) { 11 System.out.println("給"+name+"打電話"); 12 } 13 14 //發短信 15 public void sendMessage() { 16 System.out.println("群發短信"); 17 } 18 }
2.成員變量和局部變量的區別
在類中的位置不同
成員變量:類中,方法外
局部變量:方法中或者方法聲明上(形式參數)
在內存中的位置不同
成員變量:堆內存
局部變量:棧內存
生命周期不同
成員變量:隨著對象的創建而存在,隨著對象的消失而消失
局部變量:隨著方法的調用而存在,隨著方法的調用完畢而消失
初始化值的不同
成員變量:有默認值
局部變量:沒有默認值。必須先定義,賦值,最後使用
1 public class DemoVariable { 2 int x; //成員變量 3 4 public void show() { 5 int y = 0; //局部變量 6 7 System.out.println(x); 8 System.out.println(y); 9 } 10 }
3.封裝
private關鍵字由來及其使用
private關鍵字:
是一個權限修飾符。
可以修飾成員(成員變量和成員方法)
被private修飾的成員只在本類中才能訪問。
1 public class Student { 2 String name; 3 //int age; 4 private int age; 5 6 public void setAge(int a) { 7 if(a<0 || a>200) { 8 System.out.println("你給的年齡有誤"); 9 }else { 10 age = a; 11 } 12 } 13 14 public int getAge() { 15 return age; 16 } 17 18 public void show() { 19 System.out.println("姓名是:"+name+",年齡是:"+age); 20 } 21 }
private最常見的應用:
把成員變量用private修飾
提供對應的getXxx()/setXxx()方法
一個標準的案例的使用
1 public class Student { 2 private String name; 3 private int age; 4 5 public void setName(String n) { 6 name = n; 7 } 8 9 public String getName() { 10 return name; 11 } 12 13 public void setAge(inta) { 14 age = a; 15 } 16 17 public int getAge() { 18 return age; 19 } 20 }
封裝的概述和好處
封裝概述
是面向對象三大特征之一
是面向對象編程語言對客觀世界的模擬,客觀世界裏成員變量都是隱藏在對象內部的,外界無法直接操作和修改。就像剛才說的年齡。
封裝原則:
將不需要對外提供的內容都隱藏起來。
把屬性隱藏,提供公共方法對其訪問。
成員變量private,提供對應的getXxx()/setXxx()方法
好處:
通過方法來控制成員變量的操作,提高了代碼的安全性
把代碼用方法進行封裝,提高了代碼的復用性
4.this關鍵字
this:代表所在類的對象引用
方法被哪個對象調用,this就代表那個對象
this關鍵字的使用
局部變量隱藏成員變量(局部變量和成員變量重名)
1 public class Student { 2 private String name; 3 private int age; 4 5 public void setName(String name) { 6 //name = name; 7 this.name = name; 8 } 9 10 public String getName() { 11 return name; 12 } 13 14 public void setAge(intage) { 15 //age = age; 16 this.age = age; 17 } 18 19 public int getAge() { 20 return age; 21 } 22 }
5.構造方法
作用
給對象的數據進行初始化
格式
方法名與類名相同
沒有返回值類型,連void都沒有
沒有具體的返回值
修飾符 構造方法名(參數列表){
}
註意事項
如果你不提供構造方法,系統會給出默認構造方法
如果你提供了構造方法,系統將不再提供
構造方法也是可以重載的(即使用時帶參構造和無參構造可同時使用)
1 public class Student { 2 private String name; 3 private int age; 4 5 /* 6 public Student() { 7 System.out.println("構造方法"); 8 } 9 */ 10 11 public Student() {} 12 13 public Student(String name) { 14 this.name = name; 15 } 16 17 public Student(int age) { 18 this.age = age; 19 } 20 21 public Student(String name,int age) { 22 this.name = name; 23 this.age = age; 24 } 25 26 public void show() { 27 System.out.println(name+"---"+age); 28 } 29 }
6.String類
字符串是由多個字符組成的一串數據
構造方法
public String(String original) 把字符串數據封裝成字符串對象
public String(char[] value) 把字符數組的數據封裝成字符串對象
public String(char[] value,int offset,int count) 把字符數組中的一部分數據封裝成字符串對象
直接賦值也可以是一個對象(定義一個字符串變量)
通過構造方法創建字符串對象
String s = new String(“hello”);
直接賦值創建字符串對象
String s = “hello”;
判斷功能方法
boolean equals(Object obj): 比較字符串的內容是否相同
boolean equalsIgnoreCase(String str): 比較字符串的內容是否相同,忽略大小寫
boolean startsWith(String str): 判斷字符串對象是否以指定的str開頭
boolean endsWith(String str): 判斷字符串對象是否以指定的str結尾
獲取功能方法
int length():獲取字符串的長度,其實也就是字符個數
char charAt(int index):獲取指定索引處的字符
int indexOf(String str):獲取str在字符串對象中第一次出現的索引,沒有返回-1
String substring(int start):從start開始截取字符串到字符串結尾
String substring(int start,int end):從start開始,到end結束截取字符串;包括start,不包括end
轉換功能方法
char[] toCharArray():把字符串轉換為字符數組
String toLowerCase():把字符串轉換為小寫字符串
String toUpperCase():把字符串轉換為大寫字符串
去除空格和分割功能方法
String trim()去除字符串兩端空格
String[] split(String str)按照指定符號分割字符串
7.類名作為形式參數和返回值
類名作為形式參數案例:需要的其實是該類的對象
1 class Test { 2 public void show(Person p){ 3 p.eat(); 4 } 5 }
類名作為返回值案例:返回的其實是該類的對象
1 class Test { 2 public Person show(){ 3 Person p = new Person("小王"); 4 return p; 5 } 6 }
8.StringBuilder類
String與StringBuilder的區別:
String的內容是固定的。
StringBuilder的內容是可變的。
添加功能
public StringBuilder append(任意類型):添加數據,並返回自身對象
反轉功能
public StringBuilder reverse()
1 public class DemoStringBuilder { 2 public static void main(String[] args) { 3 //創建對象 4 StringBuilder builder = new StringBuilder(); 5 //鏈式編程 6 builder.append("hello").append("world").append(true).append(100); 7 8 System.out.println("builder:"+builder); 9 10 //public StringBuilder reverse() 11 builder.reverse(); 12 System.out.println("builder:"+builder); 13 } 14 }
9.ArrayList集合
ArrayList<E>集合:大小可變數組的實現
<E>:是一種特殊的數據類型,泛型。
在出現E的地方我們使用引用數據類型替換即可
舉例:ArrayList<String>,ArrayList<Student>
構造方法
ArrayList()
成員方法
添加元素
public boolean add(E e):添加元素
public void add(int index,E element):在指定的索引處添加一個元素
1 public class DemoArrayList { 2 public static void main(String[] args) { 3 //創建集合對象 4 ArrayList<String> list = new ArrayList<String>(); 5 6 //add(E e):添加元素 7 list.add("hello"); 8 list.add("world"); 9 list.add("java"); 10 11 //add(int index,E element):在指定的索引處添加一個元素 12 list.add(1, "android"); 13 14 System.out.println("array:"+list); 15 } 16 }
獲取元素
public E get(int index):返回指定索引處的元素
集合長度
public int size():返回集合中的元素的個數
刪除元素
public boolean remove(Object o):刪除指定的元素,返回刪除是否成功
public E remove(int index):刪除指定索引處的元素,返回被刪除的元素
修改元素
public E set(int index,E element):修改指定索引處的元素,返回被修改的元素
10.FileWriter和FileReader
FileWirter寫數據
構造方法
FileWriter(String fileName) 傳遞一個文件名稱
成員方法
void write(String str) 往文件中寫入一個字符串。
void flush() 刷新該流的緩沖,把內存緩沖區中的數據刷新到文件中。
void close() 關閉此流,但要先刷新它。
輸出流寫數據的步驟:
1.創建輸出流對象
2.調用輸出流對象的寫數據的方法
3.釋放資源
路徑:
相對路徑:相對當前項目而言的,在項目的根目錄下(a.txt)
絕對路徑:以盤符開始的路徑(d:\\a.txt)
close()和flush()方法的區別:
flush():刷新緩沖區。流對象還可以繼續使用。
close():先刷新緩沖區,然後通知系統釋放資源。流對象不可以再被使用了。
FileWriter寫數據的5個方法
void write(String str):寫一個字符串數據
void write(String str,int index,int len):寫一個字符串中的一部分數據, index:開始索引,len:寫幾個
void write(int ch):寫一個字符數據,這裏寫int類型的好處是既可以寫char類型的數據,也可以寫char對應的int類型的值。‘a‘,97
void write(char[] chs):寫一個字符數組數據
void write(char[] chs,int index,int len):寫一個字符數組的一部分數據, index:開始索引,len:寫幾個
換行問題
windows:\r\n
linux:\n
mac:\r
換行符可以寫在第一個數據的結尾,也可以寫在第二個數據的開頭
FileReader讀數據
構造方法
FileReader(String fileName) 傳遞要讀取的文件名稱
成員方法
int read() 讀取單個字符並返回
int read(char[] cbuf) 一次讀取一個字符數組的數據,返回的是實際讀取的字符個數
輸入流讀文件的步驟:
1.創建輸入流對象
2.調用輸入流對象的讀數據方法
3.釋放資源
一次讀寫一個字符數組復制文本文件
1 public class Demo02CopyFile { 2 public static void main(String[] args) throws IOException { 3 //創建輸入流對象 4 FileReader fr = new FileReader("Demo01FileWriter.java"); 5 //創建輸出流對象 6 FileWriter fw = new FileWriter("Copy.java"); 7 8 //讀寫數據 9 char[] chs = new char[1024]; 10 int len; 11 while((len=fr.read(chs))!=-1) { 12 fw.write(chs, 0, len); 13 } 14 15 //釋放資源 16 fw.close(); 17 fr.close(); 18 } 19 }
11.BufferedWriter和BufferedReader
BufferedWriter:將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。
BufferedReader:從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取。
1 public class Demo01BufferedStream { 2 public static void main(String[] args) throws IOException { 3 //創建輸出緩沖流對象 4 BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")); 5 bw.write("hello"); 6 //bw.flush(); 7 bw.close(); 8 9 //創建輸入緩沖流對象 10 BufferedReader br = new BufferedReader(new FileReader("bw.txt ")); 11 12 /* 13 //一次讀寫一個字符 14 int ch; 15 while((ch=br.read())!=-1){ 16 System.out.print((char)ch); 17 } 18 */ 19 20 //一次讀寫一個字符數組 21 char[] chs = new char[1024]; 22 int len; 23 while((len=br.read(chs))!=-1) { 24 System.out.print(new String(chs,0,len)); 25 } 26 27 //釋放資源 28 br.close(); 29 } 30 }
緩沖流的特殊功能
BufferedWriter
void newLine():寫一個換行符,這個換行符由系統決定
BufferedReader
String readLine():一次讀取一行數據,但是不讀取換行符
從文本文件中讀取數據到ArrayList集合中,並遍歷集合
例:每一行數據作為一個字符串元素
1 public class Demo03FileToArrayListTest { 2 public static void main(String[] args) throws IOException { 3 //創建輸入緩沖流對象 4 BufferedReader br = 5 new BufferedReader(new FileReader("array.txt")); 6 7 //創建集合對象 8 ArrayList<String> list = new ArrayList<String>(); 9 10 //讀取數據,每次讀取一行數據,把該行數據作為一個元素存儲到集合中 11 String line; 12 while((line=br.readLine())!=null) { 13 list.add(line); 14 } 15 16 //釋放資源 17 br.close(); 18 19 //遍歷集合 20 for(int i=0; i<list.size(); i++) { 21 String s = list.get(i); 22 System.out.println(s); 23 } 24 } 25 }
Java學習周記week02