JavaDay04總結 1、實現介面VS繼承類 : 1. 實現介面是繼承的補充 2. 實現介面可以在不打破繼承關係的前提下,對某個功能擴展 2、綁定 : 1. 前期綁定:在程式運行前進行綁定,由編譯器和連接程式實現,又叫靜態綁定 2. 後期綁定:在運行時根據對象的類型進行綁定,由方法調用機制實現,又 ...
JavaDay04總結
1、實現介面VS繼承類:
- 實現介面是繼承的補充
- 實現介面可以在不打破繼承關係的前提下,對某個功能擴展
2、綁定:
- 前期綁定:在程式運行前進行綁定,由編譯器和連接程式實現,又叫靜態綁定
- 後期綁定:在運行時根據對象的類型進行綁定,由方法調用機制實現,又叫動態綁定
3、final:修飾變數或者方法
- 當不希望父類的某個方法被子類覆蓋時
- 當不希望類的某個變數值被修改時
- 當不希望被繼承時
註意:final修飾的變數又叫常量,用xx_xx_xx命名,並且變數在定義時必須賦初值且不能修改
使用final:1.因安全考慮,類的方法不能被修改 2.類不會被其他類繼承 3.某些變數值固定不變
4、數組:
1.定義:數據類型 數組名[]=new 數據類型[大小];
eg.int a[]=new int [5];
int a[]=int []a
2.引用:數組名[下標] a.length
計算數組大小
3.初始化數組:int a[]={1,2,3,4,5}; 相當於 int a[]=new int[5];a[0]=1;a[1]=2;...
數組小結:(1)數組可以存放同一類型數據 (2)簡單數據類型數組可直接複製 (3)對象數組在定義後,賦值時需要再次為每個對象分配空間 (4)數組大小必須提前指定 (5)數組名為數組首地址的使用 (6)數組的下標從0開始
5、對象數組:
/*
作者:mys
功能:對象數組的使用
日期:2018/7/13
*/
package cn.mys;
import java.io.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Demo16 {
public static void main(String []args) throws Exception
{
//定義一個可以存放四隻狗的對象數組
Dog dogs[]=new Dog[4];
//從控制台輸入各個狗的信息
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
for(int i=0;i<4;i++)
{
dogs[i]=new Dog();//創建一個空間存放狗的具體信息
System.out.println("請輸入第"+(i+1)+"只狗的名字:");
//從控制台讀取狗名
String name=br.readLine();//異常
//將狗名賦給對象
dogs[i].setName(name);
System.out.println("請輸入狗的體重:");
//從控制台讀取狗的體重
String s_weight=br.readLine();
//String->float
float weight=Float.parseFloat(s_weight);
//將狗體重賦給對象
dogs[i].setWeight(weight);
}
//計算總體重
float allWeight=0;
for(int i=0;i<4;i++)
{
allWeight+=dogs[i].getWeight();
}
//計算平均體重
float avrWeight=allWeight/dogs.length;
System.out.println("總體重:"+allWeight+" 平均體重:"+avrWeight);
}
}
class Dog
{
private String name;
private float weight;
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public void setWeight(float weight)
{
this.weight=weight;
}
public float getWeight()
{
return weight;
}
}
6、二進位數操作
- 二進位的最高位是符號位:0正數,1負數
- 正數的原碼、反碼、補碼一樣
- 負數的反碼=原碼符號位不變,其餘位取反
- 負數的補碼=反碼+1
- 0的反碼、補碼=0
- java的數都是有符號的
- 電腦在運算時,都是以補碼的方式
位運算符:& | ^ ~
移位運算符:
- 算術左移<< :符號位不變,低位補0(相當於*2)
- 算術右移>> :符號位不變,低位溢出,並用符號位補溢出高位
- 邏輯右移>>>:低位溢出,高位補0
7、集合類:
分類
- List集合類:ArrayList類、LinkedList類、Vector類、Stack類
- Map集合類:HashMap類、Hashtable類
- Set集合類:HashSet類、TreeSet類
- Queue集合類:Queue介面
ArrayList和Vector區別:
- 同步性:Vector同步,保證線程的安全性;ArrayList非同步,線程並不安全但是效率高。
- 數據增長:都使用數組來控制集合中的對象,當增加元素時,如果超出內部數組的目前長度,需要擴展,Vector在預設的情況下自動增長為原來的一倍,ArrayList增長為原來的50%,若要在集合中保存大量數據,用Vector。
//ArrayList使用
//定義ArrayList對象
ArrayList a1=new ArrayList();
//顯示大小
System.out.println("加入前a1大小:"+a1.size());
//向a1中加入數據(類型是Object)
//創建一個職員
Clerk clerk1=new Clerk("mys",19,1000);
Clerk clerk2=new Clerk("sky",20,1200);
Clerk clerk3=new Clerk("lucy",20,900);
//將clerk1加入到a1中
a1.add(clerk1);
a1.add(clerk2);
a1.add(clerk3);
a1.add(clerk1);//可以放入同樣的對象
//顯示大小
System.out.println("加入後a1大小:"+a1.size());
//訪問a1中對象(數據)
//Clerk temp=(Clerk)a1.get(0);//註意類型要匹配
//System.out.println("第一個名字是:"+temp.getName());
//遍歷a1所有對象
for(int i=0;i<a1.size();i++)
{
Clerk temp=(Clerk)a1.get(i);
System.out.println("第"+(i+1)+"個名字是:"+temp.getName());
}
//從a1中刪除一個對象
a1.remove(2);
System.out.println("=====刪除後====");
for(int i=0;i<a1.size();i++)
{
Clerk temp=(Clerk)a1.get(i);
System.out.println("第"+(i+1)+"個名字是:"+temp.getName());
}
}
HashMap和Hashtable區別:
- 歷史:Hashtable基於陳舊的Dictionary類,HashMap是java1.2引進的Map介面的實現
- 同步性:Hashtable同步,HashMap非同步
- 值:HashMap可將空值作為一個表的條目的key或者value,Hashtable不能空放入值null
小結:如果要求數據量很大,又要線程安全考慮時用Vector;要求鍵值時用Hashtable或HashMap
//HashMap、Hashtable使用
//創建一個HashMap對象
HashMap hm=new HashMap();
Clerk clerk1=new Clerk("mys","m20172213",1000);
//將clerk1放入hm
hm.put("mys",clerk1);
//如果要查找名為 mys
if(hm.containsKey("mys")) {
System.out.println("有該員工");
//取出鍵值
Clerk clerk=(Clerk)hm.get("mys");
System.out.println("編號:"+clerk.getNum());
}
else {
System.out.println("沒有該員工");
}
//遍歷HashMap中所有的key和value
//Iterator迭代
Iterator it=hm.keySet().iterator();
//hasNext返回一個Boolean
while(it.hasNext()) {
//取出key
String key=it.next().toString();
//通過key取出value
Clerk clerk=(Clerk)hm.get(key);
System.out.println("名字:"+clerk.getName());
System.out.println("編號:"+clerk.getNum());
System.out.println("薪水:"+clerk.getSal());
}
//Hashtable不能放入空值,HashMap可以
/*Hashtable ht=new Hashtable();
ht.put(null,null);*/
hm.put(null,null);
System.out.println("測試:"+hm.get(null));
8、泛型:本質:參數化類型,即所有的參數類型被指定為一個參數,可在類、介面和方法中創建,稱為泛型類、泛型介面、泛型方法。安全簡單,在編譯的時候檢查類型安全,並且所有的強制轉換都是自動和隱式的,提高代碼的重用性。
優點:1.類型安全 2.向後相容 3.層次清晰 4.性能較高,用GL編寫的代碼可以為java編譯器和虛擬機帶來更多的類型信息,這些信息為java程式的進一步優化提供條件
/*
作者:mys
功能:泛型的使用
日期:2018/7/14
*/
package cn.mys;
import java.lang.reflect.Method;
import java.util.*;
import java.util.ArrayList;
public class Demo22 {
public static void main(String []args) {
//泛型
ArrayList<Dog> a1=new ArrayList<Dog>();
//創建一隻狗
Dog dog=new Dog();
//放入集合
a1.add(dog);
//取出
//Dog temp=(Dog)a1.get(0); 強制轉換
//Cat temp=(Cat)a1.get(0);//報錯:ClassCastException,沒有Cat對象
//使用泛型後不用強制轉換
Dog temp=a1.get(0);
// Gen<Integer> gen1=new Gen<Integer>(1);
// gen1.showTypeName();
Gen<Dog> gen2=new Gen<Dog>(new Dog());
gen2.showTypeName();
}
}
class Cat {
}
class Dog {
String name;
int age;
public void count() {
}
}
//定義一個類
class Gen<T> {
private T o;
public Gen(T a) {
o=a;
}
//得到T的類型名
public void showTypeName() {
System.out.println("類型是:"+o.getClass().getName());
//通過反射機制,可以得到類型的很多信息,如成員函數名稱
Method []m=o.getClass().getDeclaredMethods();
//列印
for(int i=0;i<m.length;i++){
System.out.println("成員函數名稱:"+m[i].getName());
}
}
}
9、異常:當出現程式無法控制的外部環境問題(用戶提供的文件不存在、文件內容損壞、網路不可用...),java就會用異常對象來描述。
異常分類:
1.檢查性異常:java.lang.Exception 程式正確,因外在環境條件不滿足而引發
eg.用戶錯誤及I/O問題----程式試圖打開一個並不存在的遠程Socket埠,或者打開不存在的文件時
2.運行期異常:java.lang.RuntimeException 程式存在bug eg.數組越界
3.錯誤:java.lang.Error 可能源於程式的bug或環境問題(一般),eg.記憶體耗盡,錯誤在程式中無需處理,有運行環境處理
頂層是java.lang.Throwable類,以上三種異常都是這個類的子類
異常處理:程式運行產生異常發生時,將從異常發生中斷程式並向外拋出異常信息。在出現異常的地方,就終止執行代碼,然後進入catch,如果有多個catch語句,則進入匹配異常的那個catch
異常處理方法:
1.在發生異常的地方直接處理
2.將異常拋給調用者,讓調用者處理
finally:將finally塊置於try...catch後,finally塊一般會得到執行,相當於一個萬能保險,即使前面的try塊發生異常而又沒有對應異常的catch塊,finally塊將被執行
多個異常的處理:子類異常的處理塊必須在父類異常處理塊的前面,否則會發生編譯錯誤,因此越特殊的異常越在前面處理,越普遍的異常越在後面處理
/*
作者:mys
功能:異常及其處理、finally
日期:2018/7/14
*/
package cn.mys;
import java.io.*;
import java.net.*;
import java.io.FileReader;
public class Demo23 {
public static void main(String []args){
/*異常
//檢查異常
//1.打開文件
FileReader fr=new FileReader("d:\\aaa.text");
//2.連接一個192.168.1.1 IP埠號123
Socket s=new Socket("192.168.1.1",123);
//運行異常
int a=4/0;//除數為0
int b[]={1,2,3};
System.out.println(b[10]);//數組越界
*/
FileReader fr=null;
try{
//在出現異常的地方,就終止執行代碼,然後進入catch
//如果有多個catch語句,則進入匹配異常的那個catch
Socket s=new Socket("192.1688.1.1",123);
//FileReader fr=new FileReader("d:\\aaa.text");
fr=new FileReader("d:\\aaa.text");
}catch (Exception e){
//把異常的信息輸出,利於排除bug
e.printStackTrace();
}finally {
//這個語句塊,不管有沒有異常都會執行
//一般說,關閉需要的資源[文件,連接,記憶體]
System.out.println("進入finally");
if(fr!=null){
try{
fr.close();
System.out.println("文件已關閉");
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
/*將異常拋給調用者
class Father {
private Son son=null;
public Father() {
son=new Son();
}
public void test1(){
//son.test();//調用時出現異常
}
}
class Son {
//將異常處理拋出,給調用者
public void test()throws Exception{
FileReader fr=new FileReader("d:\\aaa.text");
}
}
*/