【狂神說Java】Java零基礎(chǔ)學(xué)習(xí)筆記-面向?qū)ο?/h2>
面向?qū)ο?1:什么是面向?qū)ο?/h2>
面向過程&面向?qū)ο?/h3>
- 面向過程思想
- 步驟清晰簡單,第一步做什么,第二步做什么....
- 面對過程適合處理一些較為簡單的問題
- 面向?qū)ο笏枷?
- 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然后對這些分類進(jìn)行單獨思考。最后,才對某個分類下的細(xì)節(jié)進(jìn)行面向過程的思索。
- 面向?qū)ο筮m合處理復(fù)雜的問題,適合處理需要多人協(xié)作的問題!
- 對于描述復(fù)雜的事物,為了從宏觀上把握、從整體上合理分析,我們需要使用面向?qū)ο蟮乃悸穪矸治稣麄€系統(tǒng)。但是,具體到微觀操作,仍然需要面向過程的思路去處理。
什么是面向?qū)ο?/h3>
- 面向?qū)ο缶幊?Object-Oriented Programming, OOP)
- 面向?qū)ο缶幊痰谋举|(zhì)就是:以類的方式組織代碼,以對象的組織(封裝)數(shù)據(jù)。
- 抽象:編程思想!持續(xù)的學(xué)習(xí),茅塞頓開!多實踐,多測試大腦中的想法!實踐出真知~
- 三大特性:
- 封裝
- 繼承
- 多態(tài)
- 從認(rèn)識論角度考慮是先有對象后有類。對象,是具體的事物。類,是抽象的,是對對象的抽象
- 從代碼運行角度考慮是先有類后有對象。類是對象的模板。
面向?qū)ο?2:回顧方法的定義
回顧方法及加深
- 方法的定義
- 修飾符
- 返回類型
- break:跳出switch,結(jié)束循環(huán) 和 return的區(qū)別
- 方法名:注意規(guī)范就OK 見名知意
- 參數(shù)列表:(參數(shù)類型,參數(shù)名)...
- 異常拋出:疑問,后面講解
- 方法的調(diào)用:遞歸
- 靜態(tài)方法
- 非靜態(tài)方法
- 形參和實參
- 值傳遞和引用傳遞
- this關(guān)鍵字
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 結(jié)束方法,返回一個結(jié)果!
public String sayHello(){
return "hello,world";
}
public void print(){
return;
}
public int max(int a,int b){
return a>b ? a : b; //三元運算符!
}
//數(shù)組下標(biāo)越界: Arrayindexoutofbounds
public void readFile(String file) throws IOException{
}
}
面向?qū)ο?3:回顧方法的調(diào)用
package com.oop.demo01;
public class Demo02 {
public static void main(String[] args) {
// //靜態(tài)方法 static
// Student.say();
//非靜態(tài)方法
//實例化這個類 new
//對象類型 對象名 = 對象值;
Student student = new Student();
student.say();
}
//static和類一起加載的
public static void a(){
//b();
}
//類實例化 之后才存在
public void b(){
}
}
學(xué)生說話了
package com.oop.demo01;
//學(xué)生類
public class Student {
// //靜態(tài)方法
// public static void say(){
// System.out.println("學(xué)生說話了");
// }
//非靜態(tài)方法
public void say(){
System.out.println("學(xué)生說話了");
}
}
package com.oop.demo01;
public class Demo03 {
public static void main(String[] args) {
//實際參數(shù)和形式參數(shù)的類型要對應(yīng)!
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;
//引用傳遞:對象
//對象,內(nèi)存!
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
黎明の微笑
面向?qū)ο?4:類與對象的創(chuàng)建
類與對象的關(guān)系
-
類是一種抽象的數(shù)據(jù)類型,它是對某一類事物整體描述/定義,但是并不能代表某一個具體的事物.
- 動物、植物、手機、電腦......
- Person類、Pet類、Car類等,這些類都是用來描述/定義某一類具體的事物應(yīng)該具畝的特點和行為
-
對象是抽象概念的具體實例
-
張三就是人的一個具體實例,張三家里的旺財就是狗的一個具體實例。
-
能夠體現(xiàn)出特點,展現(xiàn)出功能的是具體的實例,而不是一個抽象的概念.
面向過程&面向?qū)ο?/h3>
- 面向過程思想
- 步驟清晰簡單,第一步做什么,第二步做什么....
- 面對過程適合處理一些較為簡單的問題
- 面向?qū)ο笏枷?
- 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然后對這些分類進(jìn)行單獨思考。最后,才對某個分類下的細(xì)節(jié)進(jìn)行面向過程的思索。
- 面向?qū)ο筮m合處理復(fù)雜的問題,適合處理需要多人協(xié)作的問題!
- 對于描述復(fù)雜的事物,為了從宏觀上把握、從整體上合理分析,我們需要使用面向?qū)ο蟮乃悸穪矸治稣麄€系統(tǒng)。但是,具體到微觀操作,仍然需要面向過程的思路去處理。
什么是面向?qū)ο?/h3>
- 面向?qū)ο缶幊?Object-Oriented Programming, OOP)
- 面向?qū)ο缶幊痰谋举|(zhì)就是:以類的方式組織代碼,以對象的組織(封裝)數(shù)據(jù)。
- 抽象:編程思想!持續(xù)的學(xué)習(xí),茅塞頓開!多實踐,多測試大腦中的想法!實踐出真知~
- 三大特性:
- 封裝
- 繼承
- 多態(tài)
- 從認(rèn)識論角度考慮是先有對象后有類。對象,是具體的事物。類,是抽象的,是對對象的抽象
- 從代碼運行角度考慮是先有類后有對象。類是對象的模板。
面向?qū)ο?2:回顧方法的定義
回顧方法及加深
- 方法的定義
- 修飾符
- 返回類型
- break:跳出switch,結(jié)束循環(huán) 和 return的區(qū)別
- 方法名:注意規(guī)范就OK 見名知意
- 參數(shù)列表:(參數(shù)類型,參數(shù)名)...
- 異常拋出:疑問,后面講解
- 方法的調(diào)用:遞歸
- 靜態(tài)方法
- 非靜態(tài)方法
- 形參和實參
- 值傳遞和引用傳遞
- this關(guān)鍵字
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 結(jié)束方法,返回一個結(jié)果!
public String sayHello(){
return "hello,world";
}
public void print(){
return;
}
public int max(int a,int b){
return a>b ? a : b; //三元運算符!
}
//數(shù)組下標(biāo)越界: Arrayindexoutofbounds
public void readFile(String file) throws IOException{
}
}
面向?qū)ο?3:回顧方法的調(diào)用
package com.oop.demo01;
public class Demo02 {
public static void main(String[] args) {
// //靜態(tài)方法 static
// Student.say();
//非靜態(tài)方法
//實例化這個類 new
//對象類型 對象名 = 對象值;
Student student = new Student();
student.say();
}
//static和類一起加載的
public static void a(){
//b();
}
//類實例化 之后才存在
public void b(){
}
}
學(xué)生說話了
package com.oop.demo01;
//學(xué)生類
public class Student {
// //靜態(tài)方法
// public static void say(){
// System.out.println("學(xué)生說話了");
// }
//非靜態(tài)方法
public void say(){
System.out.println("學(xué)生說話了");
}
}
package com.oop.demo01;
public class Demo03 {
public static void main(String[] args) {
//實際參數(shù)和形式參數(shù)的類型要對應(yīng)!
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;
//引用傳遞:對象
//對象,內(nèi)存!
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
黎明の微笑
面向?qū)ο?4:類與對象的創(chuàng)建
類與對象的關(guān)系
-
類是一種抽象的數(shù)據(jù)類型,它是對某一類事物整體描述/定義,但是并不能代表某一個具體的事物.
- 動物、植物、手機、電腦......
- Person類、Pet類、Car類等,這些類都是用來描述/定義某一類具體的事物應(yīng)該具畝的特點和行為
-
對象是抽象概念的具體實例
-
張三就是人的一個具體實例,張三家里的旺財就是狗的一個具體實例。
-
能夠體現(xiàn)出特點,展現(xiàn)出功能的是具體的實例,而不是一個抽象的概念.
- 步驟清晰簡單,第一步做什么,第二步做什么....
- 面對過程適合處理一些較為簡單的問題
- 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然后對這些分類進(jìn)行單獨思考。最后,才對某個分類下的細(xì)節(jié)進(jìn)行面向過程的思索。
- 面向?qū)ο筮m合處理復(fù)雜的問題,適合處理需要多人協(xié)作的問題!
- 面向?qū)ο缶幊?Object-Oriented Programming, OOP)
- 面向?qū)ο缶幊痰谋举|(zhì)就是:以類的方式組織代碼,以對象的組織(封裝)數(shù)據(jù)。
- 抽象:編程思想!持續(xù)的學(xué)習(xí),茅塞頓開!多實踐,多測試大腦中的想法!實踐出真知~
- 三大特性:
- 封裝
- 繼承
- 多態(tài)
- 從認(rèn)識論角度考慮是先有對象后有類。對象,是具體的事物。類,是抽象的,是對對象的抽象
- 從代碼運行角度考慮是先有類后有對象。類是對象的模板。
面向?qū)ο?2:回顧方法的定義
回顧方法及加深
- 方法的定義
- 修飾符
- 返回類型
- break:跳出switch,結(jié)束循環(huán) 和 return的區(qū)別
- 方法名:注意規(guī)范就OK 見名知意
- 參數(shù)列表:(參數(shù)類型,參數(shù)名)...
- 異常拋出:疑問,后面講解
- 方法的調(diào)用:遞歸
- 靜態(tài)方法
- 非靜態(tài)方法
- 形參和實參
- 值傳遞和引用傳遞
- this關(guān)鍵字
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 結(jié)束方法,返回一個結(jié)果!
public String sayHello(){
return "hello,world";
}
public void print(){
return;
}
public int max(int a,int b){
return a>b ? a : b; //三元運算符!
}
//數(shù)組下標(biāo)越界: Arrayindexoutofbounds
public void readFile(String file) throws IOException{
}
}
面向?qū)ο?3:回顧方法的調(diào)用
package com.oop.demo01;
public class Demo02 {
public static void main(String[] args) {
// //靜態(tài)方法 static
// Student.say();
//非靜態(tài)方法
//實例化這個類 new
//對象類型 對象名 = 對象值;
Student student = new Student();
student.say();
}
//static和類一起加載的
public static void a(){
//b();
}
//類實例化 之后才存在
public void b(){
}
}
學(xué)生說話了
package com.oop.demo01;
//學(xué)生類
public class Student {
// //靜態(tài)方法
// public static void say(){
// System.out.println("學(xué)生說話了");
// }
//非靜態(tài)方法
public void say(){
System.out.println("學(xué)生說話了");
}
}
package com.oop.demo01;
public class Demo03 {
public static void main(String[] args) {
//實際參數(shù)和形式參數(shù)的類型要對應(yīng)!
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;
//引用傳遞:對象
//對象,內(nèi)存!
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
黎明の微笑
面向?qū)ο?4:類與對象的創(chuàng)建
類與對象的關(guān)系
-
類是一種抽象的數(shù)據(jù)類型,它是對某一類事物整體描述/定義,但是并不能代表某一個具體的事物.
- 動物、植物、手機、電腦......
- Person類、Pet類、Car類等,這些類都是用來描述/定義某一類具體的事物應(yīng)該具畝的特點和行為
-
對象是抽象概念的具體實例
-
張三就是人的一個具體實例,張三家里的旺財就是狗的一個具體實例。
-
能夠體現(xiàn)出特點,展現(xiàn)出功能的是具體的實例,而不是一個抽象的概念.
-
我們可以將這些思想轉(zhuǎn)換為代碼實現(xiàn)!
創(chuàng)建與初始化對象
- 使用new關(guān)鍵字創(chuàng)建對象
- 使用new關(guān)鍵字創(chuàng)建的時候,除了分配內(nèi)存空間之外,還會給創(chuàng)建好的對象進(jìn)行默認(rèn)的初始化以及對類中構(gòu)造器的調(diào)用。
- 類中的構(gòu)造器也稱為構(gòu)造方法,是在進(jìn)行創(chuàng)建對象的時候必須要調(diào)用的。并且構(gòu)造器有以下倆個特點:
- 1.必須和類的名字相同
- 2.必須沒有返回類型,也不能寫void
- 構(gòu)造器必須要掌握
package com.oop.demo02;
//學(xué)生類
public class Student {
//屬性:字段
String name; //null
int age; //0
//方法
public void study(){
System.out.println(this.name+"在學(xué)習(xí)");
}
}
//Person ---> 身高,體重,年齡,國家
//學(xué)程序好?對世界進(jìn)行更好的建模! --->宅! --->音樂,旅游,出國!
package com.oop.demo02;
//一個項目應(yīng)該只存一個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
面向?qū)ο?5:構(gòu)造器詳解
package com.oop.demo02;
//java ---> class
public class Person {
//一個類即使什么都不寫,它也會存在一個方法
//顯示的定義構(gòu)造器
String name;
int age;
//alt + insert
//實例化初始值
//1.使用new關(guān)鍵字,本質(zhì)是在調(diào)用構(gòu)造器
//2.用來初始化值
public Person(){
}
//有參構(gòu)選:一旦定義了有參構(gòu)造,無參就必須顯示定義
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
}
*/
/*
構(gòu)造器:
1.和類名相同
2.沒有返回值
作用:
1.new本質(zhì)在調(diào)用構(gòu)造方法
2.初始化對象的值
注意點:
1.定義有參構(gòu)造之后,如果想使用無參構(gòu)造,顯示的定義一個無參的構(gòu)造
ALt + Insert
this. =
*/
面向?qū)ο?6:創(chuàng)建對象內(nèi)存分析
package com.oop.demo03;
public class Pet {
public String name;
public int age;
//無參構(gòu)造
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();
}
*/
面向?qū)ο?7:簡單小結(jié)類與對象
/*
1.類與對象
類是一個模板:抽象,對象是一個具體的實例
2.方法
定義、調(diào)用!
3.對應(yīng)的引用
引用類型: 基本類型(8)
對象是通過引用來操作的:棧 ---> 堆
4.屬性:字段 Field 成員變量
默認(rèn)初始化:
數(shù)字:0 0.0
char:u0000
boolean:false
引用:nuLL
修飾符 屬性類型 屬性名 = 屬性值!
5.對象的創(chuàng)建和使用
- 必須使用 new 關(guān)鍵字創(chuàng)造對象,構(gòu)造器 Person kuangshen = new Person();
- 對象的屬性 kuangshen.name
- 對象的方法 kuangshen.sleep()
6.類
靜態(tài)的屬性 屬性
動態(tài)的行為 方法
`封裝、繼承、多態(tài)`
*/
面向?qū)ο?8:封裝詳解
封裝
- 該露的露,該藏的藏
- 我們程序設(shè)計要追求“高內(nèi)聚,低耦合”。高內(nèi)聚就是類的內(nèi)部數(shù)據(jù)操作細(xì)節(jié)自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用。
- 封裝(數(shù)據(jù)的隱藏)
- 通常,應(yīng)禁止直接訪問一個對象中數(shù)據(jù)的實際表示,而應(yīng)通過操作接口來訪問,這稱為信息隱藏。
- 記住這句話就夠了:屬性私有,get/set
package com.oop.demo04;
//類 private:私有
public class Student {
//屬性私有
private String name; //名字
private int id; //學(xué)號
private char sex; //性別
private int age; //年齡
//提供一些可以操作這個屬性的方法!
//提供一些 public 的 get、set 方法
//get 獲得這個數(shù)據(jù)
public String getName(){
return this.name;
}
//set 給這個數(shù)據(jù)設(shè)置值
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. 提高程序的安全性,保護(hù)數(shù)據(jù)
2. 隱藏代碼的實現(xiàn)細(xì)節(jié)
3. 統(tǒng)一接口
4. 系統(tǒng)可維護(hù)增加了
*/
/*
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());
}
*/
面向?qū)ο?9:什么是繼承
繼承
-
繼承的本質(zhì)是對某一批類的抽象,從而實現(xiàn)對現(xiàn)實世界更好的建模。
-
extends的意思是“擴展”。子類是父類的擴展。
-
JAVA中類只有單繼承,沒有多繼承!一個兒子只能有一個爸爸,但是一個爸爸可以有多個兒子
-
繼承是類和類之間的一種關(guān)系。除此之外,類和類之間的關(guān)系還有依賴、組合、聚合等。
-
繼承關(guān)系的倆個類,一個為子類(派生類)一個為父類(基類)。子類繼承父類,使用關(guān)鍵字extends來表示。
-
子類和父類之間,從意義上講應(yīng)該具有"is a"的關(guān)系。
-
object類
-
super
-
方法重寫:重點--->多態(tài)
package com.oop.demo05;
//在Java中,所有的類,都默認(rèn)直接或者間接繼承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 {
}
面向?qū)ο?0:Super詳解
super注意點:
- super 調(diào)用父類的構(gòu)造方法,必須在構(gòu)造方法的第一個
- super 必須只能出現(xiàn)在子類的方法或者構(gòu)造方法中!
- super 和 this不能同時調(diào)用構(gòu)造方法!
Vs this:
代表的對象不同:
? this:本身調(diào)用者這個對象
? super:代表父類對象的應(yīng)用
前提
? this:沒喲繼承也可以使用
? super:只能在繼承條件才可以使用
構(gòu)造方法
? this();本類的構(gòu)造
? super();父類的構(gòu)造!
package com.oop.demo05;
public class Person /*extends Object*/ {
public Person() {
System.out.println("Person無參執(zhí)行了");
}
// public Person(String name) {
// System.out.println("Person有參執(zhí)行了");
// }
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() {
//隱敲代碼:調(diào)川了父類的無參構(gòu)選
super(); //調(diào)用父類的構(gòu)造器,必須要在子類構(gòu)造器的第一行
//this("hello");
System.out.println("Student無參執(zhí)行了");
// super("name");
// System.out.println("Student有參執(zhí)行了");
}
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
// }
}
面向?qū)ο?1:方法重寫
重寫:需要有繼承關(guān)系,子類重寫父類的方法!
? 1.方法名必須相同
? 2.參數(shù)列表列表必須相同
? 3.修飾符:范圍可以擴大但不能縮小: public>Protected>Default>private
? 4.拋出的異常:范圍,可以被縮小,但不能擴大; ClassNotFoundException ---> Exception(大)
重寫,子類的方法和父類必要一致;方法體不同!
為什么需要重寫:
? 1.父類的功能,子類不一定需要,或者不一定滿足!Alt + Insert ; override;文章來源:http://www.zghlxwxcb.cn/news/detail-652815.html
package com.oop.demo05;
//重寫都是方法的重寫,和屬性無關(guān)
public class B {
// public static void test(){
// System.out.println("B=>test()");
// }
public void test(){
System.out.println("B=>test()");
}
}
/*
//靜態(tài)的方法和非靜態(tài)的方法區(qū)別很大!
//靜態(tài)方法://方法的調(diào)用只和左邊,定義的數(shù)據(jù)類型有關(guān)
//非靜態(tài):重寫
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()");
}
}
面向?qū)ο?2:什么是多態(tài)
多態(tài)
- 即同一方法可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式。
- 一個對象的實際類型是確定的,但可以指向?qū)ο蟮囊玫念愋陀泻芏?父類,有關(guān)系的類)
- 多態(tài)存在的條件
- 有繼承關(guān)系
- 子類重寫父類方法
- 父類引用指向子類對象
- 注意:多態(tài)是方法的多態(tài),屬性沒有多態(tài)性。
- instanceof (類型轉(zhuǎn)換) 引用類型,判斷一個對象是什么類型~
package com.oop.demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
/*
多態(tài)注意事項:
1. 多態(tài)是方法的多態(tài),屬性沒有多態(tài)
2. 父類和子類,有聯(lián)系類型轉(zhuǎn)換異常! ClassCastException!
3. 存在條件:繼承關(guān)系,方法需要重寫,父類引用指向子類對象! Father f1 = new Son();
1. static 靜態(tài)方法,屬于類,它不屬于實例
2. final 常量;
3. private 私有方法;
*/
/*
public static void main(String[] args) {
//一個對象的實際類型是確定的
//new Student();
//new Person();
//可以指向的引川類型就不確定了:父類的引用指向子類
//Student 子類型,能調(diào)用的方法都是自己的或者然承父類的!
Student s1 = new Student();
//Person 父類型,可以指向了類,但是不能調(diào)用子類獨有的方法
Person s2 = new Student();
Object s3 = new Student();
//對象能執(zhí)行哪些方法,主要看對象左邊的類型,和右邊關(guān)系不大!
s2.run(); //子類重寫了父類的方法,執(zhí)行子類的方法
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");
}
}
面向?qū)ο?3:instanceof和類型轉(zhuǎn)換
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) {
//類型之間的轉(zhuǎn)化:父 子
// //高 低
// Person obj = new Student();
//
// //student將這個對象轉(zhuǎn)換為Student類型,我們就可以使川Student類型的方法了!
// Student student = (Student) obj;
// student.go();
// //((Student) obj).go();
//子類轉(zhuǎn)換為父類,可能丟失自己的本來的一些方法!
Student student = new Student();
student.go();
Person person = student;
}
*/
/*
1. 父類引用指向子類的對象
2. 把子類轉(zhuǎn)換為父類,向上轉(zhuǎn)型;
3. 把父類轉(zhuǎn)換為子類,向下轉(zhuǎn)型; 強制轉(zhuǎn)換
4. 方便方法的調(diào)用,減少重復(fù)的代碼!簡介
封裝、繼承、多態(tài)! 抽象類,接口
*/
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 {
}
面向?qū)ο?4:static關(guān)鍵字詳解
package com.oop.demo07;
//static
public class Student {
private static int age; //靜態(tài)的變量 多線程!
private double score; //非靜態(tài)的變量
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:只執(zhí)行一次~
static {
//靜態(tài)代碼塊
System.out.println("靜態(tài)代碼塊");
}
//3
public Person() {
System.out.println("構(gòu)造方法");
}
public static void main(String[] args) {
Person person1 = new Person();
System.out.println("====================");
Person person2 = new Person();
}
}
靜態(tài)代碼塊
匿名代碼塊
構(gòu)造方法
====================
匿名代碼塊
構(gòu)造方法
package com.oop.demo07;
//靜態(tài)導(dǎo)入包~
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);
}
}
面向?qū)ο?5:抽象類
抽象類
- abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那么該方法就是抽象方法;如果修飾類,那么該類就是抽象類。
- 抽象類中可以沒有抽象方法,但是有抽象方法的類一定要聲明為抽象類。
- 抽象類,不能使用new關(guān)鍵字來創(chuàng)建對象,它是用來讓子類繼承的。
- 抽象方法,只有方法的聲明,沒有方法的實現(xiàn),它是用來讓子類實現(xiàn)的。
- 子類繼承抽象類,那么就必須要實現(xiàn)抽象類沒有實現(xiàn)的抽象方法,否則該子類也要聲明為抽象類。
package com.oop.demo08;
//abstract 抽象類:類 extends 單繼承~ (接口可以多繼承)
public abstract class Action {
//約束~有人幫我們實現(xiàn)~
//abstract 抽象方法,只有方法名字,沒有方法的實現(xiàn)!
public abstract void doSomething();
//1. 不能new這個抽象類,只能靠子類去實現(xiàn)它;約束!
//2. 抽象類中可以寫普通的方法~
//3. 抽象方法必須在抽象類中~
//抽象的抽象:約束~
//思考題?
//new,存在構(gòu)造器么? (存在)
//抽象類存在的意義 抽象出來~ 提高開發(fā)效率
}
package com.oop.demo08;
//抽象類的所有方法,繼承了它的子類,都必須要實現(xiàn)它的方法~ 除非子類也是抽象的(abstract)~
public class A extends Action {
@Override
public void doSomething() {
}
}
面向?qū)ο?6:接口的定義與實現(xiàn)
接口
- 普通類:只有具體實現(xiàn)
- 抽象類:具體實現(xiàn)和規(guī)范(抽象方法)都有!
- 接口:只有規(guī)范!自己無法寫方法專業(yè)的約束!約束和實現(xiàn)分離:面向接口編程
- 接口就是規(guī)范,定義的是一組規(guī)則,體現(xiàn)了現(xiàn)實世界中“如果你是...則必須能…”的思想。如果你是天使,則必須能飛。如果你是汽車,則必須能跑。如果你好人,則必須干掉壞人;如果你是壞人,則必須欺負(fù)好人。
- 接口的本質(zhì)是契約,就像我們?nèi)碎g的法律一樣。制定好后大家都遵守。
- OO的精髓,是對對象的抽象,最能體現(xiàn)這一點的就是接口。為什么我們討論設(shè)計模式都只針對具備了抽象能力的語言(比如c++、java、c#等),就是因為設(shè)計模式所研究的,實際上就是如何合理的去抽象。
聲明類的關(guān)鍵字是class,聲明接口的關(guān)鍵字是interface文章來源地址http://www.zghlxwxcb.cn/news/detail-652815.html
作用:
1. 約束
2. 定義一些方法,讓不同的人實現(xiàn)~ 10 ---> 1
3. public abstract
4. public static final
5. 接口不能被實例化~,接口中沒有構(gòu)造方法~
6. implements可以實現(xiàn)多個接口
7. 必須要重寫接口中的方法~
8. 總結(jié)博客~
package com.oop.demo09;
//抽象的思維~ Java 架構(gòu)師~
//interface 定義的關(guān)鍵字 , 接口都需要有實現(xiàn)類
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~
//類 可以實現(xiàn)接口 implements 接口
//父現(xiàn)了接口的類,就需要重寫接口中的方法~
//多繼承~利用接口實現(xiàn)多繼承~
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();
}
面向?qū)ο?7:N種內(nèi)部類
內(nèi)部類
- 內(nèi)部類就是在一個類的內(nèi)部在定義一個類,比如,A類中定義一個B類,那么B類相對A類來說就稱為內(nèi)部類,而A類相對B類來說就是外部類了。
- 1.成員內(nèi)部類
- 2.靜態(tài)內(nèi)部類
- 3.局部內(nèi)部類
- 4.匿名內(nèi)部類
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("這是內(nèi)部類的方法");
}
//獲得外部類的私有屬性~
public void getID(){
System.out.println(id);
}
}
//局部內(nèi)部類
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();
//通過這個外部類來實例化內(nèi)部類~
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零基礎(chǔ)學(xué)習(xí)視頻通俗易懂】https://www.bilibili.com/video/BV12J41137hu?p=60&vd_source=fd5defd6aaa826e3b6e0c06073353e32
到了這里,關(guān)于【狂神說Java】Java零基礎(chǔ)學(xué)習(xí)筆記-面向?qū)ο蟮奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!