# JAVA之旅(九)——Object類,equals,toString,getClass,內部類訪問規則,靜態內部類,內部類原則,匿名內部類
* * *
> 天天被一些瑣事騷擾,學習還得繼續
## 一.Object類
> Object是什么呢?我們可以翻閱JAVA API文檔看他的介紹

> 上面介紹說,object是類層次結構的根類,也就是超類
* Object:是所有對象的直接后者間繼承關系,傳說中的老祖宗,你父親還有父親,你父親的父親還有父親是爺爺,這是繼承關系,但是你的祖宗卻只有一位,該類中定義的肯定是所有對象都具備的功能
~~~
class Demo { // extends Object
}
~~~
### 1.equals
> 我們可以用equals去比較兩個對象是否相同
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
// 比較
Demo1 demo1 = new Demo1();
Demo2 demo2 = new Demo2();
System.out.println(demo1.equals(demo2));
}
}
class Demo1 {
}
class Demo2 {
}
~~~
> 結果肯定返回的是false

> 這里我們要注意的是,他比較的是**內存地址**
>
> 假設我們需要定義一個比較內容
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
// 比較
Demo demo1 = new Demo(5);
Demo demo2 = new Demo(8);
System.out.println(demo1.Comper(demo2));
}
}
class Demo {
private int num;
public Demo(int num) {
this.num = num;
}
public boolean Comper(Demo d) {
return this.num == d.num;
}
}
~~~
> 他返回的也是false,但是我們有必要這樣去做嗎?
* object類中已經提供了對對象是否相同的比較方法,如果自定義類中也有相同的功能,沒有必要重新定義,只要沿襲父類的功能,簡歷自己的特有內容即可,這就是覆蓋,所以我們已經復寫
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
// 比較
Demo demo1 = new Demo(5);
Demo demo2 = new Demo(5);
System.out.println(demo1.equals(demo2));
}
}
class Demo {
private int num;
public Demo(int num) {
this.num = num;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return this.num == ((Demo)obj).num;
}
}
~~~
> 這里運用了多態的向下轉型

### 2.toString
> 轉換成字符串
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
// 比較
Demo demo = new Demo(5);
System.out.println(demo.toString());
}
}
class Demo {
private int num;
public Demo(int num) {
this.num = num;
}
}
~~~
> 轉換的結果十什么呢?

> 這個是什么值呢?
* 類名@哈希值
> 什么是哈希值?我們可以用toHexString來轉換
~~~
System.out.println(demo.toString());
System.out.println(Integer.toHexString(demo.hashCode()));
~~~

### 3.getClass
> 這個就不用多說,返回當前運行的Class,所以
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
// 比較
Demo demo = new Demo(5);
/*
* System.out.println(demo.toString());
* System.out.println(Integer.toHexString(demo.hashCode()));
*/
System.out.println(demo.getClass());
}
}
class Demo {
private int num;
public Demo(int num) {
this.num = num;
}
}
~~~
> 我們這里就直接返回了Demo

> 方法還有很多,比如getName
~~~
System.out.println(demo.getClass().getName());
~~~
> 得到的就是Demo這個名稱了
## 二.內部類
> 這是一個小知識點,我們先看一下概念
* 將一個類定義在另一個類里面,對立面那個類就稱為內部類(內置類,嵌套類)
* 訪問特點
* 內部類可以直接訪問外部類的成員,包括私有成員
* 而外部類要訪問內部類中的成員就必須建立內部類的對象
> 我們來寫一個內部類
~~~
class Outer {
int x = 3;
void show() {
System.out.println("x = " + x);
new Inner().fini();
}
/**
* 內部類
*
* @author LGL
*
*/
class Inner {
void fini() {
System.out.println("內部類"+x);
}
}
}
~~~
> **內部類的訪問規則上面已經體現了**
* 內部類可以直接訪問外部類的成員,包括私有成員
* 而外部類要訪問內部類中的成員就必須建立內部類的對象
> 那我們可以不可以直接訪問內部類中的成員呢?
~~~
Outer.Inner inner = new Outer().new Inner();
inner.fini();
~~~
> 這樣就可以訪問了,不過我們一般都不這樣做,因為大多數的情況我們會將內部類私有
>
> 那你有沒有想過?為什么匿名內部類可以訪問外部的成員?我們可以做一個這樣的小測試,在內部類里面定義一個x分別是成員變量和局部變量
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
Outer.Inner inner = new Outer().new Inner();
inner.fini();
}
}
class Outer {
int x = 3;
void show() {
System.out.println("x = " + x);
new Inner().fini();
}
/**
* 內部類
*
* @author LGL
*
*/
class Inner {
int x = 5;
void fini() {
int x = 6;
System.out.println("內部類" + x);
}
}
}
~~~
> 我們現在輸出的這個x你知道是多少嗎?結果顯而易見,是6

> 那我現在想打印這個5怎么打?用this就行了

> 那我們想打印這個3呢?this是內部類的,那我們需要外面的this,就用Outer.this.x,輸出的就是3了

> 之所以可以直接訪問外部類中的成員是因為內部類中持有了一個外部類的引用,該引用寫法是:外部類名.this
## 三.靜態內部類
> 當內部類在成員位置上,就可以被成員修飾符所修飾,比如:
* private,將內部類在外部類中進行封裝
* static,內部類就具備了static的特性,當內部類被static修飾后,只能直接訪問外部類中的static的成員,出現了訪問局限,但是靜態內部類出現的不是很多,畢竟有訪問局限

> 在外部類中,我們是如何訪問靜態內部類呢?
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
new Outer.Inner().fini();
}
}
class Outer {
private static int x = 3;
/**
* 內部類
*
* @author LGL
*
*/
static class Inner {
void fini() {
System.out.println("內部類" + x);
}
}
}
~~~
> 這樣就可以訪問了
## 四.內部類原則
> 我們來分析下內部類是怎么來的,為什么這樣用
* 當描述事物時,事物的內部還有事物,該事物用內部類描述,因為內部事物在使用外部事物
> 內部類就是能直接訪問外部類中的具體事物,一般都用于程序設計上
## 五.匿名內部類
> 一般內部類不會被公有實現,我們內部類可以定義在任意位置,也可以這樣做
~~~
class Outer {
int x = 3;
void fini() {
class fini {
void show() {
System.out.println("內部類");
}
}
}
}
~~~
> 這段程序,內部類會運行嗎?答案是不會,因為沒有對象,我們就給他new一個對象唄
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
new Outer().fini();
}
}
class Outer {
int x = 3;
void fini() {
class fini {
void show() {
System.out.println("內部類");
}
}
new fini().show();
}
}
~~~
> 這樣就可以訪問了,內部類定義在局部
* 1.不可以被成員修飾符修飾
* 2.可以直接訪問外部類中的成員,因為還持有類中的引用,但是不可以訪問他所在的局部變量,只能訪問被final修飾的局部變量
> 而我們的匿名內部類,是什么概念?我們顧名思義,匿名內部類,是沒有名字的
* 1.匿名內部類其實就是內部類的簡寫格式
* 2.定義匿名內部類的前提,就是內部類必須繼承一個類或者實現接口
> 正常的邏輯代碼
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
new Outer().function();
}
}
class Outer {
int x = 3;
class Inner extends AdsDemo {
@Override
void show() {
System.out.println("method:" + x);
}
}
public void function() {
new Inner().show();
}
}
abstract class AdsDemo {
abstract void show();
}
~~~
> 而我們現在要使用匿名內部類,就簡化了代碼,具體怎么做?
~~~
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態 無返回值 main方法 數組
public static void main(String[] str) {
new Outer().function();
}
}
class Outer {
int x = 3;
// class Inner extends AdsDemo {
// @Override
// void show() {
// System.out.println("method:" + x);
// }
// }
public void function() {
// new Inner().show();
new AdsDemo() {
@Override
void show() {
System.out.println("x:" + x);
}
};
}
}
abstract class AdsDemo {
abstract void show();
}
~~~
> 這個就是匿名內部類
* 匿名內部類的格式:new 父類或者接口(){定義子類的內容}
* 其實匿名內部類就是一個匿名子類對象。而且這個對象有點胖,你也可以把他理解為帶內容的對象
* 匿名內部類中定義的方法最好不超過三個
> OK,本篇幅就到這里,我們的JAVA之旅這個課程不知不覺已經講了這么多了,從當初的不確定,想嘗試一下寫,現在已經積累到第九篇了,所以總結出來,我們想做的事情還是得去嘗試一下,萬一實現了呢?
## 有志同道合的人,歡迎加群:555974449
版權聲明:本文為博主原創文章,博客地址:http://blog.csdn.net/qq_26787115,未經博主允許不得轉載。
- 0-發現
- AndroidInterview-Q-A
- Android能讓你少走彎路的干貨整理
- LearningNotes
- temp
- temp11
- 部分地址
- 0-待辦任務
- 待補充列表
- 0-未分類
- AndroidView事件分發與滑動沖突處理
- Spannable
- 事件分發機制詳解
- 1-Java
- 1-Java-01基礎
- 未歸檔
- 你應該知道的JDK知識
- 集合框架
- 1-Java-04合集
- Java之旅0
- Java之旅
- JAVA之旅01
- JAVA之旅02
- JAVA之旅03
- JAVA之旅04
- JAVA之旅05
- JAVA之旅06
- JAVA之旅07
- JAVA之旅08
- JAVA之旅09
- java之旅1
- JAVA之旅10
- JAVA之旅11
- JAVA之旅12
- JAVA之旅13
- JAVA之旅14
- JAVA之旅15
- JAVA之旅16
- JAVA之旅17
- JAVA之旅18
- JAVA之旅19
- java之旅2
- JAVA之旅20
- JAVA之旅21
- JAVA之旅22
- JAVA之旅23
- JAVA之旅24
- JAVA之旅25
- JAVA之旅26
- JAVA之旅27
- JAVA之旅28
- JAVA之旅29
- java之旅3
- JAVA之旅30
- JAVA之旅31
- JAVA之旅32
- JAVA之旅33
- JAVA之旅34
- JAVA之旅35
- 1-Java-05辨析
- HashMapArrayMap
- Java8新特性
- Java8接口默認方法
- 圖解HashMap(1)
- 圖解HashMap(2)
- 2-Android
- 2-Android-1-基礎
- View繪制流程
- 事件分發
- AndroidView的事件分發機制和滑動沖突解決
- 自定義View基礎
- 1-安卓自定義View基礎-坐標系
- 2-安卓自定義View基礎-角度弧度
- 3-安卓自定義View基礎-顏色
- 自定義View進階
- 1-安卓自定義View進階-分類和流程
- 10-安卓自定義View進階-Matrix詳解
- 11-安卓自定義View進階-MatrixCamera
- 12-安卓自定義View進階-事件分發機制原理
- 13-安卓自定義View進階-事件分發機制詳解
- 14-安卓自定義View進階-MotionEvent詳解
- 15-安卓自定義View進階-特殊形狀控件事件處理方案
- 16-安卓自定義View進階-多點觸控詳解
- 17-安卓自定義View進階-手勢檢測GestureDetector
- 2-安卓自定義View進階-繪制基本圖形
- 3-安卓自定義View進階-畫布操作
- 4-安卓自定義View進階-圖片文字
- 5-安卓自定義View進階-Path基本操作
- 6-安卓自定義View進階-貝塞爾曲線
- 7-安卓自定義View進階-Path完結篇偽
- 8-安卓自定義View進階-Path玩出花樣PathMeasure
- 9-安卓自定義View進階-Matrix原理
- 通用類介紹
- Application
- 2-Android-2-使用
- 2-Android-02控件
- ViewGroup
- ConstraintLayout
- CoordinatorLayout
- 2-Android-03三方使用
- Dagger2
- Dagger2圖文完全教程
- Dagger2最清晰的使用教程
- Dagger2讓你愛不釋手-終結篇
- Dagger2讓你愛不釋手-重點概念講解、融合篇
- dagger2讓你愛不釋手:基礎依賴注入框架篇
- 閱讀筆記
- Glide
- Google推薦的圖片加載庫Glide:最新版使用指南(含新特性)
- rxjava
- 這可能是最好的RxJava2.x入門教程完結版
- 這可能是最好的RxJava2.x入門教程(一)
- 這可能是最好的RxJava2.x入門教程(三)
- 這可能是最好的RxJava2.x入門教程(二)
- 這可能是最好的RxJava2.x入門教程(五)
- 這可能是最好的RxJava2.x入門教程(四)
- 2-Android-3-優化
- 優化概況
- 各種優化
- Android端秒開優化
- apk大小優化
- 內存分析
- 混淆
- 2-Android-4-工具
- adb命令
- 一鍵分析Android的BugReport
- 版本控制
- git
- git章節簡述
- 2-Android-5-源碼
- HandlerThread 源碼分析
- IntentService的使用和源碼分析
- 2-Android-9-辨析
- LRU算法
- 什么是Bitmap
- 常見圖片壓縮方式
- 3-Kotlin
- Kotlin使用筆記1-草稿
- Kotlin使用筆記2
- kotlin特性草稿
- Kotlin草稿-Delegation
- Kotlin草稿-Field
- Kotlin草稿-object
- 4-JavaScript
- 5-Python
- 6-Other
- Git
- Gradle
- Android中ProGuard配置和總結
- gradle使用筆記
- Nexus私服搭建
- 編譯提速最佳實踐
- 7-設計模式與架構
- 組件化
- 組件化探索(OKR)
- 1-參考列表
- 2-1-組件化概述
- 2-2-gradle配置
- 2-3-代碼編寫
- 2-4-常見問題
- 2-9-值得一讀
- 8-數據結構與算法
- 0臨時文件
- 漢諾塔
- 8-數據-1數據結構
- HashMap
- HashMap、Hashtable、HashSet 和 ConcurrentHashMap 的比較
- 遲到一年HashMap解讀
- 8-數據-2算法
- 1個就夠了
- Java常用排序算法(必須掌握的8大排序算法)
- 常用排序算法總結(性能+代碼)
- 必須知道的八大種排序算法(java實現)
- 9-職業
- 閱讀
- 書單
- 面試
- 面試-01-java
- Java面試題全集駱昊(上)
- Java面試題全集駱昊(下)
- Java面試題全集駱昊(中)
- 面試-02-android
- 40道Android面試題
- 面試-03-開源源碼
- Android圖片加載框架最全解析(二),從源碼的角度理解Glide的執行流程
- 面試-07-設計模式
- 面試-08-算法
- 面試-09-其他
- SUMMARY
- 版權說明
- temp111