java面向對象的特征三:多態性 —(15)

1.多態性的理解:可以理解為一個事物的多種形態。

2.何為多態性:

對象的多態性:父類的引用指向子類的對象(或子類的對象賦給父類的引用)
舉例:
Person p = new Man();
Object obj = new Date();

3.多態性的使用:虛擬方法調用

有了對象的多態性以后,我們在編譯期,只能調用父類中聲明的方法,但在運行期,我們實際執行的是子類重寫父類的方法。
總結:編譯,看左邊;運行,看右邊。

4.多態性的使用前提:

① 類的繼承關系 ② 方法的重寫

5.多態性的應用舉例:

舉例一:
public void func(Animal animal){//Animal animal = new Dog();
animal.eat();
animal.shout();
}
舉例二:
public void method(Object obj){

}

舉例三:
class Driver{

public void doData(Connection conn){//conn = new MySQlConnection(); / conn = new OracleConnection();//規范的步驟去操作數據

// conn.method1();
// conn.method2();
// conn.method3();

}

}

6.多態性使用的注意點:

對象的多態性,只適用于方法,不適用于屬性(編譯和運行都看左邊)


7.關于向上轉型與向下轉型:

7.1 向上轉型:多態
7.2 向下轉型:
7.2.1 為什么使用向下轉型:
有了對象的多態性以后,內存中實際上是加載了子類特有的屬性和方法的,但是由于變量聲明為父類類型,導致編譯時,只能調用父類中聲明的屬性和方法。子類特有的屬性和方法不能調用。如何才能調用子類特的屬性和方法?使用向下轉型。
7.2.2 如何實現向下轉型:
使用強制類型轉換符:()
7.2.3 使用時的注意點:
① 使用強轉時,可能出現ClassCastException的異常。
② 為了避免在向下轉型時出現ClassCastException的異常,我們在向下轉型之前,先進行instanceof的判斷,一旦返回true,就進行向下轉型。如果返回false,不進行向下轉型。
7.2.4 instanceof的使用:
① a instanceof A:判斷對象a是否是類A的實例。如果是,返回true;如果不是,返回false。
② 如果 a instanceof A返回true,則 a instanceof B也返回true.其中,類B是類A的父類。
③ 要求a所屬的類與類A必須是子類和父類的關系,否則編譯錯誤。
7.2.5 圖示:
在這里插入圖片描述

8. 面試題:

8.1 談談你對多態性的理解?
① 實現代碼的通用性。
② Object類中定義的public boolean equals(Object obj){ }
JDBC:使用java程序操作(獲取數據庫連接、CRUD)數據庫(MySQL、Oracle、DB2、SQL Server)
③ 抽象類、接口的使用肯定體現了多態性。(抽象類、接口不能實例化)
8.2 多態是編譯時行為還是運行時行為?

1.java.lang.Object類的說明:

  • 1.Object類是所Java類的根父類
  • 2.如果在類的聲明中未使用extends關鍵字指明其父類,則默認父類為java.lang.Object類
  • 3.Object類中的功能(屬性、方法)就具通用性。
  • 屬性:無
  • 方法:equals() / toString() / getClass() /hashCode() / clone() / finalize()
  • wait() 、 notify()、notifyAll()
    
    1. Object類只聲明了一個空參的構造器

2.equals()方法

2.1 equals()的使用:

  1. 是一個方法,而非運算符
    1. 只能適用于引用數據類型
    1. Object類中equals()的定義:
  • public boolean equals(Object obj) {
    return (this == obj);
    }
  • 說明:Object類中定義的equals()和==的作用是相同的:比較兩個對象的地址值是否相同.即兩個引用是否指向同一個對象實體
    1. 像String、Date、File、包裝類等都重寫了Object類中的equals()方法。重寫以后,比較的不是
  • 兩個引用的地址是否相同,而是比較兩個對象的"實體內容"是否相同。
    1. 通常情況下,我們自定義的類如果使用equals()的話,也通常是比較兩個對象的"實體內容"是否相同。那么,我們
  • 就需要對Object類中的equals()進行重寫.
  • 重寫的原則:比較兩個對象的實體內容是否相同.
    2.2 如何重寫equals()
    2.2.1 手動重寫舉例:
    class User{
    String name;
    int age;
    //重寫其equals()方法
    public boolean equals(Object obj){
    if(obj == this){
    return true;
    }
    if(obj instanceof User){
    User u = (User)obj;
    return this.age == u.age && this.name.equals(u.name);
    }
    return false;
    }
    }
    2.2.2 開發中如何實現:自動生成的
    2.3 回顧 == 運算符的使用:
  • == :運算符
    1. 可以使用在基本數據類型變量和引用數據類型變量中
    1. 如果比較的是基本數據類型變量:比較兩個變量保存的數據是否相等。(不一定類型要相同)
  • 如果比較的是引用數據類型變量:比較兩個對象的地址值是否相同.即兩個引用是否指向同一個對象實體
  • 補充: == 符號使用時,必須保證符號左右兩邊的變量類型一致。

3. toString()方法

3.1 toString()的使用:

  1. 當我們輸出一個對象的引用時,實際上就是調用當前對象的toString()
    1. Object類中toString()的定義:
  • public String toString() {
    return getClass().getName() + “@” + Integer.toHexString(hashCode());
    }
    1. 像String、Date、File、包裝類等都重寫了Object類中的toString()方法。
  • 使得在調用對象的toString()時,返回"實體內容"信息
    1. 自定義類也可以重寫toString()方法,當調用此方法時,返回對象的"實體內容"
      3.2 如何重寫toString()
      舉例:
      //自動實現
      @Override
      public String toString() {
      return “Customer [name=” + name + “, age=” + age + “]”;
      }

4.面試題:

① final、finally、finalize的區別?
② == 和 equals() 區別

* Java中的JUnit單元測試

  • 步驟:
  • 1.中當前工程 - 右鍵擇:build path - add libraries - JUnit 4 - 下一步
  • 2.創建Java類,進行單元測試。
  • 此時的Java類要求:① 此類是public的 ②此類提供公共的無參的構造器
  • 3.此類中聲明單元測試方法。
  • 此時的單元測試方法:方法的權限是public,沒返回值,沒形參
  • 4.此單元測試方法上需要聲明注解:@Test,并在單元測試類中導入:import org.junit.Test;
  • 5.聲明好單元測試方法以后,就可以在方法體內測試相關的代碼。
  • 6.寫完代碼以后,左鍵雙擊單元測試方法名,右鍵:run as - JUnit Test
  • 說明:
  • 1.如果執行結果沒任何異常:綠條
  • 2.如果執行結果出現異常:紅條

1.為什么要有包裝類(或封裝類)

為了使基本數據類型的變量具有類的特征,引入包裝類。

2.基本數據類型與對應的包裝類:

在這里插入圖片描述

3.需要掌握的類型間的轉換:(基本數據類型、包裝類、String)

在這里插入圖片描述

簡易版:

基本數據類型<—>包裝類:JDK 5.0 新特性:自動裝箱 與自動拆箱
基本數據類型、包裝類—>String:調用String重載的valueOf(Xxx xxx)
String—>基本數據類型、包裝類:調用包裝類的parseXxx(String s)
注意:轉換時,可能會報NumberFormatException
應用場景舉例:
① Vector類中關于添加元素,只定義了形參為Object類型的方法:
v.addElement(Object obj); //基本數據類型 —>包裝類 —>使用多態

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247708.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue 中$index $key 已移除

之前可以這樣: 123456<ulid"example"><liv-for"item in items">{{$index}}{{$key}}</li></ul>現在已經移除,如果還用的話就會報錯:Uncaught ReferenceError: $index is not defined; 現在這樣寫: 123456<ul id"example&qu…

vue-resource全攻略

Vue.js——vue-resource全攻略 概述 上一篇我們介紹了如何將$.ajax和Vue.js結合在一起使用&#xff0c;并實現了一個簡單的跨域CURD示例。Vue.js是數據驅動的&#xff0c;這使得我們并不需要直接操作DOM&#xff0c;如果我們不需要使用jQuery的DOM選擇器&#xff0c;就沒有必要…

java面向對象:關鍵字 —(16)

static:靜態的 1.可以用來修飾的結構&#xff1a;主要用來修飾類的內部結構 屬性、方法、代碼塊、內部類 2.static修飾屬性&#xff1a;靜態變量&#xff08;或類變量&#xff09; 2.1 屬性&#xff0c;是否使用static修飾&#xff0c;又分為&#xff1a;靜態屬性 vs 非靜態…

《少年先瘋隊》第九次團隊作業:Beta沖刺與團隊項目驗收

博文簡要信息表&#xff1a; 項目內容軟件工程https://www.cnblogs.com/nwnu-daizh/本次實驗鏈接地址https://www.cnblogs.com/nwnu-daizh/p/11056511.html團隊名稱少年先瘋隊作業學習目標&#xff08;1&#xff09;掌握軟件黑盒測試技術&#xff1b;&#xff08;2&#xff09;…

vue-resource jsonp跨域問題解決方法

最近在學習vue.js 碰到個ajax跨域請求的問題&#xff0c;之前知道可以用jsonp解決&#xff0c;但是一直沒實踐過&#xff0c;這次用發現里面好多問題&#xff0c;所以現在記錄下來&#xff0c;希望可以給剛接觸使用jsonp的同學一點幫助&#xff01; 關于什么是jsonp&#xff0c…

虛擬機無法連接至網絡

問題&#xff1a; 虛擬機中的win XP系統無法連接至外部win10系統網絡 嘗試解決方法&#xff1a; 1&#xff09;換用橋接模式和NAT模式&#xff0c;無效 2&#xff09;恢復虛擬機網絡屬性至默認狀態&#xff0c;無效 最終解決方法&#xff1a; 換用外部無線網絡&#xff0c;即能…

java面向對象:關鍵字 —(17)

interface:接口 1.使用說明&#xff1a; 1.接口使用interface來定義 2.Java中&#xff0c;接口和類是并列的兩個結構3.如何定義接口&#xff1a;定義接口中的成員 3.1 JDK7及以前&#xff1a;只能定義全局常量和抽象方法>全局常量&#xff1a;public static final的.但是…

原生js來實現對dom元素class的操作方法

jQuery操作class的方式非常強大 寫了一個利用原生js來實現對dom元素class的操作方法 1.addClass:為指定的dom元素添加樣式 2.removeClass:刪除指定dom元素的樣式 3.toggleClass:如果存在(不存在)&#xff0c;就刪除(添加)一個樣式 4.hasClass:判斷樣式是否存在 下面為一toggleC…

python+selenium配置Edge瀏覽器

Chrome, Firefox只需要修改conftest.py文件中的 pytest.fixture(scopesession)def browser(): return BzwUtil.read_yml(config.yml,WEB_INFO,BROWSER) add option in pytest command line def pytest_addoption(parser): parser.addoption("--browser", actio…

JSON.parse和JSON.stringify方法

JSON.parse() JSON.parse()方法將json字符串轉化為Javascript值或對象。 語法 JSON.parse(text[,reviver]) 參數 text:要被解析成Javascript值的字符串 reviver:若是一個函數則規定了原始值(text)如何被解析改造&#xff0c;在被返回前。 示例 JSON.parse({}); //…

java面向對象:異常處理 —(18)

1. 異常的體系結構 java.lang.Throwable |-----java.lang.Error:一般不編寫針對性的代碼進行處理。|-----java.lang.Exception:可以進行異常的處理|------編譯時異常(checked)|-----IOException|-----FileNotFoundException|-----ClassNotFoundException|------運行時異常(un…

vue請求簡單配置

簡單記錄一下vue的http請求配置相關 測試環境請求接口設置:   1. config/dev.env.js添加&#xff1a;     module.exports merge(prodEnv, {       NODE_ENV: "development",       API_ROOT: "http://", //配置http請求頭     })…

【vue報錯】——listen EADDRINUSE :::8080 解決方案

問題原因&#xff1a; 此項錯誤表示 8080 端口被占用 解決方案一&#xff1a; 打開cmd 輸入&#xff1a;netstat -ano 查看所有端口信息&#xff0c;如圖&#xff0c;找到端口 8081&#xff0c;以及對應的 PID 輸入&#xff1a;tskill PID 即可殺死進程 解決方案二&#xff1a…

記錄_20190626

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result異常的解決方法 原來JAVA中如果用BigDecimal做除法的時候一定要在divide方法中傳遞第二個參數&#xff0c;定義精確到小數點后幾位&#xff0c;否則在不整除的情況下…

String與Array

public class Api {Testpublic void StringApi(){// equals() 判斷內容是否相同區分大小寫// equalsIgnoreCase() 判斷內容是否相同不區分大小寫// length() 獲取長度// charAt(int index) 獲取某個索引位置的字…

HTML與CSS布局技巧總結

很多人對CSS的布局有困惑&#xff0c;實際的應用場景中由于布局種類多難以選擇。今天我花些時間總結下自己對CSS布局的理解&#xff0c;分析下了解各種布局的優劣&#xff0c;同時希望能分享給初入前端的朋友們一些在布局上的經驗&#xff0c;如果有那些地方總結的不好&#xf…

當談論迭代器時,我談些什么?

花下貓語&#xff1a;之前說過&#xff0c;我對于編程語言跟其它學科的融合非常感興趣&#xff0c;但我還說漏了一點&#xff0c;就是我對于 Python 跟其它編程語言的對比學習&#xff0c;也很感興趣。所以&#xff0c;我一直希望能聚集一些有其它語言基礎的同學&#xff0c;一…

在Vue-cli項目中使用echarts

該示例使用 vue-cli 腳手架搭建 安裝echarts依賴 npm install echarts -S11 或者使用國內的淘寶鏡像&#xff1a; 安裝 npm install -g cnpm --registryhttps://registry.npm.taobao.org11 使用 cnpm install echarts -S11 創建圖表 全局引入 main.js // 引入echarts im…

Java的模板文件配置

Java的Mappers文件配置 <?xml version"1.0" encoding"UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.qfedu.…

Python爬蟲學習二

1、selenium自動測試工具 2、主要使用selenium的目的是跳過登錄驗證3、下載驅動器下載請求庫from selenium import webdriver import time#1、 直接在script文件夾中找驅動 driverwebdriver.Chrome() time.sleep(5) driver.close()#2、找到驅動路徑 #webdriver.Chrome(rD:\Pyth…