每天被1些雜事騷擾,學習還得繼續
Object是甚么呢?我們可以翻閱JAVA API文檔看他的介紹
上面介紹說,object是類層次結構的根類,也就是超類
class Demo { // extends Object
}
我們可以用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
這里我們要注意的是,他比較的是內存地址
假定我們需要定義1個比較內容
//公共的 類 類名
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,但是我們有必要這樣去做嗎?
//公共的 類 類名
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;
}
}
這里應用了多態的向下轉型
轉換成字符串
//公共的 類 類名
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;
}
}
轉換的結果10甚么呢?
這個是甚么值呢?
甚么是哈希值?我們可以用toHexString來轉換
System.out.println(demo.toString());
System.out.println(Integer.toHexString(demo.hashCode()));
這個就不用多說,返回當前運行的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這個名稱了
這是1個小知識點,我們先看1下概念
將1個類定義在另外一個類里面,對峙面那個類就稱為內部類(內置類,嵌套類)
訪問特點
我們來寫1個內部類
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();
這樣就能夠訪問了,不過我們1般都不這樣做,由于大多數的情況我們會將內部類私有
那你有無想過?為何匿名內部類可以訪問外部的成員?我們可以做1個這樣的小測試,在內部類里面定義1個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了
之所以可以直接訪問外部類中的成員是由于內部類中持有了1個外部類的援用,該援用寫法是:外部類名.this
當內部類在成員位置上,就能夠被成員修飾符所修飾,比如:
在外部類中,我們是如何訪問靜態內部類呢?
//公共的 類 類名
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);
}
}
}
這樣就能夠訪問了
我們來分析下內部類是怎樣來的,為何這樣用
內部類就是能直接訪問外部類中的具體事物,1般都用于程序設計上
1般內部類不會被公有實現,我們內部類可以定義在任意位置,也能夠這樣做
class Outer {
int x = 3;
void fini() {
class fini {
void show() {
System.out.println("內部類");
}
}
}
}
這段程序,內部類會運行嗎?答案是不會,由于沒有對象,我們就給他new1個對象唄
//公共的 類 類名
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();
}
}
這樣就能夠訪問了,內部類定義在局部
而我們的匿名內部類,是甚么概念?我們顧名思義,匿名內部類,是沒著名字的
正常的邏輯代碼
//公共的 類 類名
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();
}
這個就是匿名內部類
OK,本篇幅就到這里,我們的JAVA之旅這個課程不知不覺已講了這么多了,從當初的不肯定,想嘗試1下寫,現在已積累到第9篇了,所以總結出來,我們想做的事情還是得去嘗試1下,萬1實現了呢?