目標讀者
了解 Java 基本數(shù)據(jù)類型
掌握 Java 輸出渤刃、for、if 等基本語法
熟練應(yīng)用函數(shù)贴膘,了解函數(shù)重載等基本知識
熟練使用 IntelliJ IDEA
權(quán)限修飾符
類卖子、成員變量、成員方法最前面的單詞叫做權(quán)限修飾符刑峡,表明從項目的哪些地方可以訪問這個類洋闽、變量、方法突梦。具體見下表:
是否能訪問 | 同一文件 | 同一包 | 子類 | 不同類 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
default(缺式刖恕) | √ | √ | ||
private | √ |
舉例:
類:老師(Teacher)
特征:成員變量:有姓名(name),年齡(age)等屬性
行為:成員方法:講課(teaching)宫患、布置作業(yè)(assignWork)
Class(類)
語法規(guī)則:
// public class xxx
// xxx 自己給類取的名字
public class Teacher{
// 成員變量
String name;
int age;
// 構(gòu)造方法 --- 獲得對象的方法
// 與類同名刊懈,無返回值
// 在用該類實例化一個對象的時候需要被調(diào)用
// 類默認自帶無參構(gòu)造函數(shù)
Teacher(){
}
// 有參構(gòu)造函數(shù)
// 一般是為成員變量賦值
Teacher(String name){
......
}
// 普通成員方法
private void teaching(){
......
}
void assignWork(){
......
}
}
思考:
1.teaching是否可以獲得值 name 或者 age?
根據(jù)變量的作用域可知娃闲,是可以的虚汛。
舉例:
有一個老師,她叫twter皇帮,年齡是18歲
有一個老師卷哩,她叫冠中,年齡是5歲
有一個老師属拾,她叫昕姐将谊,年齡是3歲
對象
對象是描述客觀事物的一個實體,由類實例化來生成渐白。
普通的成員變量和成員方法都是屬于這個對象的尊浓。
即這個對象誕生,屬于這個對象的成員變量和成員方法才誕生礼预。
要通過對象才能獲得成員變量和成員方法眠砾。
構(gòu)造方法
構(gòu)造方法是類與對象的橋梁,構(gòu)造方法和類同名托酸,且沒有返回值褒颈。
在構(gòu)造方法內(nèi)可以進行成員變量的賦值。
通過new調(diào)用構(gòu)造方法可以獲得類的實例化對象励堡。
public class Teacher {
// 成員變量
String name;
int age;
// 構(gòu)造方法
// 默認自帶無參
Teacher() {
}
Teacher(String mname,int mage){
name = mname;
age = mage;
}
}
public class Test {
public static void main(String[] args) {
// 通過new可以生成一個新的具體的類
// 我們稱之為實例化 Teacher 生成一個 Teacher 的對象
Teacher teacher = new Teacher();
Teacher teacher1 = new Teacher();
// teacher 和 teacher1 不是同一個對象
teacher.name = "twter";
teacher.age = 18;
// 執(zhí)行構(gòu)造函數(shù)內(nèi)的語句谷丸,進行賦值
// Teacher的實例化對象 teacher3
// teacher3的name是twter,age是18
Teacher teacher2 = new Teacher("twter", 18);
Teacher teacher3 = new Teacher("greenTea", 12);
}
}
思考:
1.如何獲得一個老師应结,她叫綠茶刨疼,年齡是12歲泉唁。
2.有參構(gòu)造函數(shù)可以寫成如下形式嗎?
public class Teacher {
// 成員變量
String name;
int age;
Teacher(String name,int age){
name = name;
age = age;
}
}
this
代表“當前對象”示例
就可以區(qū)別傳入的參數(shù)“name”和對象自己的“name”揩慕。
public class Teacher {
// 成員變量
String name;
int age;
Teacher(String name,int age){
this.name = name;
this.age = age;
}
}
舉例:
某個老師上課(teaching)的時候會說 name 老師在上課
成員方法
public class Teacher {
// 成員變量
String name;
int age;
Teacher(String name){
this.name = name;
}
Teacher(String name, int age) {
this.name = name;
this.age = age;
}
// 普通成員方法
void teaching() {
System.out.println(name + "is teaching");
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher2 = new Teacher("twter", 18);
Teacher teacher3 = new Teacher("sxbasubx");
teacher2.teaching();
}
}
思考:
1.某個老師布置作業(yè)(assingWork)的時候會說老師布置了 x 道作業(yè)
public class Teacher {
// 成員變量
String name;
int age;
Teacher(String name, int age) {
this.name = name;
this.age = age;
}
void assignWork(int x) {
System.out.println(name + " assign " + x + " number of homework");
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher2 = new Teacher("twter", 18);
teacher2.assignWork(2);
}
}
2.如何保護 name 不被隨意修改亭畜?
public class Teacher {
// 成員變量
private String name;
}
但是我在main函數(shù)里想要獲得老師對象的 name?
public class Teacher {
// 成員變量
private String name;
public String getName() {
return name;
}
}
封裝
要訪問該類的代碼和數(shù)據(jù)迎卤,必須通過嚴格的接口控制拴鸵。
外部可以修改name,比如在main函數(shù)里可以修改name蜗搔,但是必須按照規(guī)定的方式來劲藐。
public class Teacher {
// 成員變量
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
疑惑:那這和我直接用 public 修飾 name 變量有什么區(qū)別吶?
課堂作業(yè)
類:小餅干(cookie)
這個小餅干是由巧克力和抹茶組成的樟凄!
成員變量:價格(price)聘芜,小餅干中巧克力的價格(priceOfChocolate),小餅干中抹茶的價格(priceOfTea)
price = priceOfChocolate + priceOfTea
我想要在main函數(shù)里實例化3個不同價格的巧克力和不同價格抹茶的組成的小餅干對象缝龄。
Coockie | priceOfChocolate | priceOfTea |
---|---|---|
coockie1 | 12.4 | 121 |
coockie2 | 13 | 423 |
Coockie3 | 12937 | 1213.2 |
根據(jù) price 理解封裝的好處汰现。
想要統(tǒng)計生成的餅干數(shù)量?
這個信息應(yīng)該是凌駕于對象上的
static
用static修飾的成員變量和成員方法不再依賴于對象叔壤,而是屬于類本身服鹅。可以直接通過類名獲得
1.靜態(tài)方法里可以使用靜態(tài)成員變量嗎百新?
2.普通(非靜態(tài))方法里可以使用靜態(tài)成員變量嗎?
3.普通方法里可以使用普通成員變量嗎庐扫?
4.靜態(tài)方法里可以使用普通成員變量嗎饭望?
5.普通方法里可以調(diào)用靜態(tài)方法嗎?
6.靜態(tài)方法里可以調(diào)用靜態(tài)方法嗎形庭?
7.靜態(tài)方法里可以調(diào)用普通方法嗎铅辞?
yes yes yes no yes yes no
package xyz.chenshuyusc.course2;
public class Coockie {
private double price;
private double priceOfChocolate;
private double priceOfTea;
private static int count; // = 0
public Coockie() {
++count;
}
public Coockie(double priceOfsth, boolean isTea) {
if (isTea) {
this.priceOfTea = priceOfsth;
} else {
this.priceOfChocolate = priceOfsth;
}
this.price = this.priceOfTea;
++count;
}
public Coockie(double priceOfTea){
this.priceOfTea = priceOfTea;
this.price = this.priceOfTea;
}
public double getPrice() {
return price;
}
public double getPriceOfChocolate() {
return priceOfChocolate;
}
public double getPriceOfTea() {
return priceOfTea;
}
public void setPriceOfChocolate(double priceOfChocolate) {
this.priceOfChocolate = priceOfChocolate;
this.price = this.priceOfChocolate + this.priceOfTea;
}
public void setPriceOfTea(double priceOfTea) {
this.priceOfTea = priceOfTea;
this.price = this.priceOfChocolate + this.priceOfTea;
}
public static int getCount() {
return count;
}
protected void setPrice(double price) {
this.price = price;
}
}
舉例子:
類:甜甜的小餅干
這個小餅干是由巧克力和抹茶組成的甜味小餅干!
成員變量:價格(price)萨醒,小餅干中巧克力的價格(priceOfChocolate)斟珊,小餅干中抹茶的巧克(priceOfTea),糖(priceOfSugar)
類:咸咸的小餅干
這個小餅干是由巧克力和抹茶組成的咸味小餅干富纸!
成員變量:價格(price)囤踩,小餅干中巧克力的價格(priceOfChocolate),小餅干中抹茶的巧克(priceOfTea)晓褪,鹽(priceOfYan)
看起來和之前的小餅干很重合6率!涣仿!
extends ( 繼承 )
子類繼承父類的特征和行為勤庐。
即甜甜的小餅干繼承小餅干示惊,就獲得了小餅干中非private的成員變量和成員方法。
但甜甜的小餅干又比小餅干多了priceOfSugar愉镰。
public class Coockie {
private double price;
private double priceOfChocolate;
private double priceOfTea;
public Coockie() {
}
public Coockie(double priceOfsth, boolean isTea) {
if (isTea) {
this.priceOfTea = priceOfsth;
} else {
this.priceOfChocolate = priceOfsth;
}
this.price = this.priceOfTea;
}
public double getPrice() {
return price;
}
public double getPriceOfChocolate() {
return priceOfChocolate;
}
public double getPriceOfTea() {
return priceOfTea;
}
public void setPriceOfChocolate(double priceOfChocolate) {
this.priceOfChocolate = priceOfChocolate;
this.price = this.priceOfChocolate + this.priceOfTea;
}
public void setPriceOfTea(double priceOfTea) {
this.priceOfTea = priceOfTea;
this.price = this.priceOfChocolate + this.priceOfTea;
}
protected void setPrice(double price) {
this.price = price;
}
}
public class SugarCoockie extends Coockie {
private double priceOfSugar;
public SugarCoockie(double priceOfsth, boolean isTea) {
super(priceOfsth,isTea);
}
public double getPriceOfSugar() {
return priceOfSugar;
}
public void setPriceOfSugar(double priceOfSugar) {
setPrice(getPrice() - this.priceOfSugar + priceOfSugar);
this.priceOfSugar = priceOfSugar;
}
}
子類的構(gòu)造方法必須調(diào)用父類的構(gòu)造方法米罚。
思考:如果要通過子類實例化對象,父類可以沒有構(gòu)造函數(shù)嗎丈探?
Override
子類中包含跟父類方法簽名一樣的方法录择,父類的方法會被覆蓋掉,我們就說該方法被重寫类嗤。如需調(diào)用父類原有的成員方法糊肠,可使用 super 關(guān)鍵字。
public class Coockie {
protected double price;
protected double priceOfChocolate;
protected double priceOfTea;
public Coockie() {
}
public Coockie(double priceOfsth, boolean isTea) {
if (isTea) {
this.priceOfTea = priceOfsth;
} else {
this.priceOfChocolate = priceOfsth;
}
this.price = this.priceOfTea;
}
public double getPrice() {
return price;
}
public double getPriceOfChocolate() {
return priceOfChocolate;
}
public double getPriceOfTea() {
return priceOfTea;
}
public void setPriceOfChocolate(double priceOfChocolate) {
this.priceOfChocolate = priceOfChocolate;
this.price = this.priceOfChocolate + this.priceOfTea;
}
public void setPriceOfTea(double priceOfTea) {
this.priceOfTea = priceOfTea;
this.price = this.priceOfChocolate + this.priceOfTea;
}
public static int getCount() {
return count;
}
protected void setPrice(double price) {
this.price = price;
}
}
public class SugarCoockie extends Coockie {
private double priceOfSugar;
@Override
public void setPriceOfChocolate(double priceOfChocolate) {
this.priceOfChocolate = priceOfChocolate;
this.price = this.priceOfSugar + this.priceOfChocolate + this.priceOfTea;
}
@Override
public void setPriceOfTea(double priceOfTea) {
super.setPriceOfTea(priceOfTea);
this.price = this.priceOfSugar + this.priceOfChocolate + this.priceOfTea;
}
public double getPriceOfSugar() {
return priceOfSugar;
}
public void setPriceOfSugar(double priceOfSugar) {
this.priceOfSugar = priceOfSugar;
this.price = this.priceOfSugar + this.priceOfChocolate + this.priceOfTea;
}
}
Builder 設(shè)計模式
當一個類需要初始化的成員變量比較多遗锣、比較復雜時货裹,僅使用構(gòu)造方法來初始化對象就顯得冗余且難以理解,這里介紹一個經(jīng)典的解決辦法:利用 Builder 設(shè)計模式實現(xiàn)鏈式調(diào)用來獲取對象精偿。
package xyz.chenshuyusc.course2;
public class Coockie {
double price;
double priceOfChocolate;
double priceOfTea;
Choc choc = new Choc();
public Coockie() {
}
public Coockie(double priceOfChocolate, double priceOfTea,Choc choc) {
this.choc = choc;
this.priceOfTea = priceOfTea;
this.priceOfChocolate = priceOfChocolate;
this.price = this.priceOfTea + this.priceOfChocolate;
}
public double getPrice() {
return price;
}
public double getPriceOfChocolate() {
return priceOfChocolate;
}
public double getPriceOfTea() {
return priceOfTea;
}
public void setPriceOfChocolate(double priceOfChocolate) {
choc.price = priceOfChocolate;
this.priceOfChocolate = priceOfChocolate;
this.price = this.priceOfChocolate + this.priceOfTea;
}
public void setPriceOfTea(double priceOfTea) {
this.priceOfTea = priceOfTea;
this.price = this.priceOfChocolate + this.priceOfTea;
}
}
public class CoockieBuilder {
private Coockie coockie = new Coockie();
public CoockieBuilder priceOfTea(double priceOfTea) {
coockie.setPriceOfTea(priceOfTea);
return this;
}
public CoockieBuilder priceOfChocolate(double priceOfChocolate) {
coockie.setPriceOfChocolate(priceOfChocolate);
return this;
}
}
package xyz.chenshuyusc.course2;
public class TestCoockie {
public static void main(String[] args) {
Coockie coockie = new CoockieBuilder()
.priceOfChocolate(1213)
.priceOfTea(1293)
.build();
CoockieBuilder coockieBuilder = new CoockieBuilder();
coockieBuilder = coockieBuilder.priceOfTea(1231.2);
coockieBuilder = coockieBuilder.priceOfChocolate(21);
coockieBuilder = coockieBuilder.priceOfTea(213);
System.out.println(coockie.getPriceOfChocolate());
System.out.println(coockie.getPriceOfTea());
System.out.println(coockie.getPrice());
}
}