java面向物件(推薦看一本書java程式設計思想)
面向物件
回顧
今天任務
1. 面向物件
2. 面向過程
3. 類的建立
4. 物件的建立
5. 物件建立記憶體分析
6. 構造方法
7. this關鍵字
教學目標
1. 掌握面向物件思想
2. 掌握類和物件的建立
3. 掌握物件建立記憶體分析
4. 掌握構造方法
5. 掌握this關鍵字
第一節 : 面向物件的設計思想
1.1 什麼是面向物件
一種看待問題的思維方式,著眼於找到一個具有特殊功能的具體個體,然後委託這個個體去做某件事情,我們把這個個體就叫做物件 是一種更符合人類思考習慣的思想【懶人思想】,可以將複雜的事情簡單化,將程式設計師從執行者轉換成了指揮者 使用面向物件進行開發,先要去找具有所需功能的物件來用,如果該物件不存在,那麼建立一個具有所需功能的物件
1.2 面向過程
一種看待問題的思維方式,在思考問題的時候,著眼於問題是怎樣一步一步解決的,然後親力親為的去解決問題
1.3 面向物件和麵向過程的對比
面向物件是基於萬物皆物件這個哲學觀點
舉例說明:
案例一:我想要吃大盤雞 面向過程 面向物件 1.自己去買菜 1.委託一個會砍價的人幫忙去買菜 2.自己擇菜 2.委託一個臨時工幫忙擇菜 3.自己做菜 3.委託一個廚師幫忙做菜 4.自己開始吃 4.自己開始吃
案例二:小明是一個電腦小白,想要配一臺電腦,買完零件後需要運到家裡,組裝完成後開啟電腦玩遊戲 面向過程 面向物件 1.小明補充電腦知識 1.委託一個懂電腦的朋友(老王)去幫忙買零件 2.小明去買零件 2.委託一個能跑腿的人去買零件 3.小明把零件帶回家裡 2.委託一個快遞小哥幫小明送到家裡 4.小明組裝電腦 3.委託一個會組裝電腦的人幫小明組裝電腦 5.小明開機玩電腦 4.小明自己開啟電腦,開始玩遊戲
1.4 區別總結
a.都是看待問題的一種思維方式,都能解決問題
b.面向過程著眼於所有的事情親力親為
c.面向物件著眼於找到一個具有特殊功能的物件,委託這個物件幫忙去做某件事情
注意:面向物件時一種思想,並不是一門程式語言
1.5 類的定義
一個具有特殊功能的實體的集合【群體】,類是Java語言的最基本單位
1.6 物件的定義
在一個類中,一個具有特殊功能的實體,能夠幫忙解決特定的問題,物件也被稱為例項
1.7 類與物件之間的關係
a.類是物件的抽象,物件是類的具體體現
b.Java中描述事物通過類的形式體現,類是具體事物的抽象,物件即是該類事物實實在在的個體
1.8 類的宣告
語法:訪問許可權修飾符 class 類名 {
//類體 }
說明:a.訪問許可權修飾符:只能是public(可以被省略,省略後為default) b.類名只要是一個合法的識別符號即可,但是要求:首字母必須大寫,遵循駝峰命名法 c.儘量使用單個或多個有意義的單詞連線而成 public class FirstDemo {
}
注意:a.一個Java檔案中可以寫多個類,如果寫多個類,則編譯後會生成多個.class檔案 b.一個Java檔案中最多隻能有一個被public修飾的類,這個類的類名必須和Java原始檔名保持一致 c.一個Java檔案中如果只有一個類,並且這個類不用public修飾的話,類名和檔名可以不一樣,但習慣上,我們都會寫一樣
1.9 類中成員變數的定義
成員變數:
a.成員變數其實就是全域性變數
b.成員變數也被稱為屬性 c.分為靜態變數和非靜態變數 d.在靜態方法中只能訪問靜態成員變數,在非靜態方法中可以訪問非靜態成員變數和靜態成員變數
成員變數【全域性變數】和區域性變數的區別: a.定義的位置不同
成員變數:定義於類中,作用於整個類 區域性變數:定義於方法或者語句中,作用於該方法或者該語句。
b.記憶體中出現的時間和位置不同
成員變數:當物件被建立時,出現在堆記憶體當中。 區域性變數:所屬的區間被運算時,出現在棧記憶體當中。
c.生命週期不同
成員變數:隨著物件的出現而出現,隨著物件的消失而消失。 區域性變數:隨著所屬區間運算結束,它就被釋放。
d.初始化值不同
成員變數:成員變數因為在堆記憶體當中,所以他有預設的初始值 區域性變數:沒有預設的初始值
1.10 類中方法的定義
a.分為靜態方法和非靜態方法
b.在同一個類中,在靜態方法中只能呼叫靜態方法,在非靜態方法中可以呼叫非靜態方法和靜態方法
class TextDemo01
{
//定義非靜態全域性變數
String str;
//定義靜態全域性變數
static int num;
//main是靜態函式
public static void main(String[] args)
{
show();
//結論一:在同一個類中,在靜態函式中不能呼叫非靜態函式
// 錯誤: 無法從靜態上下文中引用非靜態 方法 display()
//display();
//結論三:在同一個類中,在靜態函式中只能訪問靜態全域性變數
// 錯誤: 無法從靜態上下文中引用非靜態 變數 str
//System.out.println(str);
System.out.println(num);//0
//定義一個區域性變數
//當全域性變數和區域性變數重名的時候,訪問的時候採用就近原則
//儘量避免全域性變數和區域性變數重名
int num = 10;
System.out.println(num);
}
//靜態函式
public static void show() {
System.out.println("show");
}
//非靜態函式
public void display() {
System.out.println("display");
//結論二:在同一個類中,非靜態函式可以呼叫靜態函式,也可以呼叫非靜態函式
show();
display11();
//結論四:在同一個類中,非靜態函式可以訪問靜態全域性變數以及非靜態全域性變數
System.out.println(str);
System.out.println(num);
}
//非靜態函式
public void display11() {
System.out.println("display11");
}
}
第二節:物件的建立以及記憶體分析
2.1 物件的建立
物件的建立過程也被稱為物件的例項化過程
語法:類名 識別符號 = new 類名();
//演示物件的建立,跨類進行呼叫成員方法以及訪問成員變數
//測試類:含有main函式得類被稱為測試類
public class TextDemo01
{
public static void main(String[] args)
{
//1.建立物件
//語法:類名 變數名稱 = new 類名();
Person xiaoMing = new Person();
//2.呼叫其他類中的非靜態方法和訪問其他類中非靜態成員變數
//語法:物件.
System.out.println(xiaoMing.name);
//雖然是跨類進行訪問,Person類中成員變數仍然是一個變數,值可以隨時發生改變
xiaoMing.name = "小明";
System.out.println(xiaoMing.name);
xiaoMing.age = 10;
xiaoMing.gender = 'B';
xiaoMing.eat();
//3.呼叫其他類中的靜態方法和訪問其他類中靜態成員變數
//語法:物件. 類名.
System.out.println(Person.country);
Person.country = "中國";
System.out.println(Person.country);
Person.run();
xiaoMing.country = "China";
System.out.println(Person.country);
System.out.println(xiaoMing.country);
xiaoMing.run();
//4.同一個類可以建立多個物件
Person xiaoLi = new Person();
}
}
//實體類:表示具有某些特徵或者某些行為的類
//描述多個物件所具有的共同特徵和共同行為
//需求:人類,具有姓名,年齡,性別等的特徵,可以吃東西,可以奔跑,,,,
class Person
{
//第一部分
//成員變數:特徵【名詞】
//非靜態成員變數
String name;//null
int age;//0
char gender;//\u0000
//靜態成員變數
static String country;//null
//第二部分
//成員方法:行為【動詞】
//非靜態成員方法
public void eat() {
System.out.println("eating~~~~");
}
//靜態成員方法
public static void run() {
System.out.println("running~~~~");
}
}
總結:a.靜態方法和靜態成員變數都是屬於類的,需要訪問的時候用: 類名. 的方式來訪問
b.非靜態方法和非靜態成員變數是屬於物件的,需要訪問的時候用: 物件. 的方式來訪問 c.開闢空間的時機不同
2.2 記憶體分析
中
說明:程式中定義的Person型別的變數實際上是一個引用,它被存放在棧記憶體中,他指向實際的Person物件,而真正的Person物件則存放於堆記憶體中
2.3 練習
//測試類
class PracticeDemo01
{
public static void main(String[] args)
{
//需求:開學了,王老師讓學生小明,小花,小麗做自我介紹
//姓名,年齡,愛好,來一段才藝展示
/*
老師類
特徵:姓名
行為:讓學生做自我介紹
學生類
特徵:姓名,年齡,愛好
行為:才藝展示
*/
//1.建立一個老師的物件
Teacher wang = new Teacher();
wang.name = "王老師";
//2.建立一個學生物件
Student xiaoming = new Student();
//賦值
xiaoming.name = "小明";
xiaoming.age = 10;
xiaoming.hobby = "吹牛逼";
//3.老師執行自己的行為
wang.letStuIntroduce(xiaoming);
Student xiaohua = new Student();
//賦值
xiaohua.name = "小花";
xiaohua.age = 10;
xiaohua.hobby = "唱歌";
wang.letStuIntroduce(xiaohua);
}
}
//實體類
//老師類
class Teacher
{
String name;
//引數:學生,Student型別
public void letStuIntroduce(Student stu) {
System.out.println(name + "讓學生" + stu.name + "做自我介紹");
stu.introduce();
if(stu.name.equals("小麗")) {
stu.dance();
} else if(stu.name.equals("小花")) {
stu.sing();
} else {
stu.lie();
}
}
}
//學生類
class Student
{
String name;
int age;
String hobby;
public void introduce() {
System.out.println("我是" + name + "今年" + age + "愛好:" + hobby);
}
public void dance() {
System.out.println("跳一段廣場舞");
}
public void sing() {
System.out.println("來一段freeStyle");
}
public void lie() {
System.out.println("吹個牛逼");
}
}
第三節:構造方法的定義
3.1 構造方法的定義
構造方法也叫構造器,是指當例項化一個物件(建立一個物件)的時候,第一個被呼叫的方法
語法:訪問許可權修飾符 類名() { //方法體 }
普通方法: 訪問許可權修飾符 其他的修飾符 返回值型別 函式名(引數列表) {
}
說明:a.構造方法是在例項化物件的過程中自動呼叫的
b.系統會預設為我們提供一個無參的構造方法 c.構造方法沒有返回值型別
3.2 構造方法的呼叫
//演示構造方法的使用
class TextDemo05
{
public static void main(String[] args)
{
//1.系統會預設提供一個無參的構造方法
Animal a = new Animal();
Animal aa = new Animal("fadhbf");
aa.show();
aa.show();
aa.show();
}
}
class Animal
{
//無參的構造方法
//2.構造方法是在例項化物件的過程中被自動呼叫的,不需要手動呼叫
public Animal(){
System.out.println("無參的構造方法被呼叫");
}
//3.當手動新增一個有參的構造方法之後,系統將不再提供無參的構造方法
//如果要使用無參的構造方法,只能手動新增
public Animal(String str) {
System.out.println("String構造方法被呼叫");
}
public void show() {
}
}
3.3 構造方法和普通方法的區別
a.構造方法是在建立物件的過程中自動呼叫的,普通方法只能手動進行呼叫 b.構造方法沒有返回值型別【注意區別返回值void】,普通方法的返回值型別要麼是確定的型別,要麼為void c.系統會預設為我們提供一個無參的構造方法,普通方法只能手動新增 d.構造方法的方法名稱必須和對應的類名保持一致 e.構造方法在建立物件的過程中就會執行,而且每個物件只執行一次,對於普通方法而言,只有在需要使用的時候才被執行,並且一個物件可以呼叫多次
注意 a.如果沒有寫有參的構造方法,系統會預設提供一個無參的構造方法 b.如果手動寫了有參的構造方法,系統將不再提供無參的構造方法,如果需要使用,則要手動新增(一般情況下,要求將無參的構造方法都寫上,哪怕方法裡面什麼都不寫)
3.4 構造方法過載
//演示構造方法的過載
//測試類
class TextDemo06
{
public static void main(String[] args)
{
//直接賦值
/*
Dog maomao = new Dog();
maomao.name = "毛毛";
maomao.age = 3;
maomao.lookHome();
*/
//通過構造方法賦值
Dog dahuang = new Dog("大黃",5);
dahuang.lookHome();
}
}
//實體類
class Dog
{
//成員變數
String name;
int age;
//構造方法
public Dog() {}
//有參的構造方法,引數一般設定為和成員變數有關的引數
public Dog(String n,int a) {
//給成員變數賦值
name = n;
age = a;
}
/*
public Dog(String n) {
name = n;
}
*/
//成員方法
public void lookHome() {
System.out.println(name + "看家");
}
}
3.5 練習
//測試類
class PracticeDemo02
{
public static void main(String[] args)
{
//場景:富二代王s聰開著新買的白色寶馬在馬路上奔跑,很自豪的向他的新女友炫耀
/*
富二代類
特徵:姓名 有錢
行為:開車,炫耀
汽車類
特徵:顏色,品牌
行為:奔跑
女友類
特徵:姓名
*/
//1.建立一個富二代的物件
RichMan wang = new RichMan("王思聰",true);
//2.建立一個汽車的物件
Car BMW = new Car("白色","蘭博基尼");
//3.建立一個女友的物件
GirlFriend girl = new GirlFriend("鳳姐");
//4.讓富二代執行自己的行為
wang.drive(BMW);
//wang.show(girl,BMW);
}
}
/*
富二代類
特徵:姓名 有錢
行為:開車,炫耀車
*/
class RichMan
{
//成員變數
String name;
boolean hasMuchMoney;
//構造方法
public RichMan() {}
public RichMan(String n,boolean is) {
name = n;
hasMuchMoney = is;
}
//成員方法
public void drive(Car c) {
System.out.println(name + "開著豪車" + c.brand);
}
public void show(GirlFriend gf,Car c) {
System.out.println(name + "向" + gf.name + "炫耀豪車" + c.brand);
}
}
/*
汽車類
特徵:顏色,品牌
行為:奔跑
*/
class Car
{
//成員變數
String color;
String brand;
//構造方法
public Car() {}
public Car(String c,String b) {
color = c;
brand = b;
}
//成員方法
public void run() {
System.out.println("一輛" + color + "的" + brand + "在奔跑");
}
}
/*
女友類
特徵:姓名
*/
class GirlFriend
{
//成員變數
String name;
//構造方法
public GirlFriend(){}
public GirlFriend(String n) {
name = n;
}
}
第四節:this關鍵字
4.1 this.屬性
訪問本類的成員屬性
作用:為了區分成員變數和形參
4.2 this.方法
訪問本類的成員方法
4.3 練習
//演示this的使用
class ThisUsageDemo01
{
public static void main(String[] args)
{
//
Cat maomao = new Cat("毛毛",10);
maomao.setName("fhsdg");
Cat xiaohei = new Cat("小黑",5);
xiaohei.setName("hello");
/*
無參的構造方法被呼叫
String int構造方法被呼叫
無參的構造方法被呼叫
String int構造方法被呼叫
說明:每建立一個物件,只能自動的呼叫其中的一個構造方法,通過this()可以手動的去呼叫其他的構造方法
*/
//物件.
xiaohei.show3();
}
}
class Cat
{
String name;
int age;
int num;
int num1;
//3.this()
public Cat() {
System.out.println("無參的構造方法被呼叫");
}
//1.this.屬性
public Cat(String name,int age) {
//呼叫的是無參的構造方法
this();
this.name = name;
this.age = age;
System.out.println("String int構造方法被呼叫");
}
public Cat(String name,int age,int num,int num1) {
//對this()的呼叫必須是構造方法中的第一個語句
//this();
//具體呼叫的是哪個構造方法,取決於所傳的引數
this(name,age);
//可以簡化程式碼
//this.name = name;
//this.age = age;
this.num = num;
this.num1 = num1;
System.out.println("String int int int構造方法被呼叫");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
//2.this.方法
//普通方法
public void show1() {
//在本類中呼叫方法時,this可以省略
this.show2();
//在非靜態方法中呼叫靜態方法時,也可以使用this,this同樣可以省略
this.show3();
}
public void show2() {
}
//靜態方法
public static void show3() {
//錯誤: 無法從靜態上下文中引用非靜態 變數 this
//在靜態方法中不能使用this
/*
在測試類中的main函式使用xiaohei呼叫了show3方法,所以此處的this代表的就是xiaohei
而xiaohei本身是一個引用性的變數,是非靜態的,所以在靜態函式中不能訪問非靜態變數
*/
//this.show4();//錯誤演示
show4();
}
public static void show4() {
}
}
4.4 this()
訪問本類中的建構函式
注意:
a.必須出現在構造方法中 b.訪問的是除了當前構造方法之外的其他構造方法 c.具體訪問的是哪個構造方法,取決於所傳的引數 d.只能書寫在構造方法的第一條語句 e.this()在同一個構造方法中只能出現一次
class ThisUsageDemo02
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
class Dog
{
String name;
int age;
int num;
String hobby;
//提高程式碼的可讀性,可維護性
//構造方法
public Dog() {
}
public Dog(String name) {
this.name = name;
}
public Dog(int age) {
this.age = age;
}
public Dog(String name,int age) {
this.name = name;
this.age = age;
}
public Dog(String name,int age,int num,String hobby) {
this(name,age);
this.num= num;
this.hobby = hobby;
}
}
第五節:總結
第六節: 課前默寫
1.使用Arrays工具類完成下面操作
使用靜態初始化的方式初始化一個一維陣列
升序排序 實現二分法查詢 將陣列轉化為字串表示形式
遍歷出所有的元素
2.使用不定長引數自定義一個函式,函式主體部分實現只打印偶數的功能
第七節:作業
利用面向物件的思想寫下面的程式
1.小美在朝陽公園溜旺財【注:旺財是狗】
2.小明穿著白色的特步運動鞋在奧林匹克公園跑步
3.趙老師在講臺上講課,小剛認真的聽課做筆記
4.張阿姨和李阿姨在物美超市買紅富士
構造方法
1.定義一“圓”(Circle)類,圓心為“點”Point類,構造一圓,求圓的周長和麵積,並判斷某點與圓的關係
2.李曉在家裡開party,向朋友介紹家中的黃色的寵物狗【彩彩】具有兩條腿走路的特異功能。
3.王梅家的荷蘭寵物豬【笨笨】跑丟了,她哭著貼尋豬啟示。
4.富二代張三向女朋友李四介紹自己的新跑車:白色的賓利
第八節:面試題
1.什麼是面向物件?面向物件和麵向過程的區別是什麼
面向物件是基於面向物件的程式設計思想
面向過程強調的是每一個功能的實現,面向物件強調的是物件,然後用物件去呼叫功能。
2.構造方法與普通方法之間的區別
構造方法是一種特殊的方法,它是一個與類同名且返回值型別為同名類型別的方法。物件的建立就是通過構造方法來完成,其功能主要是完成物件的初始化。當類例項化一個物件時會自動呼叫構造方法。構造方法和其他方法一樣也可以過載。
3.this關鍵字的作用以及使用