文章目錄
面向對象介紹
一、面向過程和面向對象的差別
二、類和對象的關系
三、面向對象三個階段
四、局部變量和成員變量的差別
五、構造器
六、構造器的重載
面向對象介紹
一、面向過程和面向對象的差別
面向過程:當事件比較簡單的時候,利用面向過程,注重的是事件的具體的步驟/過程,注重的是過程中的具體的行為,以函數為最小機關,考慮怎麼做。
面向對象:注重找“參與者”,将功能封裝進對象,強調具備了功能的對象,以類/對象為最小機關,考慮誰來做。
案例:
人把大象裝進冰箱:
面向過程:
函數1:打開冰箱(){人站在冰箱前,打開冰箱,冰箱卡到30度角的時候,冰箱的燈打開了.........}
函數2:儲存大象(){大象先邁左腿,再邁右退,考慮冰箱能不能裝下......}
函數3:關閉冰箱(){人站在冰箱前,關閉冰箱,冰箱開到30度角的時候,冰箱的燈關閉了..........}
面向對象:
人{
打開(冰箱){
冰箱.打開();
}
存儲(大象){
大象.進入();
}
關閉(冰箱){
冰箱.關閉();
}
}
冰箱{
打開(){ 1.2.3.}
關閉(){}
}
櫃子{
}
大象{
進入(冰箱){
}
}
面向過程 ---> 面向對象 , 其實就是由執行者 ---> 指揮者的 一個過渡
面向過程:編年體
面向對象:紀傳體
二者相輔相成,并不是對立的。解決複雜問題,通過面向對象方式便于我們從宏觀上把握事物之間複雜的關系、友善我們分析整個系統;具體到微觀操作,仍然使用面向過程方式來處理
二、類和對象的關系
萬事萬物皆對象
對象:具體的事物,具體的實體,具體的執行個體,模闆下具體的産品
類:對對象向上抽取出像的部分,公共的部分,形成類,類是抽象的,是一個模闆
一般在寫代碼的時候先寫類,然後在根據類建立對應的對象。
三、面向對象三個階段
【1】面向對象分析OOA -- Object Oriented Analysis
對象:張三,王五,朱六,你,我
抽取出一個類----》人類
類裡面有什麼:
動詞--》動态特性--》方法
名詞--》靜态特性--》屬性
【2】面向對象設計OOD -- Object Oriented Design
先有類,再有對象:
類:人類: Person
對象:zhangsan ,lisi,zhuliu
【3】面向對象程式設計OOP -- Object Oriented Programming
建立類:
(1)屬性(field 成員變量)
屬性用于定義該類或該類對象包含的資料或者說靜态特征。屬性作用範圍是整個類體。
屬性定義格式:
[修飾符] 方法傳回值類型 方法名(形參清單) {
// n條語句
}
(2)方法
方法用于定義該類或該類執行個體的行為特征和功能實作。方法是類和對象行為特征的抽象。方法很類似于面向過程中的函數。面向過程中,函數是最基本機關,整個程式由一個個函數調用組成。面向對象中,整個程式的基本機關是類,方法是從屬于類和對象的。
方法定義格式:
[修飾符] 方法傳回值類型 方法名(形參清單) {
// n條語句
}
void代表沒有傳回值;方法的作用:重用代碼,封裝功能,便于修改
代碼:
package com.lanson;
/**
* @Auther: lanson
* 建立類:人類
*/
public class Person {
//名詞---》屬性---》成員變量---》放在類中方法外(注意:我們隻把有需要的内容寫到代碼裡,不相關的東西不要放在代碼中)
int age ;//年齡
String name;//姓名
double height;//身高
double weight;//體重
//動詞---》方法
//吃飯
public void eat(){
int num = 10;//局部變量:放在方法中
System.out.println("我喜歡吃飯");
}
//睡覺:
public void sleep(String address){
System.out.println("我在"+address+"睡覺");
}
//自我介紹:
public String introduce(){
return "我的名字是:"+name+",我的年齡是:"+age+",我的身高是:"+height+",我的體重是:"+weight;
}
}
建立對象
package com.lanson;
/**
* @Auther: lanson
*/
public class Test {//測試類
//這是一個main方法,是程式的入口:
public static void main(String[] args) {
//建立一個人類的具體的對象/執行個體:
//建立一個對象,對象的名字叫:zs
//Person 屬于 引用資料類型
//第一次加載類的時候,會進行類的加載,初始化建立對象的時候,對象的屬性沒有給指派,有預設的初始化的值。
Person zs = new Person();
zs.name = "張三";
zs.age = 19;
zs.height = 180.4;
zs.weight = 170.4;
//再建立一個對象:
//再次建立類的時候,就不會進行類的加載了,類的加載隻在第一次需要的時候加載一次
Person ls = new Person();
ls.name = "李四";
ls.age = 18;
ls.height = 170.6;
ls.weight = 160.5;
//對屬性值進行讀取:
System.out.println(zs.name);
System.out.println(ls.age);
//對方法進行操作:
//不同的對象,屬性有自己的特有的值,但是方法都是調用類中通用的方法。
//屬性:各個對象的屬性是獨立的,
//方法:各個對象的方法是共享的。
zs.eat();
ls.eat();
zs.sleep("教室");
/*String str = zs.introduce();
System.out.println(str);*/
System.out.println(zs.introduce());
}
}
四、局部變量和成員變量的差別
差別1:代碼中位置不同
成員變量:類中方法外定義的變量
局部變量:方法中定義的變量 代碼塊中定義的變量
差別2:代碼的作用範圍
成員變量:目前類的很多方法
局部變量:目前一個方法(目前代碼塊)
差別3:是否有預設值
成員變量:有
局部變量:沒有
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQDOxEzX3xCZlhXam9VbsUmepNXZy9CXwJWZ3xCdh1mcvZ2Lc1zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2cjN4EDZhNjM3kjZlFDZyYzX3AjM1YDM2EzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
引用資料類型: null
差別4:是否要初始化
成員變量:不需要,不建議初始化,後續使用的時候再指派即可
局部變量:一定需要,不然直接使用的時候報錯
差別5:記憶體中位置不同
成員變量:堆記憶體
局部變量:棧記憶體
差別6:作用時間不同
成員變量:目前對象從建立到銷毀
局部變量:目前方法從開始執行到執行完畢
代碼:
package com.lanson;
/**
* @Auther: lanson
*/
public class Student {
byte e;
short s;
int c ;//成員變量:在類中方法外
long num2;
float f ;
double d;
char ch;
boolean bo;
String name;
public void study(){
int num = 10 ; //局部變量:在方法中
System.out.println(num);//10
//int num ;重複命名,出錯了
{
int a;//局部變量:在代碼塊中
}
int a;
if(1==3){
int b;
}
System.out.println(c);
}
public void eat(){
System.out.println(c);
}
//這是一個main方法,是程式的入口:
public static void main(String[] args) {
Student s = new Student();
System.out.println(s.c);
System.out.println(s.bo);
System.out.println(s.ch);
System.out.println(s.d);
System.out.println(s.e);
System.out.println(s.f);
System.out.println(s.name);
System.out.println(s.num2);
System.out.println(s.s);
s.d = 10.4;
}
}
運作結果:
五、構造器
package com.lanson;
/**
* @Auther: lanson
*/
public class Person {
//構造器:沒有任何參數的構造器我們叫做:空參構造器--》空構造器
public Person(){
/*age = 19;
name = "lili";
height = 169.5;*/
}
//屬性:
String name;
int age;
double height;
//方法:
public void eat(){
System.out.println("我喜歡吃飯");
}
}
package com.lanson;
/**
* @Auther: lanson
*/
public class Test {
//這是一個main方法,是程式的入口:
public static void main(String[] args) {
//建立一個Person類的具體的對象/執行個體/實體:
/*
建立對象的過程:
1.第一次遇到Person的時候,進行類的加載(隻加載一次)
2.建立對象,為這個對象在堆中開辟空間
3.為對象進行屬性的初始化動作
new關鍵字實際上是在調用一個方法,這個方法叫構造方法(構造器)
調用構造器的時候,如果你的類中沒有寫構造器,那麼系統會預設給你配置設定一個構造器,隻是我們看不到罷了。
可以自己顯式 的将構造器編寫出來:
構造器的格式:
[修飾符] 構造器的名字(){
}
構造器和方法的差別:
1.沒有方法的傳回值類型
2.方法體内部不能有return語句
3.構造器的名字很特殊,必須跟類名一樣
構造器的作用:不是為了建立對象,因為在調用構造器之前,這個對象就已經建立好了,并且屬性有預設的初始化的值。
調用構造器的目的是給屬性進行指派操作的。
注意:我們一般不會在空構造器中進行初始化操作,因為那樣的話每個對象的屬性就一樣了。
實際上,我們隻要保證空構造器的存在就可以了,裡面的東西不用寫
*/
Person p = new Person();
System.out.println(p.age);
System.out.println(p.name);
System.out.println(p.height);
Person p2 = new Person();
System.out.println(p2.age);
System.out.println(p2.name);
System.out.println(p2.height);
}
}
六、構造器的重載
package com.lanson;
/**
* @Auther: lanson
*/
public class Person {
//屬性:
String name;
int age;
double height;
//空構造器
public Person(){
}
public Person(String name,int age,double height){
//當形參名字和屬性名字重名的時候,會出現就近原則:
//在要表示對象的屬性前加上this.來修飾 ,因為this代表的就是你建立的那個對象
this.name = name;
this.age = age;
this.height = height;
}
public Person(String a,int b){
name = a;
age = b;
}
//方法:
public void eat(){
System.out.println("我喜歡吃飯");
}
}
/**
* @Auther: lanson
*/
public class Test {
//這是一個main方法,是程式的入口:
public static void main(String[] args) {
/*
1.一般保證空構造器的存在,空構造器中一般不會進行屬性的指派操作
2.一般我們會重載構造器,在重載的構造器中進行屬性指派操作
3.在重載構造器以後,假如空構造器忘寫了,系統也不會給你配置設定預設的空構造器了,那麼你要調用的話就會出錯了。
4. 當形參名字和屬性名字重名的時候,會出現就近原則:
在要表示對象的屬性前加上this.來修飾 ,因為this代表的就是你建立的那個對象
*/
Person p = new Person();
/*p.age = 19;
p.name = "lili";
p.height = 180.4;*/
Person p2 = new Person("lili",19,180.4);
System.out.println(p2.age);
System.out.println(p2.height);
System.out.println(p2.name);
}
}
- 📢歡迎點贊 👍 收藏 ⭐留言 📝 如有錯誤敬請指正!
- 📢本文由 Lansonli 原創
- 📢停下休息的時候不要忘了别人還在奔跑,希望大家抓緊時間學習,全力奔赴更美好的生活✨