【Java】java進階知識

1.子類繼承後調用的是父類的方法,而不是將代碼隱式添加到子類

public class parent {
	private int a=10;//私有變量可通過公有方法訪問
	public int getA() {
		return a;
	}
    public static void main(String[] args) {
        son son=new son();
       System.out.print(son.getA());//put 10
    }
}
class son extends parent{
	private int a=9;
	public void name() {
		super.getA();
this.getA();
	}
}

參考:http://blog.csdn.net/jxqiaole/article/details/45372507

何爲子類後訪問權限,即訪問父類的方法,變量的權限

public class parent {

	public int a=10;//共有變量,子類可直接訪問
	public int getA() {
		return a;
	}
    public static void main(String[] args) {
        new parent();
        son son=new son();
        son.name();
    }
}
class son extends parent{
//加上這一句 private int a=0;將輸出兩個10;
	public son(){
		a=9;
	}
	public void name() {
		 System.out.print(super.getA());//put 9
		 System.out.print(this.getA());//put 9
		
	}
}

總結:

  • 1.子類未重寫父類成員變量,同時子類有修改變量值:調用的父類方法輸出的是子類修改後的值(因爲變量作用範圍)
  • 2.子類重寫父類成員變量,不論子類是否修改變量值:調用的父類方法輸出的是父類中的值

3.內容是空的是isEmpty(),對象是空的(未實現)爲null

4.equals是判斷內容相等,”==”是判斷內存相等

拓展:equals是根據hashcode比較

5.基本類型是傳值,數組,對象等等是傳引用(內存地址)

拓展:數組的傳參爲常見問題,傳參後數組爲同一個數組,修改將會互相影響到

6.成員變量爲什麼要用private定義,然後用get,set訪問

避免多個類繼承基類後,改變成員變量類型編譯不通過

7.內部類實例化方法

  • 內部類聲明爲static:
 Outter.Inner aInner=new Outter.Inner();//這種方法的實現沒有使用到外部類的構造函數
  • 普通內部類:
    	Outter out=new Outter();
    	Outter.Inner innter=Outter.new Inner();

Ps:可以將內部類想象成一個成員變量,普通的變量需要對象出現才能使用,static的可以直接使用

8.形參和實參的區別

比如你定義一個函數void add(int a, int b),這裏的a和b就是形參。 當你進行函數調用的時候,add(1, 2),這裏的1和2就是實參。 形參就是函數定義時候用的,實參是在函數調用時候用的

9.finally唯一不執行的情況

在catch中添加System.exit(1)

try{
return true; //不會停止finally,finally塊會在這個return語句前執行
}catch (SQLException e) {
e.printStackTrace();
}finally{
closeResource();
}

10.Java是一種強類型語言

它能區別多種數據類型,並且通常不允許用一種類型替換另一種。這樣,使得編譯器能高效處理數據,防止由於類型不匹配導致的運行時錯誤。所以,效率越高的語言,花費代碼越多,給編譯器描述的越清晰

11.Java 編程下通過反射獲取一個類中的方法名和對應參數類型

實際編程中如果我們要使用系統中未暴露的方法,我們可以通過反射來使用這些方法,但在使用過程中我們很難確定方法對用的參數類型,以下的代碼可以幫你得到這些信息:

package cn.sunzn.reflectcase;

import java.lang.reflect.Method;

public class GetMethod {
   public static void main(String[] args) {
       getMethodInfo("java.util.HashSet");
   }

   /**
    * 傳入全類名獲得對應類中所有方法名和參數名
    */
   @SuppressWarnings("rawtypes")
   private static void getMethodInfo(String pkgName) {
       try {
           Class clazz = Class.forName(pkgName);
           Method[] methods = clazz.getMethods();
           for (Method method : methods) {
               String methodName = method.getName();
               System.out.println("方法名稱:" + methodName);
               Class<?>[] parameterTypes = method.getParameterTypes();
               for (Class<?> clas : parameterTypes) {
                   String parameterName = clas.getName();
                   System.out.println("參數名稱:" + parameterName);
               }
               System.out.println("*****************************");
           }
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       }
   }
}

12.java編譯與運行

http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml)

  1. 第一步(編譯):
    創建完源文件之後,程序會先被編譯爲.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,否則直接引用,這個有點象make。如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報“cant
    find symbol”的錯誤。
    編譯後的字節碼文件格式主要分爲兩部分:常量池和方法字節碼。常量池記錄的是代碼出現過的 所有token(類名,成
    員變量名等等)以及符號引用(方法引用,成員變量引用等等);方法字節 碼放的是類中各個方法的字節碼

  2. 第二步(運行):java類運行的過程大概可分爲兩個過程:

    1. 類的加載
    2. 類的執行。需要說明的是:JVM主要在程序第一次主動使用類的時候,纔會去加載該類。也就是說,JVM並不是在一開始就把一個程序就所有的類都加載到內存中,而是到不得不用的時候才把它加載進來,而且只加載一次

13.數據庫連接池

● 功能:減少創建連接,再關閉連接的資源消耗
● 初始化:創建一定數量的數據連接放入連接池(數量由最小數量和最大數量影響),在連接空閒時被重複使用
● 增加:連接不夠使用時,將創建新連接,直至最大數量。空閒時間最長的連接將被提供給應用程序
● 關閉:連接只有在超過最長空閒時間纔會關閉。

//JNDI 通過配置文件Context找到對應字段對應的值
	//感覺就像一個全局靜態的單例對象
	Context ctx=new InitialContext();
	DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/hrs");
	Connection conn=ds.getConnection();

14.jsp與servlet不同的編譯時期

jsp和servlet的編譯時期不一樣。使用myeclipse等工具創建的servlet在部署在tomcat時就已經被編譯成.class文件了,而jsp被部署到tomcat時還沒有被編譯。當tomcat啓動,第一次訪問jsp頁面時,jsp纔會被編譯成servlet,進而被編譯成.class文件

15.javabean

javabean起初包含數據實體Bean和封裝業務邏輯的實體操作Bean兩部分,後業務邏輯java類不需要完全符合javaBean規則,故不將業務邏輯稱爲javaBean

16.PrepareStatement接口

  • 解決sql注入不安全問題

http://www.360doc.com/content/14/0307/11/16021371_358456176.shtml)

預處理語句將被預先編譯好,這條預編譯的sql查詢語句能在將來的查詢中重用,這樣一來,它比Statement對象生成的查詢速度更快,如果還是用
PreparedStatement
做同樣的查詢,哪怕參數值不一樣,數據庫系統還是會去調用之前編譯器編譯好的執行語句(系統庫系統初次會對查詢語句做最大的性能優化)

  • 明確執行sql類型會提高效率 execute方法執行未知的sql語句類型

executeUpdate執行 INSERT、UPDATE 或 DELETE 語句
executeQuery執行select語句

17.jvm內存問題

(http://blog.csdn.net/lixingtao0520/article/details/77978333)

change("hello","world")
public static void change(String s1, String s2) {  
1.          String s= "world";  
2.          String ss= "worldworld";  
3.          s1 = s2;  
4.          System.out.println(s==s1);//輸出true  
5.          s2 = s1+s2;  
6.          System.out.println(ss==s2);//輸出false  
7.          System.out.println("change(s1,s2)---"+s1+"---"+s2);//2:change(s1,s2)---world---worldworld  
8.     }  

結論:s1所指向的是常量池中的"world",s2=s1+s2代碼執行後,會在堆內存中重新創建對象,並將s2指向此堆內存地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章