Java基礎-11總結Eclipse使用,API,Object類
1:Eclipse的安裝
2:用Eclipse寫一個HelloWorld案例,最終在控制檯輸出你的名字
A:建立專案
B:在src目錄下建立包。cn.itcast
C:在cn.itcast包下建立類。HelloWorld
D:在HelloWorld下有一個方法。public static void main(String[] args) {}
E:在main方法中有一個輸出語句。System.out.println("你的名字");
3:Eclipse空間的基本配置
A:程式的編譯和執行的環境配置(一般不改)
window -- Preferences -- Java
編譯環境:Compiler 預設選中的就是最高版本。
執行環境:Installed JREs 預設會找你安裝的那個JDK。建議配置了Java的環境變數。
問題:
低編譯,高執行。可以。
高編譯,低執行。不可以。
建議,編譯和執行的版本一致。
B:如何去掉預設註釋?
window -- Preferences -- Java -- Code Style -- Code Templates
選擇你不想要的內容,通過右邊Edit編輯。
注意:請只刪除註釋部分,不是註釋部分的不要刪除。
C:行號的顯示和隱藏
顯示:在程式碼區域的最左邊的空白區域,右鍵 -- Show Line Numbers即可。
隱藏:把上面的動作再做一次。
D:字型大小及顏色
a:Java程式碼區域的字型大小和顏色:
window -- Preferences -- General -- Appearance -- Colors And Fonts -- Java修改 -- Java Edit Text Font
b:控制檯
window -- Preferences -- General -- Appearance -- Colors And Fonts -- Debug -- Console font
c:其他檔案
window -- Preferences -- General -- Appearance -- Colors And Fonts -- Basic -- Text Font
E:窗體給弄亂了,怎麼辦?
window -- Reset Perspective
F:控制檯找不到了,怎麼辦?
Window--Show View—Console
4:常用快捷鍵
A:格式化 ctrl+shift+f
B:匯入包 ctrl+shift+o
如果該類僅僅在一個包中有,就自己顯示了
如果該類在多個包中有,會彈出一個框框供你選擇
C:註釋
單行:註釋 ctrl+/,取消註釋再來一次。
多行:ctrl+shift+/,ctrl+shift+
D:程式碼上下移動
選中程式碼alt+上/下箭頭
E:檢視原始碼
選中類名(F3或者Ctrl+滑鼠點選)
5:如何提高開發效率
A:自動生成構造方法
a:無參構造方法 在程式碼區域右鍵--source--Generate Constructors from Superclass
b:帶參構造方法 在程式碼區域右鍵--source--Generate Constructors using fields.. -- finish
B:自動生成getXxx()/setXxx()方法
在程式碼區域右鍵--source--Generate Getters and Setters...
提供了對應的快捷鍵操作。
alt+shift+s
按下帶有下劃線的那個字母即可。
C:如何繼承抽象類和實現介面。
D:Override的作用
表示該方法是重寫父類的。如果方法宣告和父類不匹配,就會報錯。
6:通過講解的快捷鍵和提高開發效率的一些內容完成如下內容
自定義學生類:Student
成員變數;
姓名
年齡
構造方法:
無參
帶參
成員方法:
getXxx()/setXxx()
在給出一個show()方法,顯示類的所有成員資訊。
然後,寫一個測試類,對學生的程式碼進行測試。
StudentDemo
package cn.itcast_01;
public class Student {
// 姓名
private String name;
// 年齡
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Student() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show() {
System.out.println("姓名:" + name + ",年齡:" + age);
}
}
package cn.itcast_01;
/*
* 測試類
*/
public class StudentDemo {
public static void main(String[] args) {
// 建立物件
Student s1 = new Student();
s1.setName("風清揚");
s1.setAge(30);
System.out.println(s1.getName() + "---" + s1.getAge());
s1.show();
// 建立物件
Student s2 = new Student("林青霞", 27);
System.out.println(s2.getName() + "---" + s2.getAge());
s2.show();
}
}
7:刪除專案和匯入專案
刪除專案
選中專案 – 右鍵 – 刪除
從專案區域中刪除
從硬碟上刪除
匯入專案
在專案區域右鍵找到import
找到General,展開,並找到
Existing Projects into Workspace
點選next,然後選擇你要匯入的專案
注意:這裡選擇的是專案名稱
8:要注意的幾個小問題
如何檢視專案所在路徑
選中 -- 右鍵 -- Properties -- Resource -- Location
匯入專案要注意的問題
專案區域中不可能出現同名的專案(新建或者匯入)
自己隨意建立的資料夾是不能作為專案匯入的
修改專案問題
不要隨意修改專案名稱
如果真要修改,不要忘記了配置檔案.project中的
<name>把這裡改為你改後的名稱</name>
9:大家接收檔案的注意事項
A:專門建立一個資料夾用於接收專案,不要隨意放置。
B:同一個專案再次接收的時候,先去存放目錄把原始專案刪除,然後重新儲存,最後重新整理專案即可。
C:每天對照我寫的專案,自己也建立一個練習專案
舉例:我的專案名稱 day11_eclipse
你就建立一個專案名稱 day11_eclipse_test
10:Eclipse中程式碼的高階(Debug)除錯
作用:
除錯程式
檢視程式執行流程
如何檢視程式執行流程
要想看程式流程,就必須設定斷點。
什麼是斷點:
就是一個標記,從哪裡開始。
如何設定斷點:
你想看哪裡的程式,你就在那個有效程式的左邊雙擊即可。
在哪裡設定斷點:
哪裡不會點哪裡。
目前:我們就在每個方法的第一條有效語句上都加。
如何執行設定斷點後的程式:
右鍵 -- Debug as -- Java Application
看哪些地方:
Debug:斷點測試的地方
在這個地方,記住F6,或者點選也可以。一次看一行的執行過程。
Variables:檢視程式的變數變化
ForDemo:被檢視的原始檔
Console:控制檯
如何去斷點:
a:再次雙擊即可
b:找到Debug檢視,Variables介面,找到Breakpoints,並點選,然後看到所有的斷點,最後點選那個雙叉。
package cn.itcast_03;
/*
* 通過debug檢視程式執行流程
* 請大家也做一遍。
*/
public class ArgsDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a:" + a + ",b:" + b);
change(a, b);
System.out.println("a:" + a + ",b:" + b);
int[] arr = { 1, 2, 3, 4, 5 };
change(arr);
System.out.println(arr[1]);
}
public static void change(int a, int b) {
System.out.println("a:" + a + ",b:" + b);
a = b;
b = a + b;
System.out.println("a:" + a + ",b:" + b);
}
public static void change(int[] arr) {
for (int x = 0; x < arr.length; x++) {
if (arr[x] % 2 == 0) {
arr[x] *= 2;
}
}
}
}
package cn.itcast_03;
public class ForDemo {
public static void main(String[] args) {
// 定義求和變數
int sum = 0;
for (int x = 1; x < 6; x++) {
sum += x;
}
System.out.println("sum:" + sum);
}
}
2:API的概述(瞭解)
(1)應用程式程式設計介面。
(2)就是JDK提供給我們的一些提高程式設計效率的java類。
3:Object類(掌握)
(1)Object是類層次結構的根類,所有的類都直接或者間接的繼承自Object類。
(2)Object類的構造方法有一個,並且是無參構造
這其實就是理解當時我們說過,子類構造方法預設訪問父類的構造是無參構造
(3)要掌握的方法:
A:toString()
返回物件的字串表示,預設是由類的全路徑+'@'+雜湊值的十六進位制表示。
這個表示其實是沒有意義的,一般子類都會重寫該方法。
如何重寫呢?過程我也講解過了,基本上就是要求資訊簡單明瞭。
但是最終還是自動生成。
package cn.itcast_02;
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
// @Override
// public String toString() {
// // return super.toString();
// // return "hello";
// return "姓名:" + name + ",年齡:" + age;
// }
}
package cn.itcast_02;
/*
* public String toString():返回該物件的字串表示。
*
* Integer類下的一個靜態方法:
* public static String toHexString(int i):把一個整數轉成一個十六進位制表示的字串
*
* 這個資訊的組成我們講解完畢了,但是這個資訊是沒有任何意義的。所以,建議所有子類都重寫該方法。
* 怎麼重寫呢?
* 把該類的所有成員變數值組成返回即可。
* 重寫的最終版方案就是自動生成toString()方法。
*
* 注意:
* 直接輸出一個物件的名稱,其實就是呼叫該物件的toString()方法。
*/
public class StudentDemo {
public static void main(String[] args) {
Student s = new Student();
System.out.println(s.hashCode());
System.out.println(s.getClass().getName());
System.out.println("--------------------");
System.out.println(s.toString());// cn.itcast_02.Student@42552c
System.out.println("--------------------");
// toString()方法的值等價於它
// getClass().getName() + '@' + Integer.toHexString(hashCode())
// this.getClass().getName()+'@'+Integer.toHexString(this.hashCode())
// cn.itcast_02.Student@42552c
// cn.itcast_02.Student@42552c
System.out.println(s.getClass().getName() + '@'
+ Integer.toHexString(s.hashCode()));
System.out.println(s.toString());
// 直接輸出物件的名稱
System.out.println(s);
}
}
B:equals()
比較兩個物件是否相同。預設情況下,比較的是地址值是否相同。
而比較地址值是沒有意義的,所以,一般子類也會重寫該方法。
重寫過程,我也詳細的講解和分析了。
但是最終還是自動生成。
package cn.itcast_03;
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
// @Override
// public boolean equals(Object obj) {
// // return true;
// //這裡要改進,根據這裡比較的成員變數來決定返回true還是false
// //這裡其實要比價的就是name和age
// //但是,name是String型別的,而String是引用型別的,所以,在這裡不能直接用==比較,應該用equals()比較
// //String的equals()方法是重寫自Object類的,比較的是字串的內容是否相同
// //this -- s1
// //obj -- s2
// //我們要使用的是學生類的特有成員變數,所以要向下轉型
// Student s = (Student)obj; //s -- obj -- s2;
// if(this.name.equals(s.name) && this.age == s.age) {
// return true;
// }else {
// return false;
// }
// }
// @Override
// public boolean equals(Object obj) {
// //為了提高效率
// if(this == obj){
// return true;
// }
//
// //為了提供程式的健壯性
// //我先判斷一下,obj是不是學生的一個物件,如果是,再做向下轉型,如果不是,直接返回false。
// //這個時候,我們要判斷的是物件是否是某個類的物件?
// //記住一個格式:物件名 instanceof 類名
// //表示:判斷該物件名是否是該類名一個物件
// if(!(obj instanceof Student)){
// return false;
// }
// //如果是就繼續
//
// Student s = (Student)obj;
// //System.out.println("同一個物件,還需要向下轉型並比較嗎?");
// return this.name.equals(s.name) && this.age == s.age;
// }
}
package cn.itcast_03;
/*
* public boolean equals(Object obj):指示其他某個物件是否與此物件“相等”。
* 這個方法,預設情況下比較的是地址值。比較地址值一般來說意義不大,所以我們要重寫該方法。
* 怎麼重寫呢?
* 一般都是用來比較物件的成員變數值是否相同。
* 重寫的程式碼優化:提高效率,提高程式的健壯性。
* 最終版:
* 其實還是自動生成。
*
* 看原始碼:
* public boolean equals(Object obj) {
* //this - s1
* //obj - s2
* return (this == obj);
* }
*
* ==:
* 基本型別:比較的就是值是否相同
* 引用型別:比較的就是地址值是否相同
* equals:
* 引用型別:預設情況下,比較的是地址值。
* 不過,我們可以根據情況自己重寫該方法。一般重寫都是自動生成,比較物件的成員變數值是否相同
*/
public class StudentDemo {
public static void main(String[] args) {
Student s1 = new Student("林青霞", 27);
Student s2 = new Student("林青霞", 27);
System.out.println(s1 == s2); // false
Student s3 = s1;
System.out.println(s1 == s3);// true
System.out.println("---------------");
System.out.println(s1.equals(s2)); // obj = s2; //false
System.out.println(s1.equals(s1)); // true
System.out.println(s1.equals(s3)); // true
Student s4 = new Student("風清揚",30);
System.out.println(s1.equals(s4)); //false
Demo d = new Demo();
System.out.println(s1.equals(d)); //ClassCastException
}
}
class Demo {}
(4)要了解的方法:
A:hashCode() 返回物件的雜湊值。不是實際地址值,可以理解為地址值。
B:getClass() 返回物件的位元組碼檔案物件,反射中我們會詳細講解
C:finalize() 用於垃圾回收,在不確定的時間
D:clone() 可以實現物件的克隆,包括成員變數的資料複製,但是它和兩個引用指向同一個物件是有區別的。
package cn.itcast_04;
public class Student implements Cloneable {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package cn.itcast_01;
/*
* Object:類 Object 是類層次結構的根類。每個類都使用 Object 作為超類。
* 每個類都直接或者間接的繼承自Object類。
*
* Object類的方法:
* public int hashCode():返回該物件的雜湊碼值。
* 注意:雜湊值是根據雜湊演算法計算出來的一個值,這個值和地址值有關,但是不是實際地址值。
* 你可以理解為地址值。
*
* public final Class getClass():返回此 Object 的執行時類
* Class類的方法:
* public String getName():以 String 的形式返回此 Class 物件所表示的實體
*/
public class StudentTest {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(s1.hashCode()); // 11299397
Student s2 = new Student();
System.out.println(s2.hashCode());// 24446859
Student s3 = s1;
System.out.println(s3.hashCode()); // 11299397
System.out.println("-----------");
Student s = new Student();
Class c = s.getClass();
String str = c.getName();
System.out.println(str); // cn.itcast_01.Student
//鏈式程式設計
String str2 = s.getClass().getName();
System.out.println(str2);
}
}
package cn.itcast_04;
/*
* protected void finalize():當垃圾回收器確定不存在對該物件的更多引用時,由物件的垃圾回收器呼叫此方法。用於垃圾回收,但是什麼時候回收不確定。
* protected Object clone():建立並返回此物件的一個副本。
* A:重寫該方法
*
* Cloneable:此類實現了 Cloneable 介面,以指示 Object.clone() 方法可以合法地對該類例項進行按欄位複製。
* 這個介面是標記介面,告訴我們實現該介面的類就可以實現物件的複製了。
*/
public class StudentDemo {
public static void main(String[] args) throws CloneNotSupportedException {
//建立學生物件
Student s = new Student();
s.setName("林青霞");
s.setAge(27);
//克隆學生物件
Object obj = s.clone();
Student s2 = (Student)obj;
System.out.println("---------");
System.out.println(s.getName()+"---"+s.getAge());
System.out.println(s2.getName()+"---"+s2.getAge());
//以前的做法
Student s3 = s;
System.out.println(s3.getName()+"---"+s3.getAge());
System.out.println("---------");
//其實是有區別的
s3.setName("劉意");
s3.setAge(30);
System.out.println(s.getName()+"---"+s.getAge());
System.out.println(s2.getName()+"---"+s2.getAge());
System.out.println(s3.getName()+"---"+s3.getAge());
}
}
(5)兩個注意問題;
A:直接輸出一個物件名稱,其實預設呼叫了該物件的toString()方法。
B:面試題
==和equals()的區別?
A:==
基本型別:比較的是值是否相同
引用型別:比較的是地址值是否相同
B:equals()
只能比較引用型別。預設情況下,比較的是地址值是否相同。
但是,我們可以根據自己的需要重寫該方法。