Java類(lèi)的定義規(guī)則和使用;
//[類(lèi)修飾符] class 類(lèi)名{ 類(lèi)的成員
public class Demo {
? ? public int a;//成員變量(屬性)
? ? public void show(){? //成員方法(方法)
? ? }
? ? class Inner{ ?? ///嵌套類(lèi)(了解即可)
? ? }
? ? {
? ? ? ? System.out.println(); ?? //代碼塊(了解即可)
? ? }
}
編碼規(guī)范:
類(lèi)名單詞首字母大寫(xiě)
屬性和方法第一個(gè)單詞小寫(xiě),其他單詞首字母大寫(xiě)

屬性和局部變量對(duì)比


課堂演示

根據(jù)需求編寫(xiě)類(lèi):
西游記游戲軟件中的游戲人物包括:
孫悟空:孫悟空的武器是金箍棒,戰(zhàn)斗力五顆星,耐力五顆星
唐? 僧:唐僧沒(méi)有武器,戰(zhàn)斗力為零,耐力五顆星
豬八戒:豬八戒的武器是耙子,戰(zhàn)斗力四顆星,耐力兩顆星
沙? 僧:沙僧的武器是月牙鏟 ,戰(zhàn)斗力三顆星,耐力四顆星
package com.neusoft.test2;
public class Player {
private String name;
private String weapon;
private? String atk="";
private String endurance="";
public void setWeapon(String weapon) {
this.weapon=weapon;
}
public String getWeapon() {
return this.weapon;
}
// 輸入數(shù)字 確定攻擊力幾星
public void setAtk(int n) {
for(int i=0;i<n;i++) {
atk+="*";
}
}
public void setEndurance(int n) {
for(int i=0;i<n;i++) {
this.endurance+="*";
}
}
//獲得值
public String getName() {
return name;
}
//賦值
public void setName(String name) {
this.name = name;
}
public void say() {
System.out.println(name+"的武器是"+weapon+"戰(zhàn)斗力:"+atk+",耐力:"+endurance);
}
}
測(cè)試類(lèi)
package com.neusoft.test2;
public class test3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
method2();
}
// 初始化人物
public static void method2() {
Player tangseng=? new Player();
tangseng.setName("唐僧");
tangseng.setWeapon("無(wú)");
tangseng.setAtk(0);
tangseng.setEndurance(5);;
Player sunwukong=? new Player();
sunwukong.setName("孫悟空");
sunwukong.setWeapon("金箍棒");
// sunwukong.atk="*****";
sunwukong.setAtk(5);
sunwukong.setEndurance(5);
Player zhubajie=? new Player();
zhubajie.setName("豬八戒");
zhubajie.setWeapon("耙子");
zhubajie.setAtk(4);
zhubajie.setEndurance(2);
Player shaseng=? new Player();
shaseng.setName("沙僧");
shaseng.setWeapon("月牙鏟");
shaseng.setAtk(3);
shaseng.setEndurance(4);
tangseng.say();
sunwukong.say();
zhubajie.say();
shaseng.say();
}
}
認(rèn)識(shí)對(duì)象
類(lèi)和對(duì)象的關(guān)系
類(lèi)是創(chuàng)建對(duì)象的模板,對(duì)象是類(lèi)的實(shí)例。

對(duì)象的創(chuàng)建

對(duì)象的使用

課堂練習(xí)
編寫(xiě)一個(gè)商品的類(lèi),要求包含商品名稱(chēng)和商品價(jià)格,并且編寫(xiě)一個(gè)方法能夠在控制臺(tái)輸出“商品名:價(jià)格”。并在主函數(shù)中調(diào)用。
輸出示例:
可樂(lè):2.5
鼠標(biāo):50
private String name;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public void printinfo() {
System.out.println(name+":"+price);
}
}
測(cè)試類(lèi)
package com.neusoft.Test3;
public class test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//測(cè)試類(lèi)
method1();
}
public static void method1() {
// 輸出示例:
// 可樂(lè):2.5
// 鼠標(biāo):50
test1 cola =new test1();
cola.setName("可樂(lè)");
cola.setPrice(2.5);
test1 mouse =new test1();
mouse.setName("鼠標(biāo)");
mouse.setPrice(50);
cola.printinfo();
mouse.printinfo();
}
}
創(chuàng)建對(duì)象原理

對(duì)象的創(chuàng)建

對(duì)象的創(chuàng)建和使用

創(chuàng)建多個(gè)對(duì)象

創(chuàng)建匿名對(duì)象

垃圾回收機(jī)制


Finalize()
注意:如果你熟悉C++,那你知道C++允許你為一個(gè)類(lèi)定義一個(gè)撤消函數(shù)(destructor ),它在對(duì)象正好出作用域之前被調(diào)用。Java不支持這個(gè)想法也不提供撤消函數(shù)。finalize() 方法只和撤消函數(shù)的功能接近。當(dāng)你對(duì)Java 有豐富經(jīng)驗(yàn)時(shí),你將看到因?yàn)镴ava使用垃圾回收子系統(tǒng),幾乎沒(méi)有必要使用撤消函數(shù)。
finalize的工作原理應(yīng)該是這樣的:一旦垃圾收集器準(zhǔn)備好釋放對(duì)象占用的存儲(chǔ)空間,它首先調(diào)用finalize(),而且只有在下一次垃圾收集過(guò)程中,才會(huì)真正回收對(duì)象的內(nèi)存.所以如果使用finalize(),就可以在垃圾收集期間進(jìn)行一些重要的清除或清掃工作.
finalize()在什么時(shí)候被調(diào)用?有三種情況1.所有對(duì)象被Garbage Collection時(shí)自動(dòng)調(diào)用,比如運(yùn)行System.gc()的時(shí)候.2.程序退出時(shí)為每個(gè)對(duì)象調(diào)用一次finalize方法。3.顯式的調(diào)用finalize方法
除此以外,正常情況下,當(dāng)某個(gè)對(duì)象被系統(tǒng)收集為無(wú)用信息的時(shí)候,finalize()將被自動(dòng)調(diào)用,但是jvm不保證finalize()一定被調(diào)用,也就是說(shuō),finalize()的調(diào)用是不確定的,這也就是為什么sun不提倡使用finalize()的原因
練習(xí)
程序段1:
1.fobj = new Object ( ) ;
2.fobj. Method ( ) ;
3.fobj = new Object ( ) ;
4.fobj. Method ( ) ;
問(wèn):這段代碼中,第幾行的fobj 符合垃圾收集器的收集標(biāo)準(zhǔn)?
答:第3行。因?yàn)榈?行的fobj被賦了新值,產(chǎn)生了一個(gè)新的對(duì)象,即換了一塊新的內(nèi)存空間,也相當(dāng)于為第1行中的fobj賦了null值。這種類(lèi)型的題在認(rèn)證0考試中是最簡(jiǎn)單的。
程序段2:
1.Object sobj = new Object ( ) ;
2.Object sobj = null ;
3.sobj = new Object ( ) ;
4.sobj = new Object ( ) ;
問(wèn):這段代碼中,第幾行的內(nèi)存空間符合垃圾收集器的收集標(biāo)準(zhǔn)?
答:第2行和第4行。因?yàn)榈?行為sobj賦值為null,所以在此第1行的sobj符合垃圾收集器的收集標(biāo)準(zhǔn)。而第4行相當(dāng)于為sobj賦值為null,所以在此第3行的sobj也符合垃圾收集器的收集標(biāo)準(zhǔn)。
如果有一個(gè)對(duì)象的句柄a,且你把a(bǔ)作為某個(gè)構(gòu)造器的參數(shù),即 new Constructor ( a )的時(shí)候,即使你給a賦值為null,a也不符合垃圾收集器的收集標(biāo)準(zhǔn)。直到由上面構(gòu)造器構(gòu)造的新對(duì)象被賦空值時(shí),a才可以被垃圾收集器收集。
程序段3:
1.Object aobj =?new Object ( )?;
2.Object bobj = new Object ( ) ;
3.Object cobj =?new Object ( ) ;
4.a(chǎn)obj = bobj;
5.a(chǎn)obj = cobj;
6.cobj = null;
7.a(chǎn)obj = null;
問(wèn):這段代碼中,第幾行的內(nèi)存空間符合垃圾收集器的收集標(biāo)準(zhǔn)?
答:第4,7行。注意這類(lèi)題型是認(rèn)證考試中可能遇到的最難題型了。
行1-3分別創(chuàng)建了Object類(lèi)的三個(gè)對(duì)象:aobj,bobj,cobj
行4:此時(shí)對(duì)象aobj的句柄指向bobj,原來(lái)aojb指向的對(duì)象已經(jīng)沒(méi)有任何引用或變量指向,這時(shí),就符合回收標(biāo)準(zhǔn)。
行5:此時(shí)對(duì)象aobj的句柄指向cobj,所以該行的執(zhí)行不能使aobj符合垃圾收集器的收集標(biāo)準(zhǔn)。
行6:此時(shí)仍沒(méi)有任何一個(gè)對(duì)象符合垃圾收集器的收集標(biāo)準(zhǔn)。
行7:對(duì)象cobj符合了垃圾收集器的收集標(biāo)準(zhǔn),因?yàn)閏obj的句柄指向單一的地址空間。在第6行的時(shí)候,cobj已經(jīng)被賦值為null,但由cobj同時(shí)還指向了aobj(第5行),所以此時(shí)cobj并不符合垃圾收集器的收集標(biāo)準(zhǔn)。而在第7行,aobj所指向的地址空間也被賦予了空值null,這就說(shuō)明了,由cobj所指向的地址空間已經(jīng)被完全地賦予了空值。所以此時(shí)cobj最終符合了垃圾收集器的收集標(biāo)準(zhǔn)。 但對(duì)于aobj和bobj,仍然無(wú)法判斷其是否符合收集標(biāo)準(zhǔn)。
總之,在Java語(yǔ)言中,判斷一塊內(nèi)存空間是否符合垃圾收集器收集標(biāo)準(zhǔn)的標(biāo)準(zhǔn)只有兩個(gè):
1.給對(duì)象賦予了空值null,以下再?zèng)]有調(diào)用過(guò)。
2.給對(duì)象賦予了新值,既重新分配了內(nèi)存空間。
最后再次提醒一下,一塊內(nèi)存空間符合了垃圾收集器的收集標(biāo)準(zhǔn),并不意味著這塊內(nèi)存空間就一定會(huì)被垃圾收集器收集。
********對(duì)象的使用
構(gòu)造方法

構(gòu)造方法的使用

構(gòu)造方法重載

構(gòu)造方法調(diào)用

構(gòu)造方法使用

課堂練習(xí)

*********實(shí)例
package com.neusoft.Test5;
//類(lèi)名:首字母大寫(xiě)
public class Person {
public? String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 構(gòu)造方法名 與類(lèi)名相同
// 沒(méi)有返回值類(lèi)型 不能void
// 只能在創(chuàng)建對(duì)象new 時(shí),調(diào)用一次
// 構(gòu)造方法與對(duì)象的初始化相關(guān):1.創(chuàng)建對(duì)象時(shí)內(nèi)存分配空間等等準(zhǔn)備
// 2.使用構(gòu)造器可以給成員變量賦值(屬性注入)
//默認(rèn)空參構(gòu)造問(wèn)題
? ? // 1.創(chuàng)建一個(gè)類(lèi) 默認(rèn)有一個(gè)空參構(gòu)造
// 2 如果手寫(xiě)了一個(gè)有參構(gòu)造器 這個(gè)空參構(gòu)造器就沒(méi)有了
// 3 如果手寫(xiě)了一個(gè)有參構(gòu)造器 ,需要手寫(xiě)一個(gè)空參構(gòu)造器,才能調(diào)用空參構(gòu)造器
//構(gòu)造器之間調(diào)用問(wèn)題:1使用this(參數(shù)) 2只能放在構(gòu)造方法的第一行
//一個(gè)構(gòu)造方法只能調(diào)用一個(gè)方法
public Person() {
this(1);
System.out.println("構(gòu)造方法person");
}
// 構(gòu)造方法的重載:參數(shù)個(gè)數(shù),參數(shù)類(lèi)型不同
public Person(int a) {
System.out.println("構(gòu)造方法person int a:" + a);
}
public Person(String a) {
System.out.println("構(gòu)造方法person String a:" + a);
this.name=a;
}
// 普通方法
// 隨便起名建議駝峰命名法 :person personAnimal
// 有返回值類(lèi)型
// 可以使用引用多次調(diào)用
public void Person() {
System.out.println("普通方法 person");
Person(90);
}
// 方法的重載 :同一個(gè)類(lèi)方法名相同 ,參數(shù)個(gè)數(shù),參數(shù)類(lèi)型不同
public void Person(int a) {
System.out.println("普通方法 person int a:" + a);
}
public void Person(String a) {
System.out.println("普通方法 person String a:" + a);
}
}
---------------------------------------------------------------
package com.neusoft.Test5;
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Person p=new Person("tom");
// System.out.println(p.getName());
//
Person p1=new Person();
p1.Person();
p1.setName("jetty");
System.out.println(p1.getName());
// p.Person();
// p.Person(1);
// p.Person("1");
// p.Person("tom");
//
}
}
靜態(tài)方法
示例
package?com.neusoft.test3;
public?class?Test?{
public?static?void?main(String[]?args)?{
Test.Statica=100;
Test?t1=new?Test();
Test?t2=new?Test();
t1.Objecta=10;
t1.Statica=1000;
t2.Objecta=20;
System.out.println("t1.Objecta:"+t1.Objecta);
System.out.println("t2.Objecta:"+t2.Objecta);
System.out.println("t2.Statica:"+t2.Statica);
}
public?int?Objecta;
static?public?int?Statica;
}
答案
t1.Objecta:10
t2.Objecta:20
t2.Statica:1000

Java包的概念
使用包注意問(wèn)題:
在java中位于包中的類(lèi),在文件系統(tǒng)中的存放位置,
? 必須有與包名層次相對(duì)應(yīng)的目錄結(jié)構(gòu)
package語(yǔ)句作為java源文件的第一條語(yǔ)句
每個(gè)源文件只能聲明一個(gè)包
如果沒(méi)有package語(yǔ)句,則默認(rèn)為無(wú)名包
Java類(lèi)庫(kù)中常用的包
java.lang
Java默認(rèn)包,任何程序中,該包都被自動(dòng)導(dǎo)入。
位于同一包中的類(lèi)可以直接訪(fǎng)問(wèn)并使用
訪(fǎng)問(wèn)不同包中的類(lèi)
使用import關(guān)鍵字引入其它包中的類(lèi)
必須在package聲明后面,類(lèi)聲明前面
import語(yǔ)句可以出現(xiàn)多次
優(yōu)先級(jí)順序!
行內(nèi)指定包>引用其他包的具體的類(lèi)>本包中的類(lèi)> 引用其他包通配符
//優(yōu)先級(jí)級(jí)順序
//第一 優(yōu)先級(jí)最高? import com.neusoft.Test2.Person();手動(dòng)引入包
//第二? ? com.neusoft.Test1.Person()當(dāng)前本包內(nèi)的類(lèi)
//第三? ? import com.neusoft.Test2.*; 使用通配符
代碼封裝


示例
package com.neusoft.test1;
public class Score {
String star="";
// 展現(xiàn)評(píng)分對(duì)應(yīng)的星數(shù)
public void printresult() {
System.out.println("感謝您的評(píng)價(jià),您對(duì)客服的評(píng)價(jià)結(jié)果為:"+star);
}
// 輸入對(duì)客服的評(píng)分? 1~5
public void setScore(int score) {
for(int i=0;i<score;i++) {
star+="*";
}
}
}
測(cè)試類(lèi)
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
method4();
}
public static void method4() {
Scanner sc=new Scanner(System.in);
System.out.println("請(qǐng)對(duì)客服打分輸入1~5分:");
int score=sc.nextInt();
Score s=new Score();
s.setScore(score);
s.star="*********";
s.printresult();
}
靜態(tài):static關(guān)鍵字


示例
package com.neusoft.test3;
public class Person {
static String country="China";
String name="tom";
static public void say() {
System.out.println(country);
// System.out.println(name);// 靜態(tài)方法內(nèi)部只能調(diào)用靜態(tài)方法及靜態(tài)屬性
// ? ? ? ? ? ? ? ? ? ? ? ? ? 不能調(diào)用成員方法,成員變量
}
----------
測(cè)試類(lèi)
package com.neusoft.test3;
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// System.out.println(Person.country);
Person.say(); 靜態(tài)方法可直接寫(xiě)
// System.out.println(new Person().name);
}
}

成員方法與靜態(tài)方法區(qū)分
package com.neusoft.test3;
public class People {
public static void main(String[] args) {
new People().method1();
method2();
}
public? void method1() {
System.out.println("成員方法");//需要?jiǎng)?chuàng)建對(duì)象后引用new People().method1(); 與對(duì)象有關(guān)
}
public static void method2() {
System.out.println("靜態(tài)方法");//被static修用飾 可直接 用method2(); 與類(lèi)有關(guān)
}
}


示例
package com.neusoft.test3;
public class Test {
? //靜態(tài)代碼塊
static {
System.out.println("靜態(tài)代碼塊在類(lèi)初始化時(shí)只調(diào)用一次");
}
//代碼塊 (類(lèi)以?xún)?nèi)方法外)對(duì)象初始化
{
System.out.println("代碼塊");
}
// 原理(實(shí)際) 執(zhí)行順序 :靜態(tài)代碼塊---》構(gòu)造器---》代碼塊
// 執(zhí)行結(jié)果 順序 : 靜態(tài)代碼塊 ---》代碼塊---》構(gòu)造器
// 構(gòu)造器 --》對(duì)象初始化
public Test() {
System.out.println("創(chuàng)建對(duì)象是 初始化");
}
public static void main(String[] args) {
Test.Statica=100;
Test t1=new Test();
Test t2=new Test();
t1.Objecta=10;
t1.Statica=1000;
t2.Objecta=20;
System.out.println("t1.Objecta:"+t1.Objecta);
System.out.println("t2.Objecta:"+t2.Objecta);
System.out.println("t2.Statica:"+t2.Statica);
}
public int Objecta;
static public int Statica;
}

單例模式

package com.neusoft.test5;
// 懶加載(懶漢式) 單例模式?
public class SingletonA {
static SingletonA a=null;
//單例模式
// 1 .可以創(chuàng)建多個(gè)對(duì)象,因?yàn)榭梢?new 類(lèi)名()----》將構(gòu)造方法私有化private
private SingletonA() {
}
// 2. 當(dāng)構(gòu)造器私有化后,一個(gè)對(duì)象都不能創(chuàng)建
// ? 類(lèi)的外部不能調(diào)用 構(gòu)造器--------》在類(lèi)的內(nèi)部寫(xiě)一個(gè)public static
// 方法,返回創(chuàng)建的對(duì)象
public static SingletonA getInstance() {
// 3.創(chuàng)建多個(gè)對(duì)象了,----》getInstance 加上判斷邏輯
if(a==null) {
a=new SingletonA();
}else {
}
return a;
}
}
------------------------
測(cè)試
package?com.neusoft.test5;
public?class?Test1?{
public?static?void?main(String[]?args)?{
//?TODO?Auto-generated?method?stub
SingletonA?sa1=SingletonA.getInstance();
SingletonA?sa2=SingletonA.getInstance();
System.out.println(sa1);
System.out.println(sa2);
}
}

-------------------
package com.neusoft.test5;
//積極加載式? (餓漢式)? 單例模式?
public class SingletonB {
// 3.創(chuàng)建對(duì)象時(shí)機(jī)在 static屬性中 -----》在類(lèi)初始化時(shí),執(zhí)行一次
static SingletonB a=new SingletonB();
//單例模式
// 1 .可以創(chuàng)建多個(gè)對(duì)象,因?yàn)榭梢?new 類(lèi)名()----》將構(gòu)造方法私有化private
private SingletonB() {
}
// 2. 當(dāng)構(gòu)造器私有化后,一個(gè)對(duì)象都不能創(chuàng)建
// ? 類(lèi)的外部不能調(diào)用 構(gòu)造器--------》在類(lèi)的內(nèi)部寫(xiě)一個(gè)public static
// 方法,返回創(chuàng)建的對(duì)象
public static SingletonB getInstance() {
return a;
}
}

1、定義一個(gè)點(diǎn)類(lèi)Point,包含2個(gè)成員變量x、y分別表示x和y坐標(biāo),2個(gè)構(gòu)造器Point()和Point(int x0,y0),以及一個(gè)movePoint(int dx,int dy)方法實(shí)現(xiàn)點(diǎn)的位置移動(dòng),創(chuàng)建兩個(gè)Point對(duì)象p1、p2,分別調(diào)用movePoint方法后,打印p1和p2的坐標(biāo)。[必做題]
2、定義一個(gè)矩形類(lèi)Rectangle: [必做題]
2.1? 定義三個(gè)方法:getArea()求面積、getPer()求周長(zhǎng),showAll()分別在控制臺(tái)輸出長(zhǎng)、寬、面積、周長(zhǎng)。
2.2? 有2個(gè)屬性:長(zhǎng)length、寬width
2.3? 通過(guò)構(gòu)造方法Rectangle(int width, int length),分別給兩個(gè)屬性賦值
2.4? 創(chuàng)建一個(gè)Rectangle對(duì)象,并輸出相關(guān)信息
3、定義一個(gè)筆記本類(lèi),該類(lèi)有顏色(char)和cpu型號(hào)(int)兩個(gè)屬性。 [必做題]
3.1 無(wú)參和有參的兩個(gè)構(gòu)造方法;有參構(gòu)造方法可以在創(chuàng)建對(duì)象的同時(shí)為每個(gè)屬性賦值;
3.2? 輸出筆記本信息的方法
3.3? 然后編寫(xiě)一個(gè)測(cè)試類(lèi),測(cè)試筆記本類(lèi)的各個(gè)方法。
4、定義兩個(gè)類(lèi),描述如下: [必做題]
4.1定義一個(gè)人類(lèi)Person:
4.1.1定義一個(gè)方法sayHello(),可以向?qū)Ψ桨l(fā)出問(wèn)候語(yǔ)“hello,my name is XXX”
4.1.2有三個(gè)屬性:名字、身高、體重
4.2定義一個(gè)PersonCreate類(lèi):
4.2.1創(chuàng)建兩個(gè)對(duì)象,分別是zhangsan,33歲,1.73;lishi,44,1.74
4.2.2分別調(diào)用對(duì)象的sayHello()方法。
1、設(shè)計(jì)一個(gè)類(lèi)Student,該類(lèi)包括姓名、學(xué)號(hào)和成績(jī)。設(shè)計(jì)一個(gè)方法,按照成績(jī)從高到低的順序輸出姓名、學(xué)號(hào)和成績(jī)信息。[選做題]
2、定義一個(gè)汽車(chē)類(lèi)Vehicle,要求如下:[選做題]
2.1屬性包括:汽車(chē)品牌brand(String類(lèi)型)、顏色color(String類(lèi)型)和速度speed(double類(lèi)型),并且所有屬性為私有。
2.2至少提供一個(gè)有參的構(gòu)造方法(要求品牌和顏色可以初始化為任意值,但速度的初始值必須為0)。
2.3為私有屬性提供訪(fǎng)問(wèn)器方法。注意:汽車(chē)品牌一旦初始化之后不能修改。
2.4定義一個(gè)一般方法run(),用打印語(yǔ)句描述汽車(chē)奔跑的功能
2.5定義測(cè)試類(lèi)VehicleTest,在其main方法中創(chuàng)建一個(gè)品牌為“benz”、顏色為“black”的汽車(chē)。