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();
}
}
何爲子類後訪問權限,即訪問父類的方法,變量的權限
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)
-
第一步(編譯):
創建完源文件之後,程序會先被編譯爲.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,否則直接引用,這個有點象make。如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報“cant
find symbol”的錯誤。
編譯後的字節碼文件格式主要分爲兩部分:常量池和方法字節碼。常量池記錄的是代碼出現過的 所有token(類名,成
員變量名等等)以及符號引用(方法引用,成員變量引用等等);方法字節 碼放的是類中各個方法的字節碼 -
第二步(運行):java類運行的過程大概可分爲兩個過程:
- 類的加載
- 類的執行。需要說明的是: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指向此堆內存地址