1. 程式人生 > >java基礎---抽象和封裝

java基礎---抽象和封裝

設計 etl generate ont 限制 () 完成 ron 輸入

1.為什麽使用面向對象?

現實世界是由什麽組成的,世界由對象組成

面向對象的思想符合人類思維習慣,面向對象的思想描述面向對象的世界

2.軟件出現的目的

n用計算機的語言描述現實世界

n用計算機解決現實世界的問題

3.面向對象設計和開發程序的好處

n交流更加流暢

n提高設計和開發效率

4.一個現實世界的問題

寵物——現實世界的對象

如何在計算機中描述它們?

從現實中抽象出類分三步:1. 找出它的種類2. 找出它的屬性3. 找出它的行為

第一步:發現類(根據“對象”抽象出“類”)

class Dog {

}

第二步:發現類的屬性(只放和業務相關的屬性)

class Dog {

String name = "旺財"; // 昵稱

int health = 100; // 健康值

int love = 0; // 親密度

String strain = "拉布拉多犬"; // 品種

}

第三步:發現類的方法

class Dog {

String name = "旺財"; // 昵稱

int health = 100; // 健康值

int love = 0; // 親密度

String strain = "拉布拉多犬

"; // 品種

/* 輸出狗的信息 */

public void print() {

// 輸出狗信息的代碼

}

5.類圖

技術分享圖片

舉例:實現寵物領養

public class Dog {

// 狗狗實體類

// field

public String name;

public int health;

public int love;

public String strain;

// methods

public void print() {

System.out.println("姓名" + name + "

健康值" + health + "可愛值" + love + "種類"

+ strain);

}

}

public class Penguin {

// 企鵝實體類

// field

public String name;

public int health;

public int love;

public String gender;

// methods

public void print() {

System.out.println("姓名" + name + "健康值" + health + "可愛值" + love + "種類"

+ gender);

}

}

import java.util.Scanner;

public class Adopt {

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

String name = null;

Dog dog = null;

Penguin penguin = null;

int choice = 0;

String answer = "y";

while (answer.equals("y")) {

System.out.println("請輸入領養寵物的名字");

name = input.next();

System.out.println("請輸入您要領養寵物的類型;1-;2-企鵝");

choice = input.nextInt();

switch (choice) {

case 1:

// 領養狗

answer = "n";

System.out.println("請輸入狗狗的種類,1-拉布拉多;2-哈士奇");

choice = input.nextInt();

dog = new Dog(); // 創建新的空間

dog.name = name;

if (choice == 1) {

dog.strain = "拉布拉多";

} else if (choice == 2) {

dog.strain = "哈士奇";

}

dog.love = 60;

dog.health = 60;*/

break;

case 2:

// 領養企鵝

answer = "n";

System.out.println("請輸入企鵝的性別;1-Q;2-Q");

choice = input.nextInt();

penguin = new Penguin();

penguin.name = name;

if (choice == 1) {

penguin.gender = "Q" + "";

} else if (choice == 2) {

penguin.gender = "Q" + "";

}

penguin.love = 60;

penguin.health = 60;

break;

default:

System.out.println("對不起,輸入有誤,請重新輸入");

break;

}

System.out.println("還要繼續領養嗎? y-繼續;n-退出");

answer = input.next();

}

// 輸出

if (dog != null) {

dog.print();

}

if (penguin != null) {

penguin.print();

}

}

}

心得:根據現實世界的信息,用程序的角度去描述出來

因為Dog dog = null;為空,只做了一個房間,並沒有賦值;所以使用dog.什麽的時候需要new一個對象(不能給房間直接賦值)

如何查看領養了那個寵物,查看那個房間沒有空著。則代表領養到了...

如果想重復領養,目前達不到,存放企鵝和狗狗的只有一個房間。多次領養無意義...

列表可以幫助實現

6.整理代碼快捷鍵

Ctrl+shift+f

7.如何修改快捷鍵

Windows--->preference-->查找輸入keys--->進行修改

8.封裝-----構造方法

上述對寵物的初始化不方便,如果狗狗有100個屬性則需要寫100dog.xx;且每次初始化dog,每次都需要重復寫那麽多。比較繁瑣,應符合寫少做多。

對象初始化

Penguin pgn=new Penguin();

pgn.name = "qq";

pgn.sex = "Q";

能否在創建對象的同時就完成賦值?構造方法new完直接賦值)

構造方法是提前把屬性寫好

舉例:無參構造方法

public class Dog {

// dog

// field

public String name;

public int health;

public int love;

public String strain;

//構造方法

//構造方法沒有返回值

public Dog(){

name="旺仔";

health=60;

love=90;

strain="中華田園犬";

}

// methods

public void print() {

System.out.println("姓名" + name + "健康值" + health + "可愛值" + love + "種類"

+ strain);

}

}

public class Penguin {

// 企鵝

// field

public String name;

public int health;

public int love;

public String gender;

//構造方法

//構造方法沒有返回值

public Penguin(){

name="QQ";

health=60;

love=60;

gender="Q";

}

// methods

public void print() {

System.out.println("姓名" + name + "健康值" + health + "可愛值" + love + "種類"

+ gender);

}

}

import java.util.Scanner;

public class Adopt {

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

String name = null;

Dog dog = null;

Penguin penguin = null;

int choice = 0;

String answer = "y";

while (answer.equals("y")) {

System.out.println("請輸入領養寵物的名字");

name = input.next();

System.out.println("請輸入您要領養寵物的類型;1-;2-企鵝");

choice = input.nextInt();

switch (choice) {

case 1:

// 領養狗

answer = "n";

System.out.println("請輸入狗狗的種類,1-拉布拉多;2-哈士奇");

choice = input.nextInt();

dog = new Dog(); // 創建新的空間

break;

case 2:

// 領養企鵝

answer = "n";

System.out.println("請輸入企鵝的性別;1-Q;2-Q");

choice = input.nextInt();

penguin = new Penguin();

break;

default:

System.out.println("對不起,輸入有誤,請重新輸入");

break;

}

System.out.println("還要繼續領養嗎? y-繼續;n-退出");

answer = input.next();

}

// 輸出

if (dog != null) {

dog.print();

}

if (penguin != null) {

penguin.print();

}

}

}

9.無參類型構造方法

系統提供默認無參構造方法

語法:

訪問修飾符 構造方法名 ( ) {

//初始化代碼

}

示例:

public Penguin() {

}

10. 帶參數的構造方法

所謂沒有參數的構造方法就是指,需要自己做一個對象,不是按照意願造出來的,而是系統提供什麽就必須安要求來...

舉例:

public class Dog {

// dog

// field

public String name;

public int health;

public int love;

public String strain;

// 帶參數構造方法

// this-當前對象

public Dog(String name,int health,int love,String strain){

this.name=name;

this.health=health;

this.love=love;

this.strain=strain;

}

// methods

public void print() {

System.out.println("姓名" + name + "健康值" + health + "可愛值" + love + "種類"

+ strain);

}

}

public class DogTest {

public static void main(String[] args) {

// 帶參數構造方法

Dog dog=new Dog("阿福",100,20,"沙皮");

dog.print();

}

}

心得:

帶參數的構造方法可以按照自己的心意去做,所以需要輸入一些東西,有什麽屬性輸什麽屬性

需要把參數的信息挨個賦值給類的屬性,利用this

This.name指的是public String name,然後把傳過來的參數 給類的成員變量this.name=name

當沒有無參數的方法時main不能添加Dog dog=new Dog();

11.帶參數構造方法常見錯誤

舉例:

public class Dog {

// dog

// field

public String name;

public int health;

public int love;

public String strain;

// 帶參數構造方法

// this-當前對象

public Dog(String name,int health,int love,String strain){

this.name=name;

this.health=health;

this.love=love;

this.strain=strain;

}

// methods

public void print() {

System.out.println("姓名" + name + "健康值" + health + "可愛值" + love + "種類"

+ strain);

}

}

public class DogTest {

public static void main(String[] args) {

Dog dog=new Dog();

dog.print();

}

}

錯在哪裏?

1.前面一個類,後面一個測試類

測試類裏面調用的是不帶參數的構造方法,但本類裏並沒有提供不帶參數的構造方法,故出錯

2.當無參方法和有參數方法同時出現時,調用無參方法也會成功

12.不帶參數的構造方法有倆個特點

1.系統默認提供無參構造方法

2.當系統還有帶參數的構造方法時,系統不在提供默認的無參構造方法

13.構造方法重載

變量不能同名、類不能同名、為什麽方法可以同名?因為方法的重載

舉例:

public class Demo {

/*方法的重載 overload

* 1-兩個方法 方法名相同

* 2-參數不同

* 3-與返回值 訪問控制符無關

* */

public void print(){

System.out.println("打印");

}

public String print(int d){

System.out.println("打印");

return null;

}

}

14.構造方法重載的調用

pgn = new Penguin();

pgn.print();

pgn = new Penguin("美美", 80, 20, "Q");

pgn.print();

public Penguin () {

name = "qq";

love = 20;

sex = "Q";

}

public Penguin (String name,int health,int love,String sex ) {

this.name = name;

this.health = health;

this.love = love;

this.sex = sex;

}

15.static關鍵字

可以修飾成員變量、方法

修飾成員變量,通過類名直接訪問成員變量

可以繞過new,直接拿類來訪問不用拿對象來訪問它。

無論修飾成員變量,還是成員方法static都寫在類型的前面;在使用的時候不需要new對象

1-修飾成員變量 類名.fileldName

2-修飾成員方法 類名.methodName

3-修飾靜態代碼塊

舉例:變量

package demo1;

public class Penguin {

// static

//屬性

public static String MALE="Q";

public static String FEMALE="Q";

}

package demo1;

public class PenguinTest {

public static void main(String[] args) {

//屬性

System.out.println(Penguin .MALE);

System.out.println(Penguin.FEMALE);

}

}

心得:一般用static修飾的都大寫

不用new和對象直接把屬性使用

舉例:方法

package demo1;

public class Penguin {

/*//方法

public static void test(){

System.out.println("test static method");

}

}

package demo1;

public class PenguinTest {

public static void main(String[] args) {

//方法

Penguin.test();

}

}

舉例:靜態代碼塊

package demo1;

public class Penguin {

//無參數

public Penguin(){

System.out.println("無參...");

}

//靜態代碼塊

//優先於構造方法去執行

static{

System.out.println("代碼塊");

System.out.println("靜態代碼塊");

System.out.println("************");

}

}

package demo1;

public class PenguinTest {

public static void main(String[] args) {

Penguin a=new Penguin();

}

}

16.為什麽要使用封裝

屬性隨意訪問,不合理的賦值;如何解決,使用封裝

舉例:

package demo4;

public class Dog {

private String name;

private int love;

private int health;

private String strain;

/*

*

* setget方法

*

* */

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getLove() {

return love;

}

public void setLove(int love) {

if(love<0||love>100) {

System.out.println("親密度只能在0-100之間");

this.love=60;

}else{

this.love = love;

}

}

public int getHealth() {

return health;

}

public void setHealth(int health) {

if(health<0||health>100) {

System.out.println("健康值只能在0-100之間");

this.health=60;

}else{

this.health = health;

}

}

public String getStrain() {

return strain;

}

public void setStrain(String strain) {

this.strain = strain;

}

/*

*

* 帶參數的構造方法

*

* */

public Dog(String name, int love, int health, String strain) {

super();

this.name = name;

this.love = love;

this.health = health;

this.strain = strain;

}

/*

*

* 不帶參數的構造方法

*

*

* */

public Dog() {

super();

// TODO Auto-generated constructor stub

}

/*

*

* toString() 自動生成

*

* */

@Override

public String toString() {

return "Dog [name=" + name + ", love=" + love + ", health=" + health

+ ", strain=" + strain + "]";

}

}

package demo4;

import java.util.Scanner;

public class Adopt {

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

String name = null;

Dog dog = null;

Penguin penguin = null;

int choice = 0;

String answer = "y";

while (answer.equals("y")) {

System.out.println("請輸入領養寵物的名字");

name = input.next();

System.out.println("請輸入您要領養寵物的類型;1-;2-企鵝");

choice = input.nextInt();

switch (choice) {

case 1:

// 領養狗

answer = "n";

System.out.println("請輸入狗狗的種類,1-拉布拉多;2-哈士奇");

dog = new Dog(); // 創建新的空間

choice = input.nextInt();

if (choice == 1) {

dog.setStrain("拉布拉多"); 調用set方法

} else if (choice == 2) {

dog.setStrain("哈士奇");

}

dog.setName(name);

System.out.println("請輸入狗狗的健康值");

dog.setHealth(input.nextInt());

System.out.println("請輸入狗狗的可愛值");

dog.setLove(input.nextInt());

break;

case 2:

// 領養企鵝

answer = "n";

System.out.println("請輸入企鵝的性別;1-Q;2-Q");

choice = input.nextInt();

penguin = new Penguin();

if (choice == 1) {

penguin.setGender(Penguin.MALE);

} else if (choice == 2) {

penguin.setGender(Penguin.FEMALE);

}

penguin.setName(name);

System.out.println("請輸入企鵝的健康值");

penguin.setHealth(input.nextInt());

System.out.println("請輸入企鵝的可愛值");

penguin.setLove(input.nextInt());

break;

default:

System.out.println("對不起,輸入有誤,請重新輸入");

break;

}

System.out.println("還要繼續領養嗎? y-繼續;n-退出");

answer = input.next();

}

// 輸出

if (dog != null) {

System.out.println(dog.toString());

} else if (penguin != null) {

System.out.println(penguin.toString());

}

}

}

心得:健康值屬性不能被賦值-100,不能修改。想要實現不被修改,在測試類裏隨意添加這樣是不合理的。不允許修改,故需要封裝

封裝分二步:1-將屬性的訪問符改為private

2-set 設置 修改

3-get 讀 獲取

做限制可以在set方法裏做限制

Penguin.MALE 值被固定,不被修改

17.快捷鍵

Alt+shift+s

Get set、無參方法、帶參方法可以幫助生成

但是自定義的方法和屬性需要自己寫

18.什麽是封裝

封裝:將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問

19. 如何使用封裝

修改屬性的可見性

1getter/setter方法中加入屬性控制語句(設為private

2創建公有的getter/setter方法(用於屬性的讀寫)

2getter/setter方法中加入屬性控制語句(對屬性值的合法性進行判斷)

20. this的用法

調用屬性

this.health = 100;

this.name = "大黃";

調用方法

this.print();

調用構造方法

this();

this("小黑",100,100,"");

this();如果使用,必須是構造方法中的第一條語句

舉例:

技術分享圖片

不能在普通方法裏調用this();

只能在構造方法中調用this();

技術分享圖片

不能在無參中調用帶參,只能在帶參中調用無參數方法

21. 總結

抽象:用程序的語言描述現實世界

1-找到類

2-屬性

3-方法

構造方法

作用:初始化對象屬性

1-無參數

Public 類名(){

}

2-帶參數

Public 類名(String name){

This.name=name;

}

A系統默認提供無參數的構造方法

B當系統提供了帶參數的構造方法時,不在提供無參數方法

封裝

1-將屬性public變為private

2-增加get/set方法,讀取/寫入

3-重新修改set方法

Static

1-屬性

2-方法

Person p=new Person();

p.field ;

p.method;

--------------------------------------------

Person.filed;

Person.method();

3-靜態代碼塊

優先於構造方法去執行

Static{

}

方法的重載

1-同一個類中

2-倆個或多個同名方法

3-參數不同

4-與訪問修飾符和返回值無關

java基礎---抽象和封裝