香港網(wǎng)站建設(shè)展覽營銷策劃書
認(rèn)識類
類是用來對一個實(shí)體 ( 對象 ) 來進(jìn)行描述的,主要描述該實(shí)體(對象)具有哪些屬性(外觀尺寸等),哪些功能(用來干啥)
類中包含的內(nèi)容稱為 類的成員。屬性主要是用來描述類的,稱之為 類的成員屬性或者 類成員變量。方法主要說明類具有哪些功能,稱為 類的成員方法。
在 java 中定義類時需要用到 class 關(guān)鍵字。
語法:

class為定義類的關(guān)鍵字,ClassName為類的名字,{}中為類的主體。
? ? 類名注意采用大駝峰定義成員前寫法統(tǒng)一為 public.? ?此處寫的方法不帶 static 關(guān)鍵字.
public class Dog { //定義類//類的成員屬性public String name;//名字public int age;//年齡public String color;//顏色//類的成員方法//吃飯public void eat(){System.out.println("搖尾巴");}//叫聲public void bark(){System.out.println("汪汪汪");}
}
1. 一般一個文件當(dāng)中只定義 一個類2. main方法所在的類一般要使用public修飾(注意:Eclipse默認(rèn)會在public修飾的類中找main方法)3. public修飾的類必須要和文件名相同
類的實(shí)例化
定義了一個類,就相當(dāng)于在計算機(jī)中定義了一種新的類型,與int,double類似,只不過int和double是java語言自帶的內(nèi)置類型,而類是 用戶自定義了一個新的類型,有了這些自定義的類型之后,就可以使用這些類來定義實(shí)例(或者稱為對象)。
用類類型創(chuàng)建對象的過程,稱為類的實(shí)例化,在java中采用 new關(guān)鍵字,配合類名來實(shí)例化對象。
語法:

objectName
是為新創(chuàng)建的對象指定的變量名 new 關(guān)鍵字用于創(chuàng)建一個對象的實(shí)例.使用 “ .? ”來訪問對象中的屬性和方法.對象名.類的成員名
同一個類可以創(chuàng)建多個實(shí)例
類和對象的說明
1. 類只是一個 模型一樣的東西,用來對一個實(shí)體進(jìn)行描述,限定了類有哪些成員.
2. 類是一種自定義的類型,可以用來定義變量.
3. 一個類可以實(shí)例化出多個對象, 實(shí)例化出的對象 占用實(shí)際的物理空間,存儲類成員變量
類實(shí)例化出對象就像現(xiàn)實(shí)中使用建筑設(shè)計圖建造出房子,類就像是設(shè)計圖。
public static void main(String[] args){//類的實(shí)例化2Dog dog=new Dog();dog.name="大黃";dog.age=3;dog.color="yellow";dog.eat();//類的實(shí)例化3Dog dog2=new Dog();dog2.name="黑虎";dog2.age=5;dog2.color="black";dog2.bark();}
this引用
當(dāng) 形參名與成員變量名相同,根據(jù) 就近原則,出現(xiàn)錯誤



this 引用指向當(dāng)前對象 ( 成員方法運(yùn)行時調(diào)用該成員方法的對象 ) ,在成員方法中所有成員變量的操作,都是通過該 引用去訪問。
1. this的類型:對應(yīng)類類型引用,即哪個對象調(diào)用就是哪個對象的引用類型2. this只能在"成員方法"中使用3. 在"成員方法"中,this只能引用當(dāng)前對象,不能再引用其他對象4. this是“成員方法”第一個隱藏的參數(shù),編譯器會自動傳遞,在成員方法執(zhí)行時,編譯器會負(fù)責(zé)將調(diào)用成員方法對象的引用傳遞給該成員方法,this負(fù)責(zé)來接收。

對象的構(gòu)造及初始化
構(gòu)造方法
構(gòu)造方法(也稱為構(gòu)造器)是一個特殊的成員方法
完成一個對象的構(gòu)造,分兩步:1.分配內(nèi)存2.調(diào)用合適的構(gòu)造方法
所以構(gòu)造方法的作用就是對對象中的成員進(jìn)行初始化,并不負(fù)責(zé)給對象開辟空間。
名字必須與類名相同沒有返回值類型,設(shè)置為void也不行一般情況下使用public修飾在創(chuàng)建對象時,由編譯器自動調(diào)用,并且在整個對象的生命周期內(nèi)只調(diào)用 一次構(gòu)造方法之間可以構(gòu)成方法重載(用戶根據(jù)自己的需求提供不同參數(shù)的構(gòu)造方法)
名字相同,參數(shù)列表不同,因此構(gòu)成了方法重載
public class Dog { //定義類//類的成員屬性public String name;//名字public int age;//年齡public String color;//顏色//無參構(gòu)造方法public Dog(){// 1// 無參構(gòu)造方法--內(nèi)部給各個成員賦值初始值,該部分功能與三個參數(shù)的構(gòu)造方法重復(fù)// 此處可以在無參構(gòu)造方法中通過this調(diào)用帶有三個參數(shù)的構(gòu)造方法// 但是this("小灰",6,"yellow");必須是構(gòu)造方法中第一條語句this("小灰",6,"yellow");// //2// this.name="小灰";// this.age=6;// this.color="yellow";}//帶三個參數(shù)的構(gòu)造方法public Dog(String name,int age,String color){this.name=name;this.age=age;this.color=color;}//打印public void Print(){System.out.println("name:"+this.name+" age:"+this.age+" color:"+this.color);}public static void main(String[] args){//此次創(chuàng)建一個Dog類型的對象,并沒有顯示調(diào)用構(gòu)造方法Dog dog5=new Dog();//Dog()構(gòu)造方法被調(diào)用dog5.Print();Dog dog6=new Dog("小白",9,"black");//Dog(String,int,String)構(gòu)造方法被調(diào)用dog6.Print();}
}
this();調(diào)用當(dāng)前類的其他構(gòu)造方法,只能在當(dāng)前的構(gòu)造方法內(nèi)部第一行使用
this.field 訪問當(dāng)前對象的屬性
this.method() 調(diào)用當(dāng)前對象的方法
this();調(diào)用不能形成環(huán)
//errpublic Dog() {this("小灰",6,"yellow");}public Dog(String name,int age,String color){this();}//無參構(gòu)造器調(diào)用三個參數(shù)的構(gòu)造器,而三個參數(shù)構(gòu)造器有調(diào)用無參的構(gòu)造器,形成構(gòu)造器的遞歸調(diào)用//編譯報錯:java: 遞歸構(gòu)造器調(diào)用
默認(rèn)初始化
在Java方法內(nèi)部定義一個局部變量時,必須要初始化,否則會編譯失敗
public static void main(String[] args){int a;System.out.println(a);
}//error java: 可能尚未初始化變量a
但我們發(fā)現(xiàn)成員變量未初始化仍然可以編譯成功,這是為什么?
public static void main(String[] args){Dog dog4=new Dog();System.out.println("name:"+dog4.name+" age:"+dog4.age+" color:"+dog4.color);
}
當(dāng)成員變量未初始化時:
? ? ?引用類型一般默認(rèn)為null
? ? ?基本類型一般為自己的0值
一個類中無構(gòu)造方法,java會自動提供一個不帶參數(shù)的構(gòu)造方法
只要有一個構(gòu)造方法,java不提供任何構(gòu)造方法
我們發(fā)現(xiàn)當(dāng)我們刪去無參構(gòu)造方法時,因?yàn)橛袔齻€參數(shù)構(gòu)造方法的存在,編譯器不提供任何構(gòu)造方法,因此在main方法中調(diào)用Dog()時出現(xiàn)錯誤
Classname objectname = new ClassName() ;
在程序?qū)用嬷皇呛唵蔚囊粭l語句,在JVM層面需要做好多事情,如下:
1. 檢測對象對應(yīng)的類是否加載了,如果沒有加載則加載
2. 為對象分配內(nèi)存空間
3. 處理并發(fā)安全問題
比如:多個線程同時申請對象,JVM要保證給對象分配的空間不沖突
4. 初始化所分配的空間
即:對象空間被申請好之后,對象中包含的成員已經(jīng)設(shè)置好了初始值
數(shù)據(jù)類型? | 默認(rèn)值 |
---|---|
byte | 0 |
char? | '\u0000' |
short | 0 |
int | 0 |
long | 0L |
boolean | false |
float | 0.0f |
double | 0.0 |
reference | null |
5.?設(shè)置對象頭信息
6. 調(diào)用構(gòu)造方法,給對象中各個成員賦值
就地初始化
在聲明成員變量時,就直接給出了初始值。
代碼編譯完成后,編譯器會將所有給成員初始化的這些語句添加到各個構(gòu)造函數(shù)中
封裝
封裝:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對外公開接口來和對象進(jìn)行交互
private
封裝:對類的成員進(jìn)行隱藏,通過關(guān)鍵字private,只是對類外提供公開的接口
意義:可以隱藏類的實(shí)現(xiàn)細(xì)節(jié),從而達(dá)到安全性。
范圍:只能在當(dāng)前類中使用
如果成員被private封裝,怎樣在當(dāng)前類外使用?
可以使用get方法(獲取),set方法(修改),通過調(diào)用get方法和set方法,從而達(dá)到在類外使用被private封裝的成員。
快速生成方法的快捷步驟:


public class Dog {private String name;//名字private int age;//年齡public String color;//顏色//獲取name成員public String getName() {return name;}//修改name成員public void setName(String name) {this.name = name;}//獲取age成員public int getAge() {return age;}//修改age成員public void setAge(int age) {this.age = age;}
}class test{public static void main(String[] args) {Dog dog=new Dog();dog.setName("大黃");//調(diào)用setName方法,修改name成員System.out.println(dog.getName());//調(diào)用getName方法,獲取name成員dog.setAge(8);//調(diào)用setAge方法,修改age成員System.out.println(dog.getAge());//調(diào)用setAge方法,獲取age成員}
}
訪問限定符
主要限定:類或者類中成員能否在類外或者其他包中被訪問。
Java中主要通過類和訪問權(quán)限來實(shí)現(xiàn)封裝:1. 類可以將數(shù)據(jù)以及封裝數(shù)據(jù)的方法結(jié)合在一起2. 訪問權(quán)限用來控制方法或者字段能否直接在類外使用
范圍/訪問限定符 | private | default | protected | public |
同一包中的同一類 | 是 | 是 | 是 | 是 |
同一包中的不同類 | 是 | 是 | 是 | |
不同包中的子類 | 是 | 是 | ||
不同包中的非子類 | 是 |
public:可以理解為一個人的外貌特征,誰都可以看得到
default: 對于自己家族中(同一個包中)不是什么秘密,對于其他人來說就是隱私了
private:只能在當(dāng)前類中使用
protected主要是用在繼承中default權(quán)限指:什么都不寫時的默認(rèn)權(quán)限訪問權(quán)限除了可以限定類中成員的可見性,也可以控制類的可見性
封裝擴(kuò)展之包
包的概念
為了更好的管理類,把 多個類收集在一起成為一組,稱為軟件包。
包是對類、接口等的封裝機(jī)制的體現(xiàn),是一種對類或者接口等的很好的組織方式
在同一個工程中允許存在 相同名稱的類,只要處在不同的包中即可
常見包
1. java.lang:系統(tǒng)常用基礎(chǔ)類(String、Object),此包從JDK1.1后自動導(dǎo)入。
2. java.lang.reflect:java 反射編程包;
3. java.net:進(jìn)行網(wǎng)絡(luò)編程開發(fā)包。
4. java.sql:進(jìn)行數(shù)據(jù)庫開發(fā)的支持包。
5. java.util:是java提供的工具程序包。(集合類等) 非常重要
6. java.io:I/O編程開發(fā)包。
導(dǎo)入包中的類
Java 中已經(jīng)提供了很多現(xiàn)成的類供我們使用. 例如Date類
1. 使用 完整類名java.util.Date 導(dǎo)入 java.util 這個包中的 Date類

?2.??使用 import語句導(dǎo)入包.
3.?如果需要使用 java.util 中的其他類, 可以使用 import java.util.*
但util 和 sql 中都存在一個 Date 這樣的類, 同時使用時就會出現(xiàn)歧義, 編譯出錯

這時我們可以使用 完整的類名解決引用不明確這個問題
使用 import static導(dǎo)入包中靜態(tài)的方法和字段
import static java.lang.Math.*;//導(dǎo)入java.lang.Math中的所有類
public class Test {public static void main(String[] args) {double x=3;double y=4;double a=Math.sqrt(Math.pow(x,2)+Math.pow(y,2)); //a=5double b=sqrt(pow(x,2)+pow(y,2));//靜態(tài)導(dǎo)入 //b=5System.out.println(a);System.out.println(b);
}
import 和 C++ 的 #include 差別很大. C++ 必須使用?#include 來引入其他文件內(nèi)容, 但是 Java 不需要. import 只是為了寫代碼的時候更方便. import 更類似于 C++ 的 namespace 和 using
自定義包
基本規(guī)則
1. 在文件的最上方加上一個 package 語句指定該代碼在哪個包中.2. 包名需要盡量指定成唯一的名字, 通常會用公司的域名的顛倒形式(例如 com.bit.demo1 ).3. 包名要和代碼路徑相匹配. 例如創(chuàng)建 com.bit.demo1 的包, 那么會存在一個對應(yīng)的路徑 com/bit/demo1 來存儲代碼.4. 如果一個類沒有 package 語句, 則該類被放到一個默認(rèn)包中.
操作步驟:
1. 在 IDEA 中先新建一個包: 右鍵 src -> 新建 -> 包

2. 在彈出的對話框中輸入包名, 例如 com.bit.demo1
3. 在包中創(chuàng)建類, 右鍵包名 -> 新建 -> 類, 然后輸入類名即可
包的訪問權(quán)限控制舉例
package com.bit.demo1;public class Dog {private String name;//名字private int age;//年齡public String color;//顏色String sex;//default屬性public Dog(String name,int age,String color,String sex){this.name=name;this.age=age;this.color=color;this.sex=sex;}//吃飯private void eat(){System.out.println("搖尾巴");}//叫聲public void bark(){System.out.println("汪汪汪");}//睡覺void sep(){System.out.println("睡覺");}public static void main(String[] args) {Dog dog=new Dog("大黃",3,"yellow","男");System.out.println(dog.name);System.out.println(dog.age);System.out.println(dog.color);System.out.println(dog.sex);dog.eat();dog.bark();dog.sep();}
}
package com.bit.demo1;public class TestDog {public static void main(String[] args) {Dog dog=new Dog("大黃",3,"yellow","男");System.out.println(dog.color);// System.out.println(dog.name);//err name是私有的,不允許被其他類訪問System.out.println(dog.sex);// sex是default,允許被同一包中的不同類訪問dog.bark();// dog.eat();//errdog.sep();}
}
package com.bit.demo2;
import com.bit.demo1.Dog;
public class TestDog {public static void main(String[] args) {Dog dog=new Dog("大黃",3,"yellow","男");System.out.println(dog.color);// System.out.println(dog.name);//err name是私有的,不允許被其他類訪問// System.out.println(dog.sex);//err sex是default,不允許被其他包中的類訪問dog.bark();// dog.eat();//err// dog.sep();//err}
}
? ? ? ?
? ? ??
static 成員
在Java中, 被 static 修飾的成員,稱之為 靜態(tài)成員,也可以稱為 類成員,其不屬于某個具體的對象,是所有對象所 共享的。
public class Dog {//非靜態(tài)成員變量public String name;//名字public int age;//年齡public String color;//顏色//靜態(tài)成員變量(類成員)private static String species;public Dog(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}public void print(){System.out.println("name:"+this.name+" age:"+this.age+" color:"+this.color+" species:"+Dog.species);}public static void main(String[] args) {Dog.species="中華田園犬";Dog dog1 = new Dog("大黃",1,"yellow");dog1.print();Dog dog2 = new Dog("小灰",2,"black");dog2.print();Dog dog3= new Dog("小白",3,"brown");dog3.print();}
}
static只能修飾成員變量: 一般類中的數(shù)據(jù)成員都設(shè)置為 private,而成員方法設(shè)置為public
【靜態(tài)成員變量(類變量)特性】
1. 不屬于某個具體的對象,是 類變量,所有對象共享的,不存儲在某個對象的空間中
2. 既可以通過 對象訪問,也可以通過 類名訪問,但一般更推薦使用類名訪問
3. 類變量存儲在 方法區(qū)當(dāng)中
4. 生命周期伴隨類的一生(即:隨類的加載而創(chuàng)建,隨類的卸載而銷毀)
【靜態(tài)成員方法特性】 ?
1. 不屬于某個具體的對象,是 類方法
2. 可以通過 對象調(diào)用,也可以通過 類名 .靜態(tài)方法名(...)方式調(diào)用,更推薦使用后者
3. 不能 直接在 靜態(tài)方法中訪問任何 非靜態(tài)成員變量或者調(diào)用 非靜態(tài)成員方法。
(可以通過 對象在靜態(tài)方法中訪問 非靜態(tài)成員變量或者調(diào)用 非靜態(tài)成員方法)
非靜態(tài)方法有this參數(shù),在靜態(tài)方法中調(diào)用時無法傳遞this引用,所以static方法中不能使用this
4.靜態(tài)方法無法重寫,不能用來實(shí)現(xiàn)多態(tài)
public class Dog {//非靜態(tài)成員變量public String name;//名字public int age;//年齡public String color;//顏色//靜態(tài)成員變量(類成員)private static String species;//非靜態(tài)成員方法public void eat(){System.out.println("搖尾巴");}//靜態(tài)成員方法(類成員)public static void sleep(){System.out.println("睡覺");//age=10;//err 無法從靜態(tài)上下文中引用非靜態(tài) 變量 age//eat();//err 無法從靜態(tài)上下文中引用非靜態(tài)方法 eat()Dog dog=new Dog();System.out.println(dog.name="小花");dog.eat();}public static void main(String[] args) {//通過對象訪問Dog dog0=new Dog();System.out.println(dog0.species="中華田園犬");dog0.sleep();//通過類名訪問System.out.println(Dog.species="獵犬");Dog.sleep();}
}
代碼塊
代碼塊概念以及分類
使用 {} 定義的一段代碼稱為代碼塊。根據(jù)代碼塊定義的位置以及關(guān)鍵字,又可分為以下四種:
1. 普通代碼塊
普通代碼塊通常指的是由大括號
{}
包圍的一段代碼,它定義了一組可以一起執(zhí)行的語句。這種代碼塊可以出現(xiàn)在方法體內(nèi)部,也可以作為 if
、 else
、 for
、 while
、 do-while
等控制流語句的一部分。 2. 構(gòu)造塊
定義在類中的代碼塊(不加修飾符)。也叫: 實(shí)例代碼塊。 構(gòu)造代碼塊一般用于初始化實(shí)例成員變量
實(shí)例代碼塊只有在 創(chuàng)建對象時才會執(zhí)行
3. 靜態(tài)塊
使用static定義的代碼塊稱為靜態(tài)代碼塊。 一般用于初始化靜態(tài)成員變量。
靜態(tài)代碼塊不管生成多少個對象,其 只會執(zhí)行一次靜態(tài)成員變量是類的屬性,因此是在JVM加載類時開辟空間并初始化的如果一個類中包含多個靜態(tài)代碼塊,在編譯代碼時,編譯器會按照定義的先后次序依次執(zhí)行(合并)靜態(tài)代碼塊只要類被加載,就會被執(zhí)行
public class Dog {//非靜態(tài)成員變量public String name;//名字public int age;//年齡public String color;//顏色//靜態(tài)成員變量(類成員)private static String species;//構(gòu)造代碼塊(實(shí)例代碼塊){this.name="小黑";this.age=2;this.color="yellow";System.out.println("這是實(shí)例代碼塊");}//靜態(tài)代碼塊static {species="牧羊犬";System.out.println("這是靜態(tài)代碼塊");}static {species="運(yùn)動犬";System.out.println("這是靜態(tài)代碼塊2");}//構(gòu)造方法public Dog() {this.name = name;this.age = age;this.color = color;System.out.println("這是構(gòu)造方法");}public void print(){System.out.println("name:"+this.name+" age:"+this.age+" color:"+this.color+" species:"+Dog.species);}public static void main(String[] args) {Dog dog1 = new Dog();dog1.print();Dog dog2 = new Dog();dog2.print();
}
根據(jù)編譯結(jié)果我們可以得到
運(yùn)行時執(zhí)行順序?yàn)?#xff1a;靜態(tài)代碼塊 實(shí)例代碼塊? 構(gòu)造方法
靜態(tài)代碼塊只執(zhí)行一次
public static void main(String[] args) {System.out.println(Dog.species);
}
當(dāng)我們只加載類時,靜態(tài)代碼塊就會被執(zhí)行,而實(shí)例代碼塊只有在創(chuàng)建對象時才會執(zhí)行
4. 同步代碼塊(后續(xù)講解多線程部分再談)