JavaSE學習筆記05面向物件程式設計01
面向物件程式設計01
java的核心思想就是OOP
面向過程&面向物件
面向過程思想:
- 步驟清晰簡單,第一步做什麼,第二步做什麼......
- 面向過程適合處理一些較為簡單的問題
面向物件思想:
- 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考。最後才對某個分類下的細節進行面向過程的思索
- 面向物件適合處理複雜的問題,適合處理需要多人協作的問題
對於描述複雜的事物,為了從巨集觀上把握、從整體上合理分析,我們需要使用面向物件的思路來分析整個系統。但是,具體到微觀操作,仍然需要面向過程的思路去處理。
面向物件程式設計(Object-Oriented Programming,OOP)
面向物件程式設計的本質就是:以類的方式組織程式碼,以物件的形式組織(封裝)資料
三大特性:封裝、繼承、多型
1.回顧方法
方法的定義
package com.oop.demo01; //Demo01類 public class Demo01 { //main方法 public static void main(String[] args) { } /* 修飾符 返回值 方法名(...){ //方法體 return 返回值 } */ //return 結束方法,返回一個結果! public String sayHello(){ return "Hello,world"; } public void print(){ return; } public int max(int a,int b){ return a > b ? a : b;//三元運算子 } }
方法的呼叫
package com.oop.demo01;
public class Demo02 {
public static void main(String[] args) {
//例項化這個類new
//物件型別 物件名 = 物件值
Student student = new Student();
//呼叫
student.say();
}
}
package com.oop.demo01; //學生類 public class Student { //非靜態方法 public void say(){ System.out.println("學生說話了"); } }
package com.oop.demo01;
public class Demo03 {
public static void main(String[] args) {
//實際引數和形式引數的型別要對應
int add = Demo03.add(1,2);
System.out.println(add);
}
public static int add(int a, int b){
return a + b;
}
}
值傳遞與引用傳遞
package com.oop.demo01;
//值傳遞
public class Demo04 {
public static void main(String[] args) {
int a = 1;
System.out.println(a);//1
Demo04.change(a);
System.out.println(a);//1
}
//返回值為空
public static void change(int a){
a = 10;
}
}
package com.oop.demo01;
//引用傳遞:物件,本質還是值傳遞
public class Demo05 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);//null
Demo05.change(person);
System.out.println(person.name);//阿波
}
public static void change(Person person){
//person是一個物件:指向的--->Person person = new Person();這是一個具體的人,可以改變屬性!
person.name = "阿波";
}
}
//定義了一個Person類,有一個屬性:name
class Person{
String name;//預設值為null
}
變數知識點補充
java中一共有三大變數:區域性變數、例項變數(物件級別)、靜態變數(類級別)
-
區域性變數儲存在棧(stack)
-
例項變數儲存在堆記憶體
-
靜態變數儲存在方法區
2.類與物件的關係
類是一種抽象的資料型別,它是對某一類事物的整體描述/定義,但是並不能代表某一個具體的事物
- 動物、植物、手機、電腦......
- Peson類、Pet類、Car類等,這些類都是用來描述/定義某一類具體的事物應該具備的特點和行為
物件是抽象概念的具體例項
- 張三就是人的一個具體例項,張三家裡的旺財就是狗的一個具體例項
- 能夠體現出特點,展現出功能的是具體的例項,而不是一個抽象的概念
建立與初始化物件
物件的建立和使用:
-
類是一個模板,通過一個類,是可以建立N多個物件的
-
new是一個運算子,專門負責物件的建立
//例:
XueSheng s1 = new XueSheng();
S1是變數名(區域性變數),XueSheng是變數s1的資料型別(引用資料型別),XueSheng()是一個物件(學生類創建出來的學生物件)
package com.oop.demo02;
//使用new關鍵字建立物件
//一個專案應該只有一個main方法
public class Application {
public static void main(String[] args) {
//類,抽象的,例項化
//類例項化後會返回一個Student類的具體例項
//student物件就是一個Student類的具體例項
Student xiaoming = new Student();
Student xiaohong = new Student();
xiaoming.name = "小明";
xiaoming.age = 3;
System.out.println(xiaoming.name);
System.out.println(xiaoming.age);
xiaohong.name = "小紅";
xiaohong.age = 3;
System.out.println(xiaohong.name);
System.out.println(xiaohong.age);
}
}
package com.oop.demo02;
//學生類
public class Student {
//屬性:欄位
String name;//預設值為null
int age;//預設值為0
//方法
public void study(){
System.out.println(this.name + "在學習");
}
}
構造方法
使用new建立物件的時候,除了分配記憶體空間之外,還會給建立好的物件進行預設的初始化以及對類中構造器的呼叫。
類中的構造器也稱為構造方法,是在進行建立物件的時候必須要呼叫的。並且構造器有以下兩個特點:
- 必須和類的名字相同
- 必須沒有返回值型別,也不能寫void
package com.oop.demo02;
public class Application {
public static void main(String[] args) {
//new 例項化了一個物件
Person person = new Person();
System.out.println(person.name);//阿波
Person person1 = new Person("波波");
System.out.println(person1.name);//波波
}
}
package com.oop.demo02;
public class Person {
//一個類即使什麼都不寫,他也會存在一個構造方法
String name;
//顯示的定義構造器
//無參構造
//例項化初始值,使用new關鍵字本質上是在呼叫構造器
public Person(){
this.name = "阿波";
}
//有參構造,一旦定義了有參構造,無參構造必須顯示定義
public Person(String name){
this.name = name;
}
}
/*
1.快捷鍵:Alt + insert會彈出一個小視窗
2.選擇Constructor,勾選引數再點0k即可
3.若要選擇無參,選擇Constructor後點select none
*/
構造方法的作用:
-
建立物件
-
給屬性賦值
注意:
-
構造方法支援過載
-
當一個類沒有提供任何構造方法的時候,系統會預設提供一個無引數的構造方法(這個方法被稱為預設構造器)
-
手動定義有參的構造方法,無引數構造方法將消失(保險一些建議將無引數的構造方法手寫出來)
-
構造方法中沒有手動賦值,統一都會預設賦值,預設賦系統值
空指標異常
空引用訪問物件相關的資料時,會出現空指標異常(NullPointerException)
Public class NullPointerTest{
Public static void main(String[] args){
//建立客戶物件
Customer c = new Customer();
//訪問這個客戶的id
System.out.println(c.id);//0
//重新給id賦值
c.id = 9527;
System.out.println(“客戶的id是” + c.id);
c = null;
// NullPointerException
//編譯沒問題,因為編譯器只檢查語法
//但是執行的時候需要物件的存在,但是物件沒了(null)
//就只能出現異常
System.out.println(c.id);
}
}
Class Customer{
int id;
}
3.靜態程式碼塊和例項語句塊(擴充套件)
static(靜態的)關鍵字
-
所有static關鍵字修飾的都是類相關的,類級別的
-
都採用類名.的方式訪問
Static修飾的變數:靜態變數
Static修飾的方法:靜態方法
//靜態程式碼塊語法:
Static{
Java語句;
Java語句;
}
//特點:靜態程式碼塊在類載入時執行,並且只執行一次
//作用:記錄類載入的日誌資訊
Public class Test{
//靜態程式碼塊
Static{
System.out.println(“A”);
}
//一個類當中可以編寫多個靜態程式碼塊
Static{
System.out.println(“B”);
}
//入口
Public static void main(String[] args){
System.out.println(“Hello World!”);
}
Static{
System.out.println(“C”);
}
}
//執行結果:A,B,C,Hell World!
//注意:靜態程式碼塊在main方法執行之前執行
//例項語句塊
//語法:
{
Java語句;
Java語句;
}
//只要是構造方法執行,必然在構造方法執行之前,自動執行“例項語句塊”中的程式碼
4.this關鍵字
-
一個物件一個this,this儲存在堆記憶體當中物件的內部
-
this是一個變數,一個引用,this儲存當前物件的記憶體地址,指向自身
-
this不能使用在靜態方法中,this只能使用在例項方法中,誰呼叫這個例項方法,this就是誰,所以this代表的是:當前物件
-
大部分情況下this可以省略