继承extends、super、this、方法重写overiding、final、代码块_DAY08
1:Math類的隨機數(shù)(掌握)
??? 類名調(diào)用靜態(tài)方法。
? ? ?包:java.lang
??? 類:Math
??? 方法:public static double random():
? ? ? ? ? ?Java.lang包下的類是不用導包就可以直接使用的。
? 產(chǎn)生1-100之間的隨機數(shù):
??? int number = (int)(Math.random()*100)+1;
2:如何使用API。(掌握)
??? A:找到文檔,打開文檔。
??? B:點擊左上角的顯示變成隱藏,然后點擊索引
??? C:你應該知道你要找誰?Math
?????? 所以,你就在那個輸入框里面輸入Math,然后回車,再回車。
??? D:看這個類的結構
?????? ? ? ?java.lang
?????????? 類 Math
? ? ? ?? ? ? java.util
??????? ??? 類 Scanner
?????? 如果是java.lang包下的類,是可以直接使用的。(Math),否則,就需要導包才能使用。(Scanner)
??? ?E:看看對這個類的說明。
??? F:看構造方法
?????? 名稱:字段 --? 成員變量?? -- 屬性。
?????? a:有構造方法,那么,就通過構造方法創(chuàng)建對象使用。
?????? b:沒有構造方法,那么,這個類的成員一般都是靜態(tài)。
?????????? 通過類名調(diào)用。
??? G:按照正常的操作使用方法。
?????? 左邊:
?????????? 是否靜態(tài):如果靜態(tài)修飾,那么可以通過類名調(diào)用。否則,就必須創(chuàng)建對象調(diào)用。
?????????? ?是否有明確返回值:如果是void類型,就直接調(diào)用即可。否則,就可以輸出或者賦值。
?????? 右邊:
?????????? 看方法名:不要寫錯了。
?????????? 看參數(shù):看參數(shù)類型及個數(shù)。
3:繼承(掌握)extends
??? (1)把多個類中的相同的屬性和行為進行抽取,封裝到一個類中,然后再建立新類的時候,不需要從頭做起,繼承剛才定義的那個類即可。
??? (2)好處:
?????? A:提高代碼的復用性。
?????? B:讓類與類之間產(chǎn)生了一個關系,是多態(tài)的前提。
??? (3)什么時候使用繼承?
?????? A:如果類之間存在著:is a 的關系,就可以考慮使用繼承。
?????? B:不要為了繼承部分功能,而去使用繼承。詳細見例子:
/*繼承一定要符合is a 的關系。*/class Demo5{public static void main(String[] args){System.out.println("Hello World!");}}class Animal{String name = "巴馬";int age = 80;public void eat(){System.out.println("吃");}public void sleep(){System.out.println("睡");}private void method(){}}class Cat extends Animal {public void climb(){System.out.println("爬樹");}public void catchM(){System.out.println("抓耗子");}public void eatM(){System.out.println("生吃耗子");}}class Person extends Cat{} //不要為了人有“爬樹”和“抓耗子”的工能,而去繼承Cat類,語法上沒有錯誤,但是在邏輯上有問題。因為Cat類還有“生吃耗子”工能,而人沒有。 View Code? ? ? ? ? (4)繼承的特點:
?????? A:Java只支持單繼承,不支持多繼承。
?????????? 為什么?如果支持多繼承,就會有調(diào)用不明確的問題。
?????? B:Java支持多層(重)繼承。
?????? 例子:
/*繼承的特點:支持單繼承,不支持多繼承。支持多層繼承。Object是多有類的直接或間接父類。*/class Demo4{public static void main(String[] args){Person p = new Person();System.out.println(p.name);System.out.println(p.age);p.eat();p.sleep();}}class Animal{String name = "巴馬";int age = 80;public void eat(){System.out.println("吃");}public void sleep(){System.out.println("睡");}private void method(){}}class Pig extends Animal{}//class Person extends Monkey,Animal{} //一個類不能多繼承class Monkey extends Animal{}class Person extends Monkey{} //支持多層繼承 View Code??? (5)super和this的區(qū)別?
?????? A:super是一個關鍵字,代表父類的存儲空間標識。(可以理解為父親對象的引用,單實際不是父親對象的引用)
???? ?? B:它和this的用法相似
????????? ? a:成員變量
???????????? ? this.變量? --? 本類的
???????????? ? super.變量 --? 父類的
?????????? b:構造方法
????????????? this(...)? --? 本類的
????????????? super(...) --? 父類的
????????? ? c:成員方法
???????????? ? this.方法名() --? 本類的
????????????? super.方法名() --? 父類的
? ? ? ? ? ? ? ? ? ? ? ? ?例子:
/*super:代表父類的內(nèi)存空間使用方式:1、super區(qū)分父類成員變量與子類成員變量2、super放在構造方法中第一行,用來調(diào)用父類的構造方法*/class Demo6{public static void main(String[] args){//Person p = new Person();//p.showMe(); Person p2 = new Person("巴豆",3);p2.showMe();}}class Animal{String name = "巴馬";int age = 80;//定義空參構造/*public Animal(){System.out.println("我是父類的空參構造方法");}*///定義兩個參數(shù)構造public Animal(String name,int age) {System.out.println("我是父類的有參構造方法");this.name = name;this.age = age;}public void eat(){System.out.println("吃");}public void sleep(){System.out.println("睡");}private void method(){}}class Person extends Animal {String name = "巴驢";int age = 60;public Person(){//super(); //默認都有super()構造方法super("aaa",100);System.out.println("我是子類的空參構造方法");}public Person(String name,int age) {//this(); //this不可以與super同時調(diào)用構造方法super(name,age);System.out.println("我是子類的有參構造方法");this.name = name;this.age = age;}public void showMe(){String name = "巴騾";int age = 70;//局部變量直接寫變量名即可 System.out.println("姓名:"+name+" 年齡:"+age);//本類的成員變量加this區(qū)分 System.out.println("姓名:"+this.name+" 年齡:"+this.age);//父類的成員變量加super區(qū)分 System.out.println("姓名:"+super.name+" 年齡:"+super.age);//如果同時存在,則就近原則 }} View Code? ? ? ? ? ?(6)繼承關系內(nèi)存圖:
?? (7)子父類實例化過程
??????? ? 子類中所有的構造函數(shù)默認都會訪問父類中空參數(shù)的構造函數(shù),原因是構造方法中第一行默認的super(),子類具備父類中的數(shù)據(jù),所以需要先明確父類是如何初始化的,即調(diào)用父類的構造方法。父類存儲空間優(yōu)于子類對象。
大致順序:
?? (8)標準的繼承關系代碼
?
/*標準的繼承關系代碼*/class Demo9{public static void main(String[] args){Cat cat = new Cat("Tom",5,"黃黑條");cat.method();cat.method2();cat.setName("kitty");cat.setColor("pink");cat.showMe();}}class Animal{private String name;private int age;public Animal() {}public Animal(String name,int age) {this.name = name;this.age = age;}public void method(){System.out.println("我是父類的第一個方法");}public void method2(){System.out.println("我是父類的第二個方法");}//-----------------------------------------------------------------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;}}class Cat extends Animal{private String color;public Cat() {}public Cat(String name,int age,String color) {super(name,age);this.color = color;}public void method(){System.out.println("我是子類的重寫的第一個方法");}public void showMe(){System.out.println("name:"+super.getName()+" age:"+getAge()+" color:"+color);}public void setColor(String color) {this.color = color;}public String getColor() {return color;}} View Code??? (9)子父類中成員變量的用法:
??? ??? A:名稱不同,這個太簡單了。
????? ? B:名稱相同,子類對象的在使用的時候:
?????????? 先找子類局部范圍
?????????? 再找子類成員范圍
?????????? 最后找父類成員范圍
????????? ? 父類的父類成員范圍
??? (10)子父類中成員方法的用法:
?? ??? ? A:名稱不同,這個太簡單了。
???? ?? B:名稱相同,子類對象的在使用的時候:
????????? ? 先找子類的
?????????? 再找父類的
? ? ? ? C:方法重寫(overiding)
?????????? 要求:
?????????? ?????? ? a.子類方法訪問權限需要大于等于父類方法訪問權限
????????????????? b.返回值類型:
???????????????????? 基本類型/void:必須相同
???????????????????? 引用類型:子類返回值類型必須為父類返回值類型的子類
????????????????? c.函數(shù)名相同
???????????????? ? d.參數(shù)列表:相同為重寫,不同時為重載
?????????? 應用:子類需要父類功能,但又在功能上又有多增加時,可以復寫父類方法。子類比父類更強大。
?????????? 注意事項:
????????????????? a.父類中私有方法不可以被覆蓋。
????????????????? b.在子類中想調(diào)用父類自己的方法可以使用super關鍵字
???????????????? ? c.靜態(tài)只能覆蓋靜態(tài)。(這個不能算,因為靜態(tài)跟類相關)
例子:
class OveridingMethod {public static void main(String[] args) {Zi2 zi2 = new Zi2();zi2.method2();}}class Fu {public void method() {}}class Zi extends Fu {public void method() {}}class Fu2 {Fu fu = new Fu();public Zi method2() { 報錯,子類返回值類型必須為父類返回值類型的子類,此處不是。 System.out.println("我是子類2的方法");return zi;}}class Zi2 extends Fu2 {Zi zi = new Zi();public Fu method2() { //報錯,子類返回值類型必須為父類返回值類型的子類,此處不是。 System.out.println("我是子類2的方法");return fu;}} View Code? (11)子父類中構造方法的用法:
?????? A:子類的初始化過程中,首先回去執(zhí)行父類的初始化動作。
?????? ? ? 因為子類的構造方法中默認有一個super()。
????????? ?為什么?子類要使用父類的成員變量,這個初始化,必須在子類初始化之前完成。
????????? ?所以,子類的初始化過程中,會先執(zhí)行父類的初始化。
?????? ?B:如果父類沒有無參構造方法
?????????? A:使用super調(diào)用父類的帶參構造。推薦方式。
?????????? B:使用this調(diào)用本身的其他構造。
4:代碼塊(面試題)
? ? ? ? ? (1)代碼塊:寫代碼的區(qū)域,使用{}作為范圍限定
??? ??? 局部代碼塊:
?????????? 位置:方法內(nèi)
?????????? 作用:控制變量作用域
?????? 構造代碼塊:
?????????? 位置:成員位置,類中,方法外
?????????? 作用:將構造器中相同代碼抽取,在構造器前執(zhí)行
?????? 靜態(tài)構造代碼塊:
?????????? 位置:成員位置,類中,方法外
?????????? 作用:只在第一次創(chuàng)建對象時初始化一次
/*代碼塊:寫代碼的區(qū)域,使用{}作為范圍限定局部代碼塊:位置:方法內(nèi)作用:控制變量作用域構造代碼塊:位置:成員位置,類中,方法外作用:將構造器中相同代碼抽取,在構造器前執(zhí)行靜態(tài)構造代碼塊:位置:成員位置,類中,方法外作用:只在第一次創(chuàng)建對象時初始化一次默認初始化>顯示初始化>構造代碼塊>構造方法 */ class Demo2 {public static void main(String[] args) {int i = 10;{int i2 = 20;}System.out.println(i);//System.out.println(i2); 超出作用域 Person p = new Person();Person p2 = new Person("巴馬",80);p2.showMe();} }class Person {//定義Person類的屬性private String name = "巴騾";private int age = 60;//定義一個構造代碼塊 {System.out.println("我是一個構造代碼塊");name = "巴驢";age = 70;System.out.println("我是要初始化的步驟1");System.out.println("我是要初始化的步驟2");System.out.println("我是要初始化的步驟3");System.out.println("我是要初始化的步驟4");}static{System.out.println("我是一個靜態(tài)構造代碼塊");}//定義Person類的構造方法public Person(){System.out.println("我是空參構造方法");}public Person(String name,int age){System.out.println("我是有參構造方法");//this.name = name;//this.age = age; }public void showMe(){System.out.println("name:"+name+" age:"+age);}//定義Person類的普通方法public void eat(){System.out.println("吃了");}public void sleep(){System.out.println("睡了");}//定義Person類的getters和setterspublic 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;} } View Code?
??? (2)執(zhí)行順序:
?????? 靜態(tài)代碼塊 --> 構造代碼塊 --> 構造方法
????? ? 默認初始化>顯式初始化>構造代碼塊初始化>構造方法初始化
??? (3)注意事項:
????? ? 靜態(tài)代碼塊只執(zhí)行一次
?5:final(掌握)(簡單總結為:修飾的東西不能變!)
??? (1)是一個關鍵字,可以用于修飾類,成員變量,成員方法。
??? (2)特點:
?????? 它修飾的類不能被繼承。
?????? 它修飾的成員方法是不能被子類重寫的。
?????? 它修飾的成員變量是一個常量。常量必須有值,且常量的值只能賦值一次。如果是成員變量,只需要在對象創(chuàng)建之前賦值即可。
?????? 引用類型常量可以更改其堆內(nèi)存對象中的值。
例:
???? a.final修飾的類不能被繼承。
class Demo10 {public static void main(String[] args) {}}final class Fu{ // 修飾類,類不可以被繼承。 }class Zi extends Fu{} View Code?? b.它修飾的成員方法是不能被子類重寫的.
class Demo10 {public static void main(String[] args) {}}class Fu{final public void showMe(){} //修飾方法,方法不可以被重寫。 }class Zi extends Fu{public void showMe(){}} View Code?? c.常量必須有值
class Demo10 {public static void main(String[] args) {final int a;System.out.println(a); //常量必須有值。此處會報錯 }} View Code?? d.常量的值只能賦值一次
class Demo10 {public static void main(String[] args) {final int a=10;a=20; //常量的值只能賦值一次,此處報錯 System.out.println(a);}} View Code???? e.如果是成員變量,只需要在對象創(chuàng)建之前賦值即可
class Demo10 {public static void main(String[] args) {Fu fu = new Fu("唐嫣"); //創(chuàng)建對象時賦值 }}class Fu {//成員變量final private String name;final private int age = 20; //創(chuàng)建成員變量時賦值//構造器public Fu(String name) {this.name = name;}} View Code? f.引用類型常量可以更改其堆內(nèi)存對象中的值,引用類型變量被final修飾,不能再指向其他對象地址
? ??
?
6:同一個文檔里不能有兩個以上Public修飾的類
? ? ? ? ?public class name{}
? ? ? ? ?public class age{}??? //同一個文檔里有兩個以上Public修飾的類會報錯。
? ? ? ??
附:
? 題一:面向?qū)ο蠡A知識全涵蓋例(標準學生類的定義及使用)
/*標準學生類的定義及使用*/class Test{public static void main(String[] args){/*創(chuàng)建對象使用對象調(diào)用方法使用對象調(diào)用方法訪問屬性*/Student s = new Student();s.setName("近平");s.setAge(24);s.address = "上海,廣州也可以!";s.study("java");System.out.println(s.eat());System.out.println(s.hitBeanBean(3));Student.jiayou("i have a dream,a code dream and a money dream!");Student s2 = new Student("克強",26);s2.study("SQL");System.out.println(s2.eat());System.out.println(s2.hitBeanBean(6));Student.jiayou("i have a dream,a code dream and a money dream!");}}/*給類命名成員變量的定義構造方法的定義普通方法的定義getters/setters*///給類命名class Student{//成員變量的定義private String name;private int age;public static String address = "北京,夢開始的地方!";//構造方法的定義public Student(){}//一個參數(shù)的構造也可以定義public Student(String name,int age) {this.name = name;this.age = age;}//普通方法的定義public void study(String neirong) {System.out.println("我學的是"+neirong);}public String eat(){return "我已經(jīng)吃了!";}public String hitBeanBean(int cishu) {return "我今天打了"+cishu+"次豆豆。我很舒服。";}public static void jiayou(String xuanyan) {System.out.println(xuanyan);}//getters/setterspublic 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;}} View Code?
轉載于:https://www.cnblogs.com/hezhiyao/p/7475914.html
總結
以上是生活随笔為你收集整理的继承extends、super、this、方法重写overiding、final、代码块_DAY08的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AndroidTv Home界面实现原理
- 下一篇: maven升级遇到的疑惑