Java的第十天(父子類轉換、多態、包、API、Scanner掃描器)

47.父子類之間的轉換java

(1)子類轉換成父類編程

子類能夠自動轉型成父類學習

若是子類對父類的方法有覆寫,而且子類的實例賦值給父類的引用,經過這個引用來調用這個覆寫的方法的時候,調用的是子類。spa

父類指向子類的實例的引用不能調用子類的特有的方法和屬性。3d

若是父子類有同名的屬性,那麼父類指向子類的實例的引用調用這個屬性的時候調用的仍是父類的,不要和方法混淆。code

class Dog{
    String name;
    int age=1;
    public void sleep(){
        System.out.println(name+"在午休");
    }
    public void speek(){
        System.out.println(name+"汪汪汪");
    }
}
class Erha extends Dog{
    //建立一個父類中一樣的屬性初始化不同的值
    int age=5;
    //建立一個子類中特有的屬性
    boolean isMarry;
    //建立一個子類中特有的方法
    public void eat(){
        System.out.println(name+"在吃狗糧");
    }
    //重寫父類中的方法
    public void speek(){
        System.out.println(name+"衝着你汪汪汪");
    }
}
public class Test{
    public static void main(String[] args){
        //建立一個父類指向子類的實例,子類能夠自動轉換成父類
        Dog d=new Erha();
        //能夠訪問父類中的屬性
        d.name="大可愛";
        //當父子屬性相同時,子類轉換成父類的引用調用的也是父類中的屬性
        System.out.println(d.name+d.age+"歲");//大可愛1歲
        //d.isMarry=false;//沒法訪問子類中特有的屬性
        //能夠訪問父類中的方法
        d.sleep();//大可愛在午休
        //當子類中的方法重寫父類中的方法時,子類轉換成父類的引用調用的是子類中的方法
        d.speek();//大可愛衝着你汪汪汪
        //d.eat();    //沒法訪問子類中特有的方法,注意區分重寫方法
    }
}對象

(2)父類轉換成子類blog

特色:繼承

  1. 父類轉換成子類不能自動完成。
  2. 父類轉換成子類的前提是父類的真身是這個子類,轉回子類後,就能夠訪問子類內部的方法和屬性。
  3. 若是這個父類的真身是子類B,不能強制轉換成子類A,只能轉換成B。
  4. 抽象類做爲父類一樣符合上述理論
  5. 接口中也是徹底符合上述理論,可是注意接口中沒有屬性。

class Dog1{
    String name;
    int age=1;
    public void sleep(){
        System.out.println(name+"在午休");
    }
    public void speek(){
        System.out.println(name+"汪汪汪");
    }
}
class Erha1 extends Dog1{
    //建立一個父類中一樣的屬性初始化不同的值
    int age=5;
    //建立一個子類中特有的屬性
    boolean isMarry;
    //建立一個子類中特有的方法
    public void eat(){
        System.out.println(name+"在吃狗糧");
    }
    //重寫父類中的方法
    public void speek(){
        System.out.println(name+"衝着你汪汪汪");
    }
}
class Taidi extends Dog1{
    
}
public class Test1{
    public static void main(String[] args){
        //建立一個父類指向子類的實例,子類能夠自動轉換成父類
        Dog1 d=new Erha1();
        //Taidi t=(Erha1)d;// 不兼容的類型: Erha1沒法轉換爲Taidi,轉化成父類的子類不能轉成其餘子類
        //有且僅有轉化成父類的子類才能夠再轉換成子類
        Erha1 e=(Erha1)d;接口

        //能夠訪問父子類中的屬性,屬性相同時,優先調用的是子類中的屬性
        e.name="大可愛";
        e.isMarry=false;
        System.out.println(e.name+e.age+"歲");//大可愛5歲
        
        //能夠訪問父子類中的方法,當子類中的方法重寫父類中的方法時,調用的是子類中的方法
        e.sleep();//大可愛在午休
        e.speek();//大可愛衝着你汪汪汪
        e.eat();    //訪問子類中特有的方法
        
    }
}

48.多態

多態就是行爲具備表現多種功能的能力。(方法相同,表現形式或者對象不一樣)

(1)繼承多態   經過繼承的方式來體現的多態。

繼承多態,不單單是父類是抽象類,父類是普通類也是能夠的。

多態的條件:子類對父類有方法重寫;父類的引用指向子類的實例,調用覆寫的這個方法的時候,調用是子類的方法。  

//定義一個父類,抽象父類或者普通父類均可以
abstract class Dog2{
    String name;
    int age;
    public abstract void eat();
    public abstract void speek();
}
//定義一個子類繼承父類
class Erha2 extends Dog2{
    public void eat(){
        System.out.println(name+"在吃狗糧");
    }
    public void speek(){
        System.out.println(name+"衝着你汪汪汪");
    }
}
//定義一個另外一個子類繼承父類
class Taidi1 extends Dog2{
    public void eat(){
        System.out.println(name+"在吃土");
    }
    public void speek(){
        System.out.println(name+"衝着你爸爸汪汪汪");
    }
}
//建立一個主人類
class Master{
    //在主人類中建立一個方法寫針對Dog2類爲參數寫故事
    public void lead(Dog2 d){

//注意:d instanceof Erha2判斷父類的實際的真身是哪一個子類的實例
        if(d instanceof Erha2){
            System.out.println("二哈開始虐主子了");
        }
        if(d instanceof Taidi1){
            System.out.println("泰迪開始虐主子了");
        }
        d.eat();
        d.speek();
        System.out.println("主人扔掉了"+d.name);
    }
}
public class Test2{
    public static void main(String[] args){
        //建立一個Erha2實例並命名
        Erha2 e=new Erha2();
        e.name="二哈";
        //建立一個Taidi1實例並命名
        Taidi1 t=new Taidi1();
        t.name="泰迪";
        //建立一個主人實例
        Master m=new Master();
        //調用方法,子類自動轉換成父類而且實現方法的不一樣表現形式
        m.lead(e);
        m.lead(t);
    }
}

//注意:d instanceof Erha2判斷父類的實際的真身是哪一個子類的實例

(2)接口多態

//定義一個父類
interface Dog3{
    public void eat();
    public void speek();
}
//定義一個子類實現接口
class Erha3 implements  Dog3{
    String name;
    public void eat(){
        System.out.println(name+"在吃狗糧");
    }
    public void speek(){
        System.out.println(name+"衝着你汪汪汪");
    }
}
//定義一個另外一個子類實現接口
class Taidi2 implements Dog3{
    String name;
    public void eat(){
        System.out.println(name+"在吃土");
    }
    public void speek(){
        System.out.println(name+"衝着你爸爸汪汪汪");
    }
}
//建立一個主人類
class Master{
    //在主人類中建立一個方法寫針對Dog3類爲參數寫故事
    public void lead(Dog3 d){
        //注意:接口中沒有屬性的定義,針對接口的方法中不能出現沒有定義的屬性
        if(d instanceof Erha3){
            System.out.println("二哈開始虐主子了");
        }
        if(d instanceof Taidi2){
            System.out.println("泰迪開始虐主子了");
        }
        d.eat();
        d.speek();
    }
}
public class Test3{
    public static void main(String[] args){
        //建立一個Erha2實例並命名
        Erha3 e=new Erha3();
        e.name="二哈";
        //建立一個Taidi1實例並命名
        Taidi2 t=new Taidi2();
        t.name="泰迪";
        //建立一個主人實例
        Master m=new Master();
        //調用方法,子類自動轉換成父類而且實現方法的不一樣表現形式
        m.lead(e);
        m.lead(t);
    }
}

49.包

包:就是文件夾

做用:對類作分類管理,能夠區分同名不一樣包的類。

語法: package 包名(不一樣級別用「.」來分隔);,如 package com.rl;, 位置放置文件的有效代碼第一行(註釋不算), 包的名字必定是英文的小寫。

如何編譯:

Javac –d . 源文件(好比:D:\source_code\2019-05-08>javac -d . Bag.java    編譯過程當中自動建立名爲com的文件夾,com中又建立名爲tx文件夾,裏面是編譯以後的Bag.class文件)

運行要帶着包:

Java 包名.源文件名(好比:D:\source_code\2019-05-08>java com.tx.Bag)

//package 包名(不一樣級別用「.」來分隔);
package com.tx;
public class Bag{
    public static void printArr(int[] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"\t");
        }
    }
    public static void main(String[] args){
        printArr(new int[]{1,2,3,4,5,6});
    }    
}

(1)若是兩個類在相同的包內,能夠不用引入類就能直接用

(2)若是兩個類在不一樣的包內,必需要引入類才能使用。前提被引入的類是public的

引入類的語法 在包的下行類的定義的上行

import 包名.類名;

50.API的使用

咱們學習java編程面對2中類

  1. 咱們本身寫的類。
  2. 用其餘人寫好的類來使用。

API是把jdk裏面提供好的類梳理成了一個文檔,方便咱們來查閱。

類的屬性摘要

類的構造器摘要

類的方法摘要

從父類繼承下來的方法

學習Math類

java中java.lang下面的全部類都不須要引入,能夠直接來使用。

public class Demo{
    public static void main(String[] args){
        System.out.println(Math.E);//天然對數:Math.E  天然對數:Math.E
        System.out.println(Math.PI);//圓周率:Math.PI  3.141592653589793
        System.out.println(Math.abs(-1.5));//絕對值:Math.abs()   1.5
        System.out.println(Math.ceil(12.1));//向上取整 Math.ceil()  13.0
        System.out.println(Math.floor(12.9));//向下取整 Math.floor() 12.0
        System.out.println(Math.max(12.9, 27));//比較兩個數取最大值
        System.out.println(Math.min(12.9, 27));//比較兩個數取最小值
        System.out.println(Math.pow(3, 3));//計算某個數的n次冪 Math.pow()
        System.out.println(Math.round(4.5));//四捨五入  Math.round()
        System.out.println(Math.sqrt(16));//開平方  Math.sqrt(16)
        
    }
}

51.Scanner掃描器

運行程序的時候能夠從控制檯來輸入數據。

Scanner的使用必需要引入這個類

scanner不屬於Java.lang下必須引入包

經常使用構造方法

經常使用方法

import java.util.Scanner;
public class Demo1{
    public static void main(String[] args){
        //建立一個建立一個Scanner,調用構造器Scanner(InputStream source)
        Scanner s=new Scanner(System.in);
        //從控制檯掃描一個int的數值
        int score=s.nextInt();
        if(score>95){
            System.out.println("you are Amazing!");
        }else if(score>80){
            System.out.println("you are great!");
        }else if(score>60||score==60){
            System.out.println("you are good!");
        }else if(score<60){
            System.out.println("you lose!");
        }
        //從控制檯掃描一個String的數值
        String password=s.nextLine();
        System.out.println("you write down"+password);
    }
}

相關文章
相關標籤/搜索