每天被1些雜事騷擾,學(xué)習(xí)還得繼續(xù)
Object是甚么呢?我們可以翻閱JAVA API文檔看他的介紹
上面介紹說,object是類層次結(jié)構(gòu)的根類,也就是超類
class Demo { // extends Object
}
我們可以用equals去比較兩個(gè)對(duì)象是不是相同
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態(tài) 無返回值 main方法 數(shù)組
public static void main(String[] str) {
// 比較
Demo1 demo1 = new Demo1();
Demo2 demo2 = new Demo2();
System.out.println(demo1.equals(demo2));
}
}
class Demo1 {
}
class Demo2 {
}
結(jié)果肯定返回的是false
這里我們要注意的是,他比較的是內(nèi)存地址
假定我們需要定義1個(gè)比較內(nèi)容
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態(tài) 無返回值 main方法 數(shù)組
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 {
// 公共的 靜態(tài) 無返回值 main方法 數(shù)組
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;
}
}
這里應(yīng)用了多態(tài)的向下轉(zhuǎn)型
轉(zhuǎn)換成字符串
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態(tài) 無返回值 main方法 數(shù)組
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;
}
}
轉(zhuǎn)換的結(jié)果10甚么呢?
這個(gè)是甚么值呢?
甚么是哈希值?我們可以用toHexString來轉(zhuǎn)換
System.out.println(demo.toString());
System.out.println(Integer.toHexString(demo.hashCode()));
這個(gè)就不用多說,返回當(dāng)前運(yùn)行的Class,所以
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態(tài) 無返回值 main方法 數(shù)組
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這個(gè)名稱了
這是1個(gè)小知識(shí)點(diǎn),我們先看1下概念
將1個(gè)類定義在另外一個(gè)類里面,對(duì)峙面那個(gè)類就稱為內(nèi)部類(內(nèi)置類,嵌套類)
訪問特點(diǎn)
我們來寫1個(gè)內(nèi)部類
class Outer {
int x = 3;
void show() {
System.out.println("x = " + x);
new Inner().fini();
}
/**
* 內(nèi)部類
*
* @author LGL
*
*/
class Inner {
void fini() {
System.out.println("內(nèi)部類"+x);
}
}
}
內(nèi)部類的訪問規(guī)則上面已體現(xiàn)了
那我們可以不可以直接訪問內(nèi)部類中的成員呢?
Outer.Inner inner = new Outer().new Inner();
inner.fini();
這樣就能夠訪問了,不過我們1般都不這樣做,由于大多數(shù)的情況我們會(huì)將內(nèi)部類私有
那你有無想過?為何匿名內(nèi)部類可以訪問外部的成員?我們可以做1個(gè)這樣的小測試,在內(nèi)部類里面定義1個(gè)x分別是成員變量和局部變量
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態(tài) 無返回值 main方法 數(shù)組
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();
}
/**
* 內(nèi)部類
*
* @author LGL
*
*/
class Inner {
int x = 5;
void fini() {
int x = 6;
System.out.println("內(nèi)部類" + x);
}
}
}
我們現(xiàn)在輸出的這個(gè)x你知道是多少嗎?結(jié)果不言而喻,是6
那我現(xiàn)在想打印這個(gè)5怎樣打?用this就好了
那我們想打印這個(gè)3呢?this是內(nèi)部類的,那我們需要外面的this,就用Outer.this.x,輸出的就是3了
之所以可以直接訪問外部類中的成員是由于內(nèi)部類中持有了1個(gè)外部類的援用,該援用寫法是:外部類名.this
當(dāng)內(nèi)部類在成員位置上,就能夠被成員修飾符所修飾,比如:
在外部類中,我們是如何訪問靜態(tài)內(nèi)部類呢?
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態(tài) 無返回值 main方法 數(shù)組
public static void main(String[] str) {
new Outer.Inner().fini();
}
}
class Outer {
private static int x = 3;
/**
* 內(nèi)部類
*
* @author LGL
*
*/
static class Inner {
void fini() {
System.out.println("內(nèi)部類" + x);
}
}
}
這樣就能夠訪問了
我們來分析下內(nèi)部類是怎樣來的,為何這樣用
內(nèi)部類就是能直接訪問外部類中的具體事物,1般都用于程序設(shè)計(jì)上
1般內(nèi)部類不會(huì)被公有實(shí)現(xiàn),我們內(nèi)部類可以定義在任意位置,也能夠這樣做
class Outer {
int x = 3;
void fini() {
class fini {
void show() {
System.out.println("內(nèi)部類");
}
}
}
}
這段程序,內(nèi)部類會(huì)運(yùn)行嗎?答案是不會(huì),由于沒有對(duì)象,我們就給他new1個(gè)對(duì)象唄
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態(tài) 無返回值 main方法 數(shù)組
public static void main(String[] str) {
new Outer().fini();
}
}
class Outer {
int x = 3;
void fini() {
class fini {
void show() {
System.out.println("內(nèi)部類");
}
}
new fini().show();
}
}
這樣就能夠訪問了,內(nèi)部類定義在局部
而我們的匿名內(nèi)部類,是甚么概念?我們顧名思義,匿名內(nèi)部類,是沒著名字的
正常的邏輯代碼
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態(tài) 無返回值 main方法 數(shù)組
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();
}
而我們現(xiàn)在要使用匿名內(nèi)部類,就簡化了代碼,具體怎樣做?
//公共的 類 類名
public class HelloJJAVA {
// 公共的 靜態(tài) 無返回值 main方法 數(shù)組
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();
}
這個(gè)就是匿名內(nèi)部類
OK,本篇幅就到這里,我們的JAVA之旅這個(gè)課程不知不覺已講了這么多了,從當(dāng)初的不肯定,想嘗試1下寫,現(xiàn)在已積累到第9篇了,所以總結(jié)出來,我們想做的事情還是得去嘗試1下,萬1實(shí)現(xiàn)了呢?