天天看點

oopday02(面向對象-構造方法&靜态static)

面向對象之封裝

01_面向對象(構造方法Constructor概述和格式)

* A:構造方法概述和作用

* 給對象的資料(屬性)進行初始化

* B:構造方法格式特點

* a:方法名與類名相同(大小也要與類名一緻)

* b:沒有傳回值類型,連void都沒有

* c:沒有具體的傳回值return;

class Demo1_Constructor {//Constructor構造

public static void main(String[] args) {

Person p = new Person();//在一建立對象的時候,系統就幫我調用了構造方法

//p.Person();//構造方法不能用對象調用

p.show();

Person p2 = new Person();//再次建立對象

p2.show();

}

/*

*/

class Person {

private String name;

private int age;

//構造方法

public Person() {

//System.out.println("Hello World!");

//return;//構造方法也是有return語句的,格式是return;

name = "張三";

age = 23;

public void show() {

System.out.println(name + "..." + age);

構造方法的作用及格式特點分别是什麼?

思考:構造方法可以重載嗎?

可以

02_面向對象(構造方法的重載及注意事項)

* A:案例示範

    * 構造方法的重載

    * 重載:方法名相同,與傳回值類型無關(構造方法沒有傳回值),隻看參數清單

* B:構造方法注意事項

    * a:如果我們沒有給出構造方法,系統将自動提供一個無參構造方法。

    * b:如果我們給出了構造方法,系統将不再提供預設的無參構造方法。

        * 注意:這個時候,如果我們還想使用無參構造方法,就必須自己給出。建議永遠自己給出無參構造方法

class Demo2_Person {

Person p1 = new Person();

p1.show();

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

Person p2 = new Person("張三",23);

Person p3 = new Person("李四",24);

p3.show();

* A:案例示範

* 構造方法的重載

* 重載:方法名相同,與傳回值類型無關(構造方法沒有傳回值),隻看參數清單

* B:構造方法注意事項

* a:如果我們沒有給出構造方法,系統将自動提供一個無參構造方法。

* b:如果我們給出了構造方法,系統将不再提供預設的無參構造方法。

* 注意:這個時候,如果我們還想使用無參構造方法,就必須自己給出。建議永遠自己給出無參構造方法

private String name;//姓名

private int age;//年齡

public Person() {//空參構造

System.out.println("空參的構造");

public Person(String name,int age) {

this.name = name;

this.age = age;

System.out.println("有參的構造");

使用構造方法的時候,注意事項有哪些?

• 思考題:構造方法,set方法都可以給成員變量指派,這兩種指派方式有什       麼差別?

03_面向對象(給成員變量指派的兩種方式的差別)

* A:setXxx()方法

    * 修改屬性值 

* B:構造方法

    * 給對象中屬性進行初始化 

class Demo3_Person {

Person p1 = new Person("張三",23);

//p1 = new Person("張天一",23);//這種方式看運作結果貌似是改名了,其實是将原對象變成垃圾

System.out.println(p1.getName() + "..." + p1.getAge());

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

Person p2 = new Person();//空參構造建立對象

p2.setName("李四");

p2.setAge(24);

p2.setName("李鬼");

System.out.println(p2.getName() + "..." + p2.getAge());

構造方法

給屬性進行初始化

setXxx方法

修改屬性值

這兩種方式,在開發中用setXxx更多一些,因為比較靈活

public Person(String name,int age) {//有參構造

public void setName(String name) {//設定姓名

public String getName() {//擷取姓名

return name;

public void setAge(int age) {//設定年齡

public int getAge() {//擷取年齡

return age;

04_面向對象(學生類的代碼及測試)

* 學生類:

* 成員變量:

* name,age

* 構造方法:

* 無參,帶兩個參

* 成員方法:

* getXxx()/setXxx()

* show():輸出該類的所有成員變量值

* B:給成員變量指派:

* a:setXxx()方法

* b:構造方法

* C:輸出成員變量值的方式:

* a:通過getXxx()分别擷取然後拼接

* b:通過調用show()方法搞定

class Demo4_Student {

Student s1 = new Student();//使用空參構造

s1.setName("張三");//設定姓名

s1.setAge(23);//設定年齡

System.out.println("我的姓名是:" + s1.getName() + ",我的年齡是:" + s1.getAge());

//getXxx()擷取屬性值,可以列印,也可以指派給其他的變量,做其他的操作

Student s2 = new Student("李四",24);

s2.show();//隻是為了顯示屬性值

class Student {

public Student(){}//空參構造

public Student(String name,int age) {//有參構造

System.out.println("我的姓名是:" + name +  ",我的年齡是:" +  age);

• 模仿剛才的學生類代碼,寫一個手機類并測試。

手機類:

    成員變量: 品牌(brand),價格(price)

    構造方法: 無參構造,帶參構造

    成員方法:

        各個字段對應的setXXX()和getXXX()方法,

        show()方法:這個方法用來顯示手機的品牌和價格

05_面向對象(手機類的代碼及測試)

    * 模仿學生類,完成手機類代碼

class Demo5_Phone {

Phone p1 = new Phone();

p1.setBrand("蘋果");

p1.setPrice(1500);

System.out.println(p1.getBrand() + "..." + p1.getPrice());

Phone p2 = new Phone("小米",98);

手機類:

成員變量:

品牌brand,價格price

無參,有參

成員方法

setXxx和getXxx

show

class Phone {

private String brand;//品牌

private int price;//價格

public Phone(){}//空參構造

public Phone(String brand,int price) {//有參構造

this.brand = brand;

this.price = price;

public void setBrand(String brand) {//設定品牌

public String getBrand() {//擷取品牌

return brand;

public void setPrice(int price) {//設定價格

public int getPrice() {//擷取價格

return price;

System.out.println(brand + "..." + price);

06_面向對象(建立一個對象的步驟)

* A:畫圖示範

    * 畫圖說明一個對象的建立過程做了哪些事情?

    * Student s = new Student();

    * 1,Student.class加載進記憶體

    * 2,聲明一個Student類型引用s

    * 3,在堆記憶體建立對象,

    * 4,給對象中屬性預設初始化值

    * 5,屬性進行顯示初始化

    * 6,構造方法進棧,對對象中的屬性指派,構造方法彈棧

    * 7,将對象的位址值指派給s

oopday02(面向對象-構造方法&靜态static)

一個對象的建立過程做了哪些事情?

需求:定義一個長方形類,類中有兩個方法,分别求長方形的周長和面積的方法,然後定義一個測試類進行測試。

矩形:Rectangle

求周長的方法: getLength()

求面積的方法: getArea()

07_面向對象(長方形案例練習)

    * 需求:

        * 定義一個長方形類,定義 求周長和面積的方法,

        * 然後定義一個測試類進行測試。

class Test1_Rectangle {//Rectangle矩形

Rectangle r = new Rectangle(10,20);

System.out.println(r.getLength());//周長

System.out.println(r.getArea());//面積

* 需求:

* 定義一個長方形類,定義 求周長和面積的方法,

* 然後定義一個測試類進行測試。

分析:

寬width,高high

空參有參構造

成員方法:

求周長:getLength()

求面積:getArea()

class Rectangle {

private int width;//寬

private int high;//高

public Rectangle(){}//空參構造

public Rectangle(int width,int high) {

this.width = width;//有參構造

this.high = high;

public void setWidth(int width) {//設定寬

this.width = width;

public int getWidth() {//擷取寬

return width;

public void setHigh(int high) {//設定高

public int getHigh() {//擷取高

return high;

public int getLength() {//擷取周長

return 2 * (width + high);

public int getArea() {//擷取面積

return width * high;

根據給定的需求,定義出員工類并測試。

08_面向對象(員工類案例練習)

    * 需求:定義一個員工類Employee

    * 自己分析出幾個成員,然後給出成員變量

        * 姓名name,工号id,工資salary 

    * 構造方法,

        * 空參和有參的

    * getXxx()setXxx()方法,

    * 以及一個顯示所有成員資訊的方法。并測試。

        * work 

class Test2_Employee {//employee員工

Employee e = new Employee("令狐沖","9527",20000);

e.work();

* 需求:定義一個員工類Employee

* 自己分析出幾個成員,然後給出成員變量

* 姓名name,工号id,工資salary

* 構造方法,

* 空參和有參的

* getXxx()setXxx()方法,

* 以及一個顯示所有成員資訊的方法。并測試。

* work

class Employee {

private String id;//工号

private double salary;//工資

public Employee() {}//空參構造

public Employee(String name, String id, double salary) {//有參構造

this.id = id;

this.salary = salary;

public void setId(String id) {//設定id

public String getId() {//擷取id

return id;

public void setSalary(double salary) {//設定工資

public double getSalary() {//擷取工資

return salary;

public void work() {

System.out.println("我的姓名是:" + name + ",我的工号是:" + id + ",我的工資是:" + salary

+ ",我的工作内容是敲代碼");

09_面向對象(static關鍵字及記憶體圖)

    * 通過一個案例引入static關鍵字。

    * 人類:Person。每個人都有國籍,中國。

* B:畫圖示範

    * 帶有static的記憶體圖

class Demo1_Static {

/*Person p1 = new Person();//建立對象

p1.name = "蒼老師";//調用姓名屬性并指派

p1.country = "日本";//調用國籍屬性并指派

Person p2 = new Person();

p2.name = "小澤老師";//調用姓名屬性并指派

//p2.country = "日本";//調用國籍屬性并指派

p1.speak();

p2.speak();*/

Person.country = "日本";//靜态多了一種調用方式,可以通過類名.

System.out.println(Person.country);

String name;//姓名

static String country;//國籍

public void speak() {//說話的方法

System.out.println(name + "..." + country);

oopday02(面向對象-構造方法&靜态static)

10_面向對象(static關鍵字的特點)

* A:static關鍵字的特點

    * a:随着類的加載而加載

    * b:優先于對象存在

    * c:被類的所有對象共享

        * 舉例:咱們班級的學生應該共用同一個班級編号。

        * 其實這個特點也是在告訴我們什麼時候使用靜态?

            * 如果某個成員變量是被所有對象共享的,那麼它就應該定義為靜态的。

        * 舉例:

            * 飲水機(用靜态修飾)

            * 水杯(不能用靜态修飾)

            * 共性用靜态,特性用非靜态

    * d:可以通過類名調用

        * 其實它本身也可以通過對象名調用。

        * 推薦使用類名調用。

        * 靜态修飾的内容一般我們稱其為:與類相關的,類成員

* B:案例示範

    * static關鍵字的特點

• static關鍵字的特點有哪些?

11_面向對象(static的注意事項)

* A:static的注意事項

* a:在靜态方法中是沒有this關鍵字的

* 如何了解呢?

* 靜态是随着類的加載而加載,this是随着對象的建立而存在。

* 靜态比對象先存在。

* b:靜态方法隻能通路靜态的成員變量和靜态的成員方法

* 靜态方法:

* 成員變量:隻能通路靜态變量

* 成員方法:隻能通路靜态成員方法

* 非靜态方法:

* 成員變量:可以是靜态的,也可以是非靜态的

* 成員方法:可是是靜态的成員方法,也可以是非靜态的成員方法。

* 簡單記:

* 靜态隻能通路靜态。

* B:案例示範

* static的注意事項

• 使用static關鍵字,有哪些注意事項?

• 思考題:靜态變量和成員變量有哪些差別?(1分鐘)

12_面向對象(靜态變量和成員變量的差別)

* 靜态變量也叫類變量  成員變量也叫對象變量

* A:所屬不同

* 靜态變量屬于類,是以也稱為為類變量

* 成員變量屬于對象,是以也稱為執行個體變量(對象變量)

* B:記憶體中位置不同

* 靜态變量存儲于方法區的靜态區

* 成員變量存儲于堆記憶體

* C:記憶體出現時間不同

* 靜态變量随着類的加載而加載,随着類的消失而消失

* 成員變量随着對象的建立而存在,随着對象的消失而消失

* D:調用不同

* 靜态變量可以通過類名調用,也可以通過對象調用

* 成員變量隻能通過對 象名調用

class Demo2_Static {

//Demo d = new Demo();

//d.print1();

Demo.print2();

class Demo {

int num1 = 10;//非靜态的成員變量

static int num2 = 20;//靜态的成員變量

/*public void print1() {//非靜态的成員方法,既可以通路靜态的成員也可以通路非靜态的

System.out.println(num1);

System.out.println(num2);

}*/

public static void print2() {//靜态的成員方法

//System.out.println(this.num1);//靜态的成員方法不能通路非靜态的,錯誤: 無法從靜态上下文中引用非靜态 變量 num1

oopday02(面向對象-構造方法&靜态static)
• 回顧下,咱們之前學習的局部變量和成員變量的差別是什麼?

13_面向對象(main方法的格式詳細解釋) 

* A:格式

    * public static void main(String[] args) {}

* B:針對格式的解釋

    * public 被jvm調用,通路權限足夠大。

    * static 被jvm調用,不用建立對象,直接類名通路

    * void被jvm調用,不需要給jvm傳回值

    * main 一個通用的名稱,雖然不是關鍵字,但是被jvm識别

    * String[] args 以前用于接收鍵盤錄入的

* C:示範案例

    * 通過args接收鍵盤例如資料

class Demo3_Main {

public : 被jvm調用,是以權限要足夠大

static : 被jvm調用,不需要建立對象,直接類名.調用即可

void   : 被jvm調用,不需要有任何的傳回值

main   : 隻有這樣寫才能被jvm識别,main不是關鍵字

String[] args : 以前是用來接收鍵盤錄入的

System.out.println(args.length);

for (int i = 0;i < args.length ;i++ ) {

System.out.println(args[i]);

14_面向對象(工具類中使用靜态)

* A:制作一個工具類

* ArrayTool

* 1,擷取最大值

* 2,數組的周遊

* 3,數組的反轉

/**

這是一個數組工具類,裡面封裝了查找數組最大值,列印數組,數組反轉的方法

@author fengjia

@version v1.0

public class ArrayTool {

//如果一個類中所有的方法都是靜态的,需要再多做一步,私有構造方法,目的是不讓其他類建立本類對象

//直接用類名.調用即可

私有構造方法

private ArrayTool(){}

//1,擷取最大值

這是擷取數組中最大值的方法

@param arr 接收一個int類型數組

@return 傳回數組中最大值

public static int getMax(int[] arr) {

int max = arr[0];//記錄第一個元素

for (int i = 1;i < arr.length ;i++ ) {//從第二個元素開始周遊

if (max < arr[i]) {//max與數組中其他的元素比較

max = arr[i];//記錄住較大的

return max;//将最大值傳回

//2,數組的周遊

這是周遊數組的方法

public static void print(int[] arr) {

for (int i = 0;i < arr.length ;i++ ) {//周遊數組

System.out.print(arr[i] + " ");

//3,數組的反轉

這是數組反轉的方法

public static void revArray(int[] arr) {

for (int i = 0;i < arr.length / 2 ;i++ ) {//循環次數是元素個數的一半

arr[0]與arr[arr.length-1-0]交換

arr[1]與arr[arr.length-1-1]交換

arr[2]與arr[arr.length-1-2] 交換

int temp = arr[i];

arr[i] = arr[arr.length-1-i];

arr[arr.length-1-i] = temp;

class Demo1_ArrayTool {

int[] arr = {33,11,22,66,55,44};

/*ArrayTool at = new ArrayTool();

int max = at.getMax(arr);//擷取最值

System.out.println(max);

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

at.print(arr);//列印

System.out.println();

System.out.println("反轉後:");

at.revArray(arr);//反轉

at.print(arr);*/

ArrayTool.print(arr);

============ 作業 =============

1:構造方法的作用是什麼?構造方法的特點是什麼?構造方法的注意事項是什麼?構造方法中可不可以寫return語句呢?
答:構造方法是用于初始化,成員變量的...構造方法當建立對象時,被調用.不能用對象名調用,如果沒有給出構造方法,系統會預設給出一個空參構造方法..構造方法中可以有return 但是不能有具體的傳回值

2:給成員變量指派有幾種方式?
直接給出
構造方法中初始化成員變量
set/get

3:标準的代碼編寫及測試:
    A:學生類的案例
    B:手機類的案例
    C:長方形類的案例

4:一個類的成員變量初始化過程
    Student s = new Student();
位元組碼檔案加載進方法去
mian方法加載進棧記憶體

主方法中聲明一個類型引用
在堆記憶體中建立一個對象
成員變量預設初始化
成員變量顯示初始化
構造方法初始化成員變量
把位址值賦給對象引用

5:static關鍵字是什麼?有什麼特點?什麼時候用呢?
靜态關鍵子,讓所有對象共享被修飾的内容
随着類加載而加載
優先于對象存在
被所有對象和類所共享      

ending...