程式設計基礎·Java學習筆記·面向對象(下)

来源:https://www.cnblogs.com/egalehawk/archive/2022/03/22/16027815.html
-Advertisement-
Play Games

Java程式設計基礎之面向對象(下) (補充了上的一些遺漏的知識,同時加入了自己的筆記的ヾ(•ω•`)o) (至於為什麼分P,啊大概是為了自己查筆記方便(?)應該是(〃` 3′〃)) (但是u1s1,學完了面向對象後反而更懵逼,下一步先刷演算法吧,然後Java的學習也跟上,今年爭取考完二級證書(o-ω ...


Java程序设计基础之面向对象(下)

(补充了上的一些遗漏的知识,同时加入了自己的笔记的ヾ(•ω•`)o)

(至于为什么分P,啊大概是为了自己查笔记方便(?)应该是(〃` 3′〃))

(但是u1s1,学完了面向对象后反而更懵逼,下一步先刷算法吧,然后Java的学习也跟上,今年争取考完二级证书(o-ωq)).oO 困)

目录

一、面向对象

(一)快捷键

(二)继承

(三)封装

(四)多态

(五)Object类

(六)关键字

(七)操作符

(八)抽象类

(九)接口

(十)内部类

 

 

一、面向对象

  (一)快捷键

  1.Eclipse:

   (1)setter and getter  右键 + Source

  2.Idea:

   (1)setter and getter  Alt + Insert

 

 

  (二)继承

  1.概念:继承是面向对象语言的重要机制。借助继承,可以扩展原有的代码,应用到其他程序中,而不必重新编写这些代码。在java语言中,继承是通过扩展原有的类,声明新类来实现的。扩展声明的新类称为子类,原有的类称为超类(父类)。继承机制规定,子类可以拥有超类的所有属性和方法,也可以扩展定义自己特有的属性,增加新方法和重新定义超类的方法。(来自百度百科)

  2.在Java中,继承是一种主要思想。通过父子类的继承、抽象类的继承、接口的继承……可以通过继承来完成调用。

  3.继承的方法:

   (1)父子类:在面向对象(上)中,已经描述了继承的方法,通过关键字extends完成父子类的继承;

   (2)接口:接口是特殊的抽象类,我们能够通过抽象类来调用方法,通过此方法调用后,只需要重写接口的内容就可以调用;

  

 

  (三)封装

  1.Java的封装,就是把一些非公开的块进行封装,不让使用者/调用者进行查看,常见的形式是通过修饰词的使用,如private来进行封装;

  2.包装类(Wrapper)

   (1)针对八种基本定义相应的引用类型——包装类(封装类)

 

基本数据类型 包装类
boolean Boolean
byte Byte
short Short
int Integer
long Long
char Character
float Float
double Double

   (2)装箱与拆箱

      a.基本数据类型包装成包装类:装箱

//通过包装类的构造器实现
int i = 500;
Integer t = new Integer(i);
//通过字符串参数构造包装类对象
Float f = new Float("4.56");
Long l = new Long("abcd");

      b.获得包装类对象中包装的基本类型变量:拆箱

//调用包装类的 .xxxValue();方法
Integer i = new Integer(112);
int i0 = i.intValue();

boolean b = new Boolean(false).booleanValue();

      c.自动装箱

//等同于上文中的Integer i = new Integer(112);
Integer il = 112;

      d.自动拆箱

//自动拆箱Integer il = 112;
int i2 = i1;

//等同于boolean b = new Boolean(false).booleanValue();
boolean b = new Boolean(false);

      e.将字符串转换成基本数据类型

//通过包装类的构造器实现
int i = new Integer("123");
//通过包装类的parseXxx(String s)静态方法
int i = Integer.parseInt("123");
float f = Float.parseFloat("0.123");
boolean b = Boolean.parseBoolean("false");

     f.将基本数据类型转换成字符串

//以上文中的i f b做示例
String istr = String.valueOf(i);
String fstr = String.valueOf(f);
String bstr = String.valueOf(ture);

 

 

  (四)多态

  1.多态性,是面向对象中最重要的概念,在Java中有两种体现:

   (1)方法的重载与重写(Overload and Override);

   (2)对象的多态性:可以直接应用在抽象类和接口上;

  2.方法的重写:在子类中可以根据需要对从父类中继承来的方法进行改造,也称方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。

    注意事项 :

    △ 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型;

    重写方法不能使用比被重写方法更严格的访问权限;

    重写和被重写的方法须同时为static的,或同时为非static的子类方法抛出的异常不能大于父类被重写方法的异常

  3.子类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象:即,向上转型(upcasting);

  4.一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法

Student m = new Student();
m.school = “pku”;  //合法,Student类有school成员变量
Person e = new Student();
e.school = “pku”;  //非法,Person类没有school成员变量。  属性是在编译时确定的,编译时e为Person类型,没有school成员变量,因而编译错误。

   5.虚拟方法调用(Virtual Method Invocation)

//正常的方法调用
Person p = new Person();
p.getInfo();
Student s = new Student();
s.getInfo();

//虚拟方法调用(多态情况下)
Person e = new Student();
e.getInfo();
//调用Student类的getInfo()方法

  # 编译时类型和运行时类型编译时e为Person类型,而方法的调用是在运行时确定的,所以调用的是Student类的getInfo()方法。——动态绑定

  # 当调用成员变量时,因为成员变量不具备多态性,所以引用时,我们只考虑引用变量所属类中是否有我们的属性;

  # 而当调用成员方法时,我们在编译时,要查看引用变量所属的类中是否有所调用的方法,所有需要我们的父子类中都存在方法体,但是当我们运行时,只考虑调用的实际对象所属的类中的重写方法;

  6.多态小结

  (1)成员方法:

    编译时:要查看引用变量所属的类中是否有所调用的方法。

    运行时:调用实际对象所属的类中的重写方法。

  (2)成员变量:不具备多态性,只看引用变量所属的类。

 

 

  (五)Object类

  1.Object类是所有Java类的根父类;

  2.Object类的主要方法:

   (1)public Object()                # 构造方法

   (2)public boolean equals(Object obj)       # 对象比较

   (3)public int hashCode()             # 取得Hash码

   (4)public String toString()            # 取得地址

  3.对象类型转换(Casting)

   (1)基本类型数据转换:小的数据类型可以自动转换成大的数据类型;

      强制类型转换:大的数据类型转换到小的数据类型则需要进行强转,表示方法为:long a = (long) b;  float x = (float) y;

   (2)Java对象的强制类型转化(造型)

      在下图的代码中,Person类中是没有方法体getschool的,所以此时我们需要调用方法时,需要将Person e强转为Student,此时就可以调用方法getschool;

public class Test{
public void method(Person e) {
    //设Person类中没有getschool()方法
    // System.out.pritnln(e.getschool());
    //非法,编译时错误
if(e instanceof Student){
Student me = (Student)e;
    //将e强制转换为Student类型
System.out.pritnln(me.getschool());
  }
}
public static void main(Stirng args[]){
Test t = new Test();
Student m = new Student();
t.method(m);
  }
}

 

 

  (六)关键字

  1.this 关键字

   (1)使用this关键字:在一个实例方法或一个构造器中,关键字this是对当前对象的引用。所谓当前对象,指的是其方法或构造器正在被调用的对象,也就是正在调用的方法或构造器所在的对象。可以通过this在一个实例方法或构造器中引用当前对象的任何成员。

   (2)最经常使用this关键字的情况,是在对象的一个字段被方法或构造器的参数屏蔽时,需要调用这个被屏蔽的字段的这种情况。

   (3)对构造器使用this:在一个构造器中,还可以使用this关键字来调用同一个类中的另外的构造器,这种做法称为“显式构造器调用”。

//this在方法内部使用,即这个方法所属对象的印象
//this在构造器内部使用,表示该构造器正在初始化的对象
//  @this表示当前对象,可以调用类的属性、方法和构造器

public class Person {

    //构造体中this的调用
    public Person(){}                        //

    public Person(int age){                  //
        this.age = age;
    }
    public Person(String name){              //
        this();                    //此句则表示进行了①的调用
        this.name = name;
    }

    public Person(int age,String name){
        this(1);                   //进行了②的调用
//Attention!!this进行构造体的调用时,要写在方法的第一句 //this表示的是构造器中初始化的age,而后面的age表示的是形参的age this.age = age; this.name = name; } int age; String name; public void setName(String name){ //this表示的是方法中这个方法所属对象的印象,而后面的name表示的是形参的name this.name = name; } public void setName01(String name) { //this表示调用的是setName方法,而后面的name表示的是形参的name this.setName(name); } public void showInfo(){ System.out.println("姓名:" + this.name); System.out.println("年龄:" + this.age); } }

  2.super 关键字

   (1)在Java类中使用super来调用父类中的指定操作:

   (2)super可用于访问父类中定义的属性

   (3)super可用于调用父类中定义的成员方法

   (4)super可用于在子类构造方法中调用父类的构造器


    注意事项:

    △ 尤其当子父类出现同名成员时,可以用super进行区分

    △ super的追溯不仅限于直接父类

    △ super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识

  3.this与super的区别

序号 区别 this super
1 访问属性 访问本类中的属性,如果本类没有此属性则从父类中继续查找 访问父类中的属性
2 调用方法 访问本类中的方法 直接访问父类中的方法
3 调用构造器 调用本类构造器,必须放在构造器首行 调用父类构造器,必须放在子类构造器的首航
4 特殊 表示当前对象 (/ω\*)……… (/ω•\*)没有啦

   4.static关键字

    (1)在Java中,static可以用来修饰属性、方法、代码块、内部类;

    (2)类变量(class Variable):被static所修饰的变量就是类变量,他是静态的,如果不想变量被改变,那么就可以使用静态变量;

         类变量(类属性)由该类的所有实例共享;类变量不需要通过实例化就可以进行使用;

    (3)类方法(class Method):被static所修饰的方法就是类方法;

      没有对象的实例时,可以用 类名.方法名() 的形式访问由static标记的类方法;同时,在类方法中只能访问类的static属性;

      因为不需要实例化就能访问,所以类方法中不能有 thissuper 关键字;

    (4)代码块中,优先执行静态代码块,其次是代码块,然后才是其他方法;

  5.final关键字

    (1)在Java中,final关键字用来表示“最终”的意思;

    (2)final标记的类不能被继承;

    (3)final标记的方法不能被子类重写;

    (4)我们称final修饰的变量为常量,只能被赋值一次,名称大写;

 

 

  (七)操作符

  1.instanceof操作符

    x instanceof A:检验x是否为类A的对象,返回值为boolean型。要求x所属的类与类A必须是子类和父类的关系,否则编译错误。如果x属于类A的子类B,x instanceof A值也为true。

public class Person extends Object {…}
public class Student extends Person {…}
public class Graduate extends Person {…}

public void method1(Person e) {
if (e instanceof Person)       //处理Person类及其子类对象
if (e instanceof Student)      //处理Student类及其子类对象
if (e instanceof Graduate)     //处理Graduate类及其子类对象
}

     # 要求x所属的类与类A必须是子类和父类的关系,否则编译错误;

     # 如果x属于类A的子类B,x instanceof A值也为true;

   2. 【==】操作符 && equals操作符

   (1)【==】操作符基本类型比较:只要两个变量的值相等,即为ture;

      引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,才返回ture;

      用【==】进行比较时,符号两边的数据类型必须兼容(可自动转换的基本类型除外),否则编译出错;

   (2)equals():所有类都继承了Object,也就获得了equals()方法,还可以重写;

      只能比较引用类型,其对象与【==】相同,比较是否指向同一个对象;

      特例:使用equals对File、String、Data及包装类来说,是比较类型及内容而不考虑引用的是否是同一个对象;

       原因:在这些类中重写了Object类的equals方法。  

 

 

   (八)抽象类

  1.用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法;

  2.抽象方法:只有方法的声明,没有方法的实现;以分号结束:abstract int abstractMethod(int a);

  3.含有抽象方法的类必须被声明为抽象类

  4.抽象类不能被实例化。抽象类是用来作为父类被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类;

  5.不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法;

 

  (九)接口(interfac)

  1.接口是特殊的抽象类;

  2.在我们进行父子类的调用时,因为Java不支持多重继承,所以我们可以通过接口进行多重的继承,只需要重写方法体即可;

  3.实现接口:class 类名 implements 接口名{  }

  4.一个类可以实现多个接口,通过“ ,”进行多个接口的串联;接口也可以继承其他接口;

  5.接口的特点:用interface来定义;

   接口中的所有成员变量都默认是由public static final修饰的;

   接口中的所有方法都默认是由public abstract修饰的;

   接口没有构造器;

   接口采用多层继承机制。

  6.实现接口的类中必须提供接口中所有方法的具体实现内容,方可实例化;否则,仍为抽象类;

   接口的主要用途就是被实现类实现(面向接口编程);

   与继承关系类似,接口与实现类之间存在多态性;

   定义Java类的语法格式:先写extends,后写implements;

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 描述: 本篇文章為了記錄日常生活中或者項目中經常使用到的JS方法,會長期記錄... 數組中的方法 1.map和forEach方法 map 參數為回調函數,得到一個新數組 forEach 修改原數組,不會產生新數組 2.pop和push方法(棧結構) push 向數組末尾添加一個元素或者多個元素,會改 ...
  • 前言 在 《一篇帶你用 VuePress + Github Pages 搭建博客》中,我們使用 VuePress 搭建了一個博客,最終的效果查看:TypeScript 中文文檔。 本篇講講 SEO 中的一些細節優化。 1. 設置全局的 title、description、keywords // co ...
  • word-break: normal; // 此值為瀏覽器的預設屬性:以單詞為單位; keep-all 這個值由於相容性差,很少用;word-wrap: normal; // 此值為瀏覽器的預設屬性:以單詞為單位; 純中文:自動換行,一個漢字看做一個單詞; 純英文或純數字:看做一個單詞,不換行; 遇 ...
  • 經過前面兩天的學習,已經對Node.js有了一個初步的認識,今天繼續學習其他內容,並加以整理分享,如有不足之處,還請指正。 ...
  • 外觀模式是什麼 外觀模式是一種結構性設計模式,它能為程式庫、框架或者其他複雜的子系統提供一個統一的高層界面,使子系統更容易使用。外觀模式就是聚合多個介面實現,對外只暴露單個介面。隱藏子系統的複雜性。調用方不關心實現步驟。 為什麼要用外觀模式 當子系統提供的功能很多,而我們子需要多個子系統中很少的幾個 ...
  • 1. Consul 簡介 Consul是 HashiCorp 公司推出的開源工具,用於實現分散式系統的服務發現與配置。與其它分散式服 務註冊與發現的方案,Consul 的方案更“一站式”,內置了服務註冊與發現框 架、分佈一致性協議實 現、健康檢查、Key/Value 存儲、多數據中心方案,不再需要依 ...
  • 1.依賴配置 1.1 pom文件 <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <flink.version>1.13.0< ...
  • Hibernate 是一個開放源代碼的對象關係映射框架,它對 JDBC 進行了非常輕量級的對象封裝,它將 POJO 與資料庫表建立映射關係,是一個全自動的 orm 框架 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...