# 【狂神說Java】Java零基礎學習筆記-面向對象 ## 面向對象01:什麼是面向對象 ### 面向過程&面向對象 - 面向過程思想 - 步驟清晰簡單,第一步做什麼,第二步做什麼.... - 面對過程適合處理一些較為簡單的問題 - 面向對象思想 - 物以類聚,**分類**的思維模式,思考問題首先 ...
【狂神說Java】Java零基礎學習筆記-面向對象
面向對象01:什麼是面向對象
面向過程&面向對象
- 面向過程思想
- 步驟清晰簡單,第一步做什麼,第二步做什麼....
- 面對過程適合處理一些較為簡單的問題
- 面向對象思想
- 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考。最後,才對某個分類下的細節進行面向過程的思索。
- 面向對象適合處理複雜的問題,適合處理需要多人協作的問題!
- 對於描述複雜的事物,為了從巨集觀上把握、從整體上合理分析,我們需要使用面向對象的思路來分析整個系統。但是,具體到微觀操作,仍然需要面向過程的思路去處理。
什麼是面向對象
- 面向對象編程(Object-Oriented Programming, OOP)
- 面向對象編程的本質就是:以類的方式組織代碼,以對象的組織(封裝)數據。
- 抽象:編程思想!持續的學習,茅塞頓開!多實踐,多測試大腦中的想法!實踐出真知~
- 三大特性:
- 封裝
- 繼承
- 多態
- 從認識論角度考慮是先有對象後有類。對象,是具體的事物。類,是抽象的,是對對象的抽象
- 從代碼運行角度考慮是先有類後有對象。類是對象的模板。
面向對象02:回顧方法的定義
回顧方法及加深
- 方法的定義
- 修飾符
- 返回類型
- break:跳出switch,結束迴圈 和 return的區別
- 方法名:註意規範就OK 見名知意
- 參數列表:(參數類型,參數名)...
- 異常拋出:疑問,後面講解
- 方法的調用:遞歸
- 靜態方法
- 非靜態方法
- 形參和實參
- 值傳遞和引用傳遞
- this關鍵字
package com.oop.demo01;
import java.io.IOError;
import java.io.IOException;
//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; //三元運算符!
}
//數組下標越界: Arrayindexoutofbounds
public void readFile(String file) throws IOException{
}
}
面向對象03:回顧方法的調用
package com.oop.demo01;
public class Demo02 {
public static void main(String[] args) {
// //靜態方法 static
// Student.say();
//非靜態方法
//實例化這個類 new
//對象類型 對象名 = 對象值;
Student student = new Student();
student.say();
}
//static和類一起載入的
public static void a(){
//b();
}
//類實例化 之後才存在
public void b(){
}
}
學生說話了
package com.oop.demo01;
//學生類
public class Student {
// //靜態方法
// public static void say(){
// System.out.println("學生說話了");
// }
//非靜態方法
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;
}
}
3
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;
}
}
1
1
package com.oop.demo01;
//引用傳遞:對象
//對象,記憶體!
public class Demo05 {
public static void main(String[] args) {
Perosn perosn = new Perosn();
System.out.println(perosn.name); //null
Demo05.change(perosn);
System.out.println(perosn.name); //黎明の微笑
}
public static void change(Perosn perosn){
//perosn是一個對象,指向的--->Perosn perosn = new Perosn(); 這是一個具體的人,可以改變屬性!
perosn.name = "黎明の微笑";
}
}
//定義了一個Perosn類,有一個屬性:name
class Perosn{
String name; //null
}
null
黎明の微笑
面向對象04:類與對象的創建
類與對象的關係
-
類是一種抽象的數據類型,它是對某一類事物整體描述/定義,但是並不能代表某一個具體的事物.
- 動物、植物、手機、電腦......
- Person類、Pet類、Car類等,這些類都是用來描述/定義某一類具體的事物應該具畝的特點和行為
-
對象是抽象概念的具體實例
-
張三就是人的一個具體實例,張三家裡的旺財就是狗的一個具體實例。
-
能夠體現出特點,展現出功能的是具體的實例,而不是一個抽象的概念.
-
我們可以將這些思想轉換為代碼實現!
創建與初始化對象
- 使用new關鍵字創建對象
- 使用new關鍵字創建的時候,除了分配記憶體空間之外,還會給創建好的對象進行預設的初始化以及對類中構造器的調用。
- 類中的構造器也稱為構造方法,是在進行創建對象的時候必須要調用的。並且構造器有以下倆個特點:
- 1.必須和類的名字相同
- 2.必須沒有返回類型,也不能寫void
- 構造器必須要掌握
package com.oop.demo02;
//學生類
public class Student {
//屬性:欄位
String name; //null
int age; //0
//方法
public void study(){
System.out.println(this.name+"在學習");
}
}
//Person ---> 身高,體重,年齡,國家
//學程式好?對世界進行更好的建模! --->宅! --->音樂,旅游,出國!
package com.oop.demo02;
//一個項目應該只存一個main方法
public class Application {
public static void main(String[] args) {
//類:抽象的,實例化
//類實例化後會返回一個自己的對象!
// student對象就是一個student類的具體實例!
Student xiaoming = new Student();
Student xh = new Student();
xiaoming.name = "小明";
xiaoming.age = 3;
System.out.println(xiaoming.name);
System.out.println(xiaoming.age);
xh.name = "小紅";
xh.age = 3;
System.out.println(xh.name);
System.out.println(xh.age);
}
}
小明
3
小紅
3
面向對象05:構造器詳解
package com.oop.demo02;
//java ---> class
public class Person {
//一個類即使什麼都不寫,它也會存在一個方法
//顯示的定義構造器
String name;
int age;
//alt + insert
//實例化初始值
//1.使用new關鍵字,本質是在調用構造器
//2.用來初始化值
public Person(){
}
//有參構選:一旦定義了有參構造,無參就必須顯示定義
public Person(String name){
this.name = name;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
/*
public static void main(String[] args) {
//new 實例化了一個對象
Person person = new Person("liming",23);
System.out.println(person.name); //liming
}
*/
/*
構造器:
1.和類名相同
2.沒有返回值
作用:
1.new本質在調用構造方法
2.初始化對象的值
註意點:
1.定義有參構造之後,如果想使用無參構造,顯示的定義一個無參的構造
ALt + Insert
this. =
*/
面向對象06:創建對象記憶體分析
package com.oop.demo03;
public class Pet {
public String name;
public int age;
//無參構造
public void shout(){
System.out.println("叫了一聲");
}
}
/*
public static void main(String[] args) {
Pet dog = new Pet();
dog.name = "旺財";
dog.age = 3;
dog.shout();
System.out.println(dog.name);
System.out.println(dog.age);
Pet cat = new Pet();
}
*/
面向對象07:簡單小結類與對象
/*
1.類與對象
類是一個模板:抽象,對象是一個具體的實例
2.方法
定義、調用!
3.對應的引用
引用類型: 基本類型(8)
對象是通過引用來操作的:棧 ---> 堆
4.屬性:欄位 Field 成員變數
預設初始化:
數字:0 0.0
char:u0000
boolean:false
引用:nuLL
修飾符 屬性類型 屬性名 = 屬性值!
5.對象的創建和使用
- 必須使用 new 關鍵字創造對象,構造器 Person kuangshen = new Person();
- 對象的屬性 kuangshen.name
- 對象的方法 kuangshen.sleep()
6.類
靜態的屬性 屬性
動態的行為 方法
`封裝、繼承、多態`
*/
面向對象08:封裝詳解
封裝
- 該露的露,該藏的藏
- 我們程式設計要追求“高內聚,低耦合”。高內聚就是類的內部數據操作細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用。
- 封裝(數據的隱藏)
- 通常,應禁止直接訪問一個對象中數據的實際表示,而應通過操作介面來訪問,這稱為信息隱藏。
- 記住這句話就夠了:屬性私有,get/set
package com.oop.demo04;
//類 private:私有
public class Student {
//屬性私有
private String name; //名字
private int id; //學號
private char sex; //性別
private int age; //年齡
//提供一些可以操作這個屬性的方法!
//提供一些 public 的 get、set 方法
//get 獲得這個數據
public String getName(){
return this.name;
}
//set 給這個數據設置值
public void setName(String name){
this.name = name;
}
//alt + insert
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age>120 || age<0){ //不合法
this.age = 3;
}else {
this.age = age;
}
}
}
/*
1. 提高程式的安全性,保護數據
2. 隱藏代碼的實現細節
3. 統一介面
4. 系統可維護增加了
*/
/*
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("黎明の微笑");
System.out.println(s1.getName());
s1.setAge(-1); //不合法的
System.out.println(s1.getAge());
}
*/
面向對象09:什麼是繼承
繼承
-
繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模。
-
extends的意思是“擴展”。子類是父類的擴展。
-
JAVA中類只有單繼承,沒有多繼承!一個兒子只能有一個爸爸,但是一個爸爸可以有多個兒子
-
繼承是類和類之間的一種關係。除此之外,類和類之間的關係還有依賴、組合、聚合等。
-
繼承關係的倆個類,一個為子類(派生類)一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示。
-
子類和父類之間,從意義上講應該具有"is a"的關係。
-
object類
-
super
-
方法重寫:重點--->多態
package com.oop.demo05;
//在Java中,所有的類,都預設直接或者間接繼承Object
//Person 人 : 父類
public class Person /*extends Object*/ {
//public
//protected
//default
//private
private int money = 10_0000_0000;
public void say(){
System.out.println("說了一句話");
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
/*
ctrl + H 樹
*/
/*
public static void main(String[] args) {
Person person = new Person();
Student student = new Student();
student.say();
System.out.println(student.getMoney());
}
*/
package com.oop.demo05;
//Student is 人 : 派生類,子類
//子類繼承了父類,就會擁有父類的全部方法!
public class Student extends Person {
}
package com.oop.demo05;
//Teacher is 人 : 派生類,子類
public class Teacher extends Person {
}
面向對象10:Super詳解
super註意點:
- super 調用父類的構造方法,必須在構造方法的第一個
- super 必須只能出現在子類的方法或者構造方法中!
- super 和 this不能同時調用構造方法!
Vs this:
代表的對象不同:
this:本身調用者這個對象
super:代表父類對象的應用
前提
this:沒喲繼承也可以使用
super:只能在繼承條件才可以使用
構造方法
this();本類的構造
super();父類的構造!
package com.oop.demo05;
public class Person /*extends Object*/ {
public Person() {
System.out.println("Person無參執行了");
}
// public Person(String name) {
// System.out.println("Person有參執行了");
// }
protected String name = "liming";
//私有的東西無法被繼承!
public void print(){
System.out.println("Person");
}
}
/*
public static void main(String[] args) {
Student student = new Student();
//student.test1();
//student.test("微笑");
}
*/
package com.oop.demo05;
public class Student extends Person {
public Student() {
//隱敲代碼:調川了父類的無參構選
super(); //調用父類的構造器,必須要在子類構造器的第一行
//this("hello");
System.out.println("Student無參執行了");
// super("name");
// System.out.println("Student有參執行了");
}
public Student(String name) {
this.name = name;
}
private String name = "weixiao";
public void print(){
System.out.println("Student");
}
// public void test1(){
// print(); //Student
// this.print(); //Student
// super.print(); //Person
// }
// public void test(String name){
// System.out.println(name); //微笑
// System.out.println(this.name); //weixiao
// System.out.println(super.name); //liming
// }
}
面向對象11:方法重寫
重寫:需要有繼承關係,子類重寫父類的方法!
1.方法名必須相同
2.參數列表列表必須相同
3.修飾符:範圍可以擴大但不能縮小: public>Protected>Default>private
4.拋出的異常:範圍,可以被縮小,但不能擴大; ClassNotFoundException ---> Exception(大)
重寫,子類的方法和父類必要一致;方法體不同!
為什麼需要重寫:
1.父類的功能,子類不一定需要,或者不一定滿足!Alt + Insert ; override;
package com.oop.demo05;
//重寫都是方法的重寫,和屬性無關
public class B {
// public static void test(){
// System.out.println("B=>test()");
// }
public void test(){
System.out.println("B=>test()");
}
}
/*
//靜態的方法和非靜態的方法區別很大!
//靜態方法://方法的調用只和左邊,定義的數據類型有關
//非靜態:重寫
public static void main(String[] args) {
A a = new A();
a.test(); //A
//父類的引川指向了子類
B b = new A(); //子類重寫了父類的方法
b.test(); //B
}
*/
package com.oop.demo05;
//繼承
public class A extends B {
// public static void test(){
// System.out.println("A=>test()");
// }
//Override 重寫
@Override //註解:有功能的註釋!
public void test() {
System.out.println("A=>test()");
}
}
面向對象12:什麼是多態
多態
- 即同一方法可以根據發送對象的不同而採用多種不同的行為方式。
- 一個對象的實際類型是確定的,但可以指向對象的引用的類型有很多(父類,有關係的類)
- 多態存在的條件
- 有繼承關係
- 子類重寫父類方法
- 父類引用指向子類對象
- 註意:多態是方法的多態,屬性沒有多態性。
- instanceof (類型轉換) 引用類型,判斷一個對象是什麼類型~
package com.oop.demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
/*
多態註意事項:
1. 多態是方法的多態,屬性沒有多態
2. 父類和子類,有聯繫類型轉換異常! ClassCastException!
3. 存在條件:繼承關係,方法需要重寫,父類引用指向子類對象! Father f1 = new Son();
1. static 靜態方法,屬於類,它不屬於實例
2. final 常量;
3. private 私有方法;
*/
/*
public static void main(String[] args) {
//一個對象的實際類型是確定的
//new Student();
//new Person();
//可以指向的引川類型就不確定了:父類的引用指向子類
//Student 子類型,能調用的方法都是自己的或者然承父類的!
Student s1 = new Student();
//Person 父類型,可以指向了類,但是不能調用子類獨有的方法
Person s2 = new Student();
Object s3 = new Student();
//對象能執行哪些方法,主要看對象左邊的類型,和右邊關係不大!
s2.run(); //子類重寫了父類的方法,執行子類的方法
s1.run();
//s2.eat();
((Student) s2).eat();
s1.eat();
}
*/
package com.oop.demo06;
public class Student extends Person {
@Override
public void run() {
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
面向對象13:instanceof和類型轉換
package com.oop.demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
/*
public static void main(String[] args) {
//Object > Person > Student
//Object > Person > Teacher
//Object > String
//System.out.println(X instanceof Y); //能不能編譯通過!
Object object = new Student();
System.out.println(object instanceof Student); //true
System.out.println(object instanceof Person); //true
System.out.println(object instanceof Object); //true
System.out.println(object instanceof Teacher); //false
System.out.println(object instanceof String); //false
System.out.println("====================");
Person person = new Student();
System.out.println(person instanceof Student); //true
System.out.println(person instanceof Person); //true
System.out.println(person instanceof Object); //true
System.out.println(person instanceof Teacher); //false
//System.out.println(person instanceof String); //編譯報錯!
System.out.println("====================");
Student student = new Student();
System.out.println(student instanceof Student); //true
System.out.println(student instanceof Person); //true
System.out.println(student instanceof Object); //true
//System.out.println(student instanceof Teacher); //編譯報錯!
//System.out.println(student instanceof String); //編譯報錯!
}
*/
/*
public static void main(String[] args) {
//類型之間的轉化:父 子
// //高 低
// Person obj = new Student();
//
// //student將這個對象轉換為Student類型,我們就可以使川Student類型的方法了!
// Student student = (Student) obj;
// student.go();
// //((Student) obj).go();
//子類轉換為父類,可能丟失自己的本來的一些方法!
Student student = new Student();
student.go();
Person person = student;
}
*/
/*
1. 父類引用指向子類的對象
2. 把子類轉換為父類,向上轉型;
3. 把父類轉換為子類,向下轉型; 強制轉換
4. 方便方法的調用,減少重覆的代碼!簡介
封裝、繼承、多態! 抽象類,介面
*/
package com.oop.demo06;
public class Student extends Person {
public void go(){
System.out.println("go");
}
}
package com.oop.demo06;
public class Teacher extends Person {
}
面向對象14:static關鍵字詳解
package com.oop.demo07;
//static
public class Student {
private static int age; //靜態的變數 多線程!
private double score; //非靜態的變數
public void run(){
}
public static void go(){
}
public static void main(String[] args) {
// Student s1 = new Student();
//
// System.out.println(Student.age);
// //System.out.println(Student.score);
// System.out.println(s1.age);
// System.out.println(s1.score);
//run();
go();
}
}
package com.oop.demo07;
public class Person {
//2:賦初值~
{
//代碼塊(匿名代碼塊)
System.out.println("匿名代碼塊");
}
//1:只執行一次~
static {
//靜態代碼塊
System.out.println("靜態代碼塊");
}
//3
public Person() {
System.out.println("構造方法");
}
public static void main(String[] args) {
Person person1 = new Person();
System.out.println("====================");
Person person2 = new Person();
}
}
靜態代碼塊
匿名代碼塊
構造方法
====================
匿名代碼塊
構造方法
package com.oop.demo07;
//靜態導入包~
import static java.lang.Math.random;
import static java.lang.Math.PI;
public class Test {
public static void main(String[] args) {
System.out.println(random());
System.out.println(PI);
}
}
面向對象15:抽象類
抽象類
- abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那麼該方法就是抽象方法;如果修飾類,那麼該類就是抽象類。
- 抽象類中可以沒有抽象方法,但是有抽象方法的類一定要聲明為抽象類。
- 抽象類,不能使用new關鍵字來創建對象,它是用來讓子類繼承的。
- 抽象方法,只有方法的聲明,沒有方法的實現,它是用來讓子類實現的。
- 子類繼承抽象類,那麼就必須要實現抽象類沒有實現的抽象方法,否則該子類也要聲明為抽象類。
package com.oop.demo08;
//abstract 抽象類:類 extends 單繼承~ (介面可以多繼承)
public abstract class Action {
//約束~有人幫我們實現~
//abstract 抽象方法,只有方法名字,沒有方法的實現!
public abstract void doSomething();
//1. 不能new這個抽象類,只能靠子類去實現它;約束!
//2. 抽象類中可以寫普通的方法~
//3. 抽象方法必須在抽象類中~
//抽象的抽象:約束~
//思考題?
//new,存在構造器麽? (存在)
//抽象類存在的意義 抽象出來~ 提高開發效率
}
package com.oop.demo08;
//抽象類的所有方法,繼承了它的子類,都必須要實現它的方法~ 除非子類也是抽象的(abstract)~
public class A extends Action {
@Override
public void doSomething() {
}
}
面向對象16:介面的定義與實現
介面
- 普通類:只有具體實現
- 抽象類:具體實現和規範(抽象方法)都有!
- 介面:只有規範!自己無法寫方法專業的約束!約束和實現分離:面向介面編程
- 介面就是規範,定義的是一組規則,體現了現實世界中“如果你是...則必須能…”的思想。如果你是天使,則必須能飛。如果你是汽車,則必須能跑。如果你好人,則必須幹掉壞人;如果你是壞人,則必須欺負好人。
- 介面的本質是契約,就像我們人間的法律一樣。制定好後大家都遵守。
- OO的精髓,是對對象的抽象,最能體現這一點的就是介面。為什麼我們討論設計模式都只針對具備了抽象能力的語言(比如c++、java、c#等),就是因為設計模式所研究的,實際上就是如何合理的去抽象。
聲明類的關鍵字是class,聲明介面的關鍵字是interface
作用:
1. 約束
2. 定義一些方法,讓不同的人實現~ 10 ---> 1
3. public abstract
4. public static final
5. 介面不能被實例化~,介面中沒有構造方法~
6. implements可以實現多個介面
7. 必須要重寫介面中的方法~
8. 總結博客~
package com.oop.demo09;
//抽象的思維~ Java 架構師~
//interface 定義的關鍵字 , 介面都需要有實現類
public interface UserService {
//常量~ public static final
int AGE = 99;
//介面中的所有定義的方法其實都是抽象的 public abstract
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
package com.oop.demo09;
//抽象類:extends~
//類 可以實現介面 implements 介面
//父現了介面的類,就需要重寫介面中的方法~
//多繼承~利用介面實現多繼承~
public class UserServiceImpl implements UserService,TimeService {
@Override
public void add(String name) {
}
@Override
public void delete(String name) {
}
@Override
public void update(String name) {
}
@Override
public void query(String name) {
}
@Override
public void timer() {
}
}
package com.oop.demo09;
public interface TimeService {
void timer();
}
面向對象17:N種內部類
內部類
- 內部類就是在一個類的內部在定義一個類,比如,A類中定義一個B類,那麼B類相對A類來說就稱為內部類,而A類相對B類來說就是外部類了。
- 1.成員內部類
- 2.靜態內部類
- 3.局部內部類
- 4.匿名內部類
package com.oop.demo10;
public class Outer {
private int id=10;
public void out(){
System.out.println("這是外部類的方法");
}
public class Inner{
public void in(){
System.out.println("這是內部類的方法");
}
//獲得外部類的私有屬性~
public void getID(){
System.out.println(id);
}
}
//局部內部類
public void method(){
class Inner{
public void in(){
}
}
}
}
//一個java類中可以有多個class類,但是只能有一個public class
class A{
public static void main(String[] args) {
}
}
/*
public static void main(String[] args) {
//new
Outer outer = new Outer();
//通過這個外部類來實例化內部類~
Outer.Inner inner = outer.new Inner();
inner.in();
inner.getID();
}
*/
package com.oop.demo10;
public class Test {
public static void main(String[] args) {
//沒有名字初始化類,不用將實例保存到變數中~
new Apple().eat();
UserService userService = new UserService() {
@Override
public void hello() {
}
};
}
}
class Apple{
public void eat(){
System.out.println("1");
}
}
interface UserService{
void hello();
}
【【狂神說Java】Java零基礎學習視頻通俗易懂】https://www.bilibili.com/video/BV12J41137hu?p=60&vd_source=fd5defd6aaa826e3b6e0c06073353e32
本文來自博客園,作者:黎明の微笑,轉載請註明原文鏈接:https://www.cnblogs.com/Ge-sun-smile/p/17637272.html