1喊巍、Java對(duì)于大數(shù)值屠缭,可以使用BigInteger操作大整數(shù),使用BigDecimal指定小數(shù)的保留位數(shù)玄糟,而不損失精度勿她。新建對(duì)象代碼如下:
BigInteger bi1 = new BigInteger("12345678") ;
BigDecimal bi2 = new BigDecimal(3.333) ;
2、如果在返回void的方法中沒有return語(yǔ)句,那么在該方法的結(jié)尾處會(huì)有一個(gè)隱式的return阵翎。
3逢并、執(zhí)行break outer后直接跳出三層for循環(huán)然后結(jié)束循環(huán),continue outer后繼續(xù)執(zhí)行剩下的循環(huán)郭卫。
public static void main(String[] args){
outer:
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
for (int k = 0; k < 5; k++) {
if (j ==3){
break outer;
continue outer;
}
System.out.println(j);
}
}
}
}
4砍聊、關(guān)于this關(guān)鍵字
(1).構(gòu)造器Flower(String s,int petals)表明:在構(gòu)造器里面盡管可以用this調(diào)用一個(gè)構(gòu)造器,但卻不能調(diào)用兩個(gè).此外,必須將構(gòu)造器調(diào)用置于最起始處,否則編譯器會(huì)報(bào)錯(cuò)。
(2).this的另一種用法:由于構(gòu)造器參數(shù)s的名稱和數(shù)據(jù)成員s的名字相同,所以會(huì)產(chǎn)生歧義贰军。使用this.s來(lái)代表數(shù)據(jù)成員就能解決重名導(dǎo)致錯(cuò)誤這個(gè)問(wèn)題玻蝌。
(3).除了在構(gòu)造器中用this調(diào)用構(gòu)造器之外,編譯器禁止在其他任何方法中調(diào)用構(gòu)造器蟹肘。
5、根據(jù)繼承的概念俯树,子類會(huì)繼承父類所有的成員帘腹,包括私有成員和公有成員,只不過(guò)父類的私有成員在子類中不可見许饿,但它是確確實(shí)實(shí)存在的阳欲。
6、靜態(tài)數(shù)據(jù)的初始化順序
先上代碼:
public class TestSequence {
public static void main(String[] args){
System.out.println("進(jìn)入main方法");
Bclass d = new Bclass("TestSequence -- main -- Bclass d");
}
static Bclass b = new Bclass("TestSequence -- static Bclass b ");
static Cclass c = new Cclass("TestSequence -- static Cclass c");
}
class Bclass {
Cclass c1 = new Cclass("Bclass -- Cclass c1");
static Cclass c2 = new Cclass("Bclass -- static Cclass c2");
public Bclass(String desc) {
System.out.println(desc);
}
}
class Cclass {
public Cclass(String desc) {
System.out.println(desc);
}
}
打印結(jié)果:
Bclass -- static Cclass c2
Bclass -- Cclass c1
TestSequence -- static Bclass b
TestSequence -- static Cclass c
進(jìn)入main方法
Bclass -- Cclass c1
TestSequence -- main -- Bclass d
結(jié)果說(shuō)明:
(1)打印結(jié)果"TestSequence -- static Bclass b" --> "TestSequence -- static Cclass c" --> "進(jìn)入main方法"陋率,說(shuō)明類里面的靜態(tài)屬性會(huì)在靜態(tài)main方法執(zhí)行之前執(zhí)行球化。
(2)打印結(jié)果"Bclass -- static Cclass c2" --> "Bclass -- Cclass c1" --> "TestSequence -- static Bclass b",說(shuō)明一個(gè)對(duì)象被創(chuàng)建之前會(huì)先初始化靜態(tài)屬性瓦糟,接下來(lái)是非靜態(tài)成員屬性筒愚,最后才是構(gòu)造方法。
(3)打印結(jié)果"進(jìn)入main方法" --> "Bclass -- Cclass c1" --> "TestSequence -- main -- Bclass d"菩浙,說(shuō)明靜態(tài)的屬性或者變量在內(nèi)存中只有一份巢掺,只會(huì)被創(chuàng)建一次,不會(huì)被多次創(chuàng)建芍耘。
7址遇、善用引用傳遞操作對(duì)象
public class TestReference {
public static void main(String[] args){
VoClass voClass = new VoClass();
System.out.println(voClass);
change(voClass);
System.out.println(voClass);
}
private static void change(VoClass voClass){
voClass.number = 100;
voClass.string = "love you";
}
}
class VoClass{
int number = 8;
String string = "love";
@Override
public String toString() {
return "VoClass{" + "number=" + number + ", string='" + string + '\'' + '}';
}
}
8熄阻、可變參數(shù)的使用
public static void main(String[] args){
printMethod("one","two","three");
printMethod();
}
private static void printMethod(String... strings){
for (String string : strings) {
System.out.println(string);
}
}
打印結(jié)果:
one
two
three
9斋竞、Java文件名必須要和用public修飾的類名相同,沒有用public修飾類時(shí)文件名可以隨意秃殉。
10坝初、Java的引用類型
Java對(duì)引用的概念進(jìn)行了擴(kuò)充,將引用分為強(qiáng)引用(Strong Reference)、軟引用(Soft Reference)钾军、弱引用(Weak Reference)鳄袍、虛引用(Phantom Reference) 4種,這4種引用強(qiáng)度依次逐漸減弱。
(1)口強(qiáng)引用就是指在程序代碼之中普遍存在的,類似"Object obj= new Object()"這類的引用,只要強(qiáng)引用還存在,垃圾收集器永遠(yuǎn)不會(huì)回收掉被引用的對(duì)象吏恭。
(2)軟引用是用來(lái)描述一些還有用但并非必需的對(duì)象拗小。對(duì)于軟引用關(guān)聯(lián)著的對(duì)象,在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前,將會(huì)把這些對(duì)象列進(jìn)回收范圍之中進(jìn)行第二次回收。如果這次回收還沒有足夠的內(nèi)存,才會(huì)拋出內(nèi)存溢出異常樱哼。在JDK 1.2之后,提供了SoftReference類來(lái)實(shí)現(xiàn)軟引用哀九。
(3)弱引用也是用來(lái)描述非必需對(duì)象的,但是它的強(qiáng)度比軟引用更弱一些,被弱引用關(guān)聯(lián)的對(duì)象只能生存到下一次垃圾收集發(fā)生之前。當(dāng)垃圾收集器工作時(shí),無(wú)論當(dāng),
前內(nèi)存是否足夠,都會(huì)回收掉只被弱引用關(guān)聯(lián)的對(duì)象搅幅。在JDK 1.2之后,提供了WeakReference類來(lái)實(shí)現(xiàn)弱引用阅束。
(4)虛引用也稱為幽靈引用或者幻影引用,它是最弱的一種引用關(guān)系。一個(gè)對(duì)象是否有虛引用的存在,完全不會(huì)對(duì)其生存時(shí)間構(gòu)成影響,也無(wú)法通過(guò)虛引用來(lái)取得一個(gè)對(duì)象實(shí)例茄唐。為一個(gè)對(duì)象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是能在這個(gè)對(duì)象被收集器回收時(shí)收到一個(gè)系統(tǒng)通知息裸。在JDK 1.2之后,提供了PhantomReference類來(lái)實(shí)現(xiàn)虛引用。
11、final用來(lái)修飾引用呼盆,雖然引用是恒定不變的年扩,但該引用所指向的對(duì)象自身是可以被改變的。
12访圃、使用final修飾的變量在編譯之前不一定知道他的值常遂,但在使用之前必須初始化。如下:
private final int i = rand.nextInt(20);
static final int j = rand.nextInt(20);
總結(jié):這個(gè)特點(diǎn)的好處是既可以根據(jù)不同的對(duì)象而賦不同的值挽荠,又可以保證其值恒定不變克胳。
13、關(guān)于繼承覆蓋和main方法
class A {
int a = 100;
public A() {
System.out.println("begin construct A");
print();
System.out.println("In class A construct method, this = " + this);
}
public void print(){
System.out.println("In class A , a = " + a);
}
}
class B extends A{
int b = 200;
public B() {
System.out.println("begin construct B");
print();
System.out.println("In class B construct method, this = " + this);
}
@Override
public void print(){
System.out.println("In class B , b = " + b);
}
}
class C extends B{
int c = 300;
public C() {
System.out.println("begin construct C");
print();
System.out.println("In class C construct method, this = " + this);
}
@Override
public void print(){
System.out.println("In class C , c = " + c);
}
}
public class MainClass {
public MainClass() {
System.out.println("begin construct MainClass");
}
public static void main(String[] args) {
C c = new C();
System.out.println("In main method , c = " + c);
}
}
控制臺(tái)輸出如下:
begin construct A
In class C , c = 0
In class A construct method, this = C@1540e19d
begin construct B
In class C , c = 0
In class B construct method, this = C@1540e19d
begin construct C
In class C , c = 300
In class C construct method, this = C@1540e19d
In main method , c = C@1540e19d
說(shuō)明:
(1)我們都知道圈匆,main方法是一個(gè)靜態(tài)方法漠另,隨著JVM加載class文件時(shí)加載,先于對(duì)象而存在跃赚,也就是說(shuō)不需要new MainClass就可以調(diào)用MainClass里面的mian方法笆搓,所以在控制臺(tái)中我們看不到"begin construct MainClass"這句話。
(2)在子類繼承父類的情形中纬傲,new一個(gè)子類時(shí)我們都知道默認(rèn)會(huì)先調(diào)用父類的構(gòu)造方法满败,上面代碼可知,B繼承A叹括,C繼承B算墨,而在new C的過(guò)程中,會(huì)先調(diào)用B的構(gòu)造方法汁雷,并且將C對(duì)象的引用this隱式的作為參數(shù)傳到B的構(gòu)造方法中净嘀,而B因?yàn)槔^承了A,所以在創(chuàng)建B對(duì)象時(shí)會(huì)繼續(xù)先調(diào)用A的構(gòu)造方法侠讯,同時(shí)將C對(duì)象的引用隱式的作為參數(shù)往上傳遞到A的構(gòu)造方法中(注意是C對(duì)象的引用挖藏,而不是B對(duì)象的引用,這個(gè)通過(guò)打印的內(nèi)容可得知)厢漩,而B和C在繼承時(shí)均覆蓋了print()方法膜眠,所以在A和B的構(gòu)造方法中調(diào)用的print()方法,實(shí)際上都是C對(duì)象的print()方法溜嗜,因?yàn)镃對(duì)象的print()方法最終覆蓋了他的所有父類的print()方法宵膨。
(3)我們可以看到,前兩次變量c的值均為0而并不是300粱胜,這是因?yàn)閏變量是在C對(duì)象中聲明并且賦值的柄驻,而在調(diào)用到A和B的構(gòu)造方法時(shí)C對(duì)象還沒生成,c變量還沒成功賦值為300焙压,同時(shí)從這里我們可以看出來(lái)鸿脓,JVM會(huì)提前于對(duì)象為這些變量賦初值抑钟,例如0和null等這些值,以避免因非常規(guī)調(diào)用而引起的問(wèn)題野哭。
14在塔、抽象類不能被new,他的抽象方法可以被分?jǐn)偟蕉鄠€(gè)抽象類去實(shí)現(xiàn)拨黔,或者被一個(gè)非抽象類全部實(shí)現(xiàn)蛔溃,又或者組合實(shí)現(xiàn)。也就是說(shuō)篱蝇,頂級(jí)抽象類的抽象方法可以被其多個(gè)子抽象類去實(shí)現(xiàn)贺待,假設(shè)其眾多的子抽象類中沒有產(chǎn)生新的抽象方法,如果該頂級(jí)抽象類的所有方法已經(jīng)被其多個(gè)子抽象類分?jǐn)倢?shí)現(xiàn)完了零截,那么最后一個(gè)繼承的非抽象類不需要強(qiáng)制實(shí)現(xiàn)任何頂級(jí)抽象類的方法麸塞,可以選擇性的覆蓋或者不覆蓋前面抽象類的非抽象方法。抽象類的好處還有涧衙,只有參數(shù)不同的共有的實(shí)現(xiàn)方法的實(shí)現(xiàn)可以放在抽象類中哪工,根據(jù)對(duì)象的實(shí)際情況不同而表現(xiàn)不同的方法可以聲明為抽象方法,讓實(shí)現(xiàn)對(duì)象自己去實(shí)現(xiàn)弧哎。
15雁比、普通對(duì)象和接口及抽象類之間轉(zhuǎn)型
public class TestInterface {
public static void main(String[] args){
// nClass是一個(gè)InterfaceA的實(shí)現(xiàn)類型,直接調(diào)用one方法沒問(wèn)題
InterfaceA nClass = new NClass();
nClass.one();
// nClass2是一個(gè)InterfaceA的實(shí)現(xiàn)類型撤嫩,調(diào)用屬于InterfaceB里面的two方法時(shí)需要轉(zhuǎn)型偎捎,兩種轉(zhuǎn)型都可以
InterfaceA nClass2 = new NClass();
((InterfaceB) nClass2).two();
((NClass) nClass2).two();
// nClass3是一個(gè)AbstractC的實(shí)現(xiàn)類型,情況同上
AbstractC nClass3 = new NClass();
((NClass) nClass3).one();
}
}
interface InterfaceA {
void one();
}
interface InterfaceB {
void two();
}
abstract class AbstractC {
abstract void three();
}
class NClass extends AbstractC implements InterfaceA,InterfaceB {
@Override
public void one() {
System.out.println("one");
}
@Override
public void two() {
System.out.println("two");
}
@Override
void three() {
System.out.println("three");
}
}
打印結(jié)果如下:
one
two
two
one
總結(jié):繼承了一個(gè)抽象類和多個(gè)接口的普通類非洲,可以向上轉(zhuǎn)型為任意一個(gè)接口類型和那個(gè)抽象類類型鸭限。
16蜕径、內(nèi)部類
public class Outer {
private int o = 10;
public int po = 100;
class Inner {
private int i = 20;
public int pi = 200;
public void printOuterPrivateO(){
Outer outer = new Outer();
System.out.println("in non static Inner , outer private o = " + outer.o);
}
private void printOuterPublicPO(){
System.out.println("in non static Inner , outer public po = " + po);
}
}
static class StaticInner {
private int si = 1000;
public void printOuterPrivateO(){
Outer outer = new Outer();
System.out.println("in static Inner , outer private o = " + outer.o);
}
private void printOuterPublicPO(){
Outer outer = new Outer();
System.out.println("in static Inner , outer public po = " + outer.po);
}
}
public static void main(String[] args){
// 非靜態(tài)內(nèi)部類
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.printOuterPublicPO();
inner.printOuterPrivateO();
System.out.println("inner private i = " + inner.i);
// 靜態(tài)內(nèi)部類
StaticInner staticInner = new StaticInner();
staticInner.printOuterPublicPO();
staticInner.printOuterPrivateO();
System.out.println("staticInner private si = " + staticInner.si);
// 外部類不能直接訪問(wèn)內(nèi)部類的成員两踏,以下做法將會(huì)報(bào)錯(cuò)
System.out.println("inner public pi = " + pi);
}
}
打印結(jié)果:
in non static Inner , outer public po = 100
in non static Inner , outer private o = 10
inner private i = 20
in static Inner , outer public po = 100
in static Inner , outer private o = 10
staticInner private si = 1000
總結(jié):
(1)非靜態(tài)內(nèi)部類必須依附在外部類的實(shí)例上,所以在新建非靜態(tài)內(nèi)部類Inner時(shí)使用如下方式:
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
(2)在外部類中新建靜態(tài)內(nèi)部類和新建普通的類一樣兜喻,如下:
StaticInner staticInner = new StaticInner();
(3)在沒有新建對(duì)象的情況下梦染,內(nèi)部類可以直接訪問(wèn)外部類的所有非私有成員,反過(guò)來(lái)則不行朴皆。在新建對(duì)象的情況下帕识,內(nèi)部類和外部類均可以通過(guò)新建對(duì)象的方式相互訪問(wèn)對(duì)方的所有成員,包括私有成員遂铡。例如上面的這些代碼:
//外部類訪問(wèn)內(nèi)部類私有變量
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
System.out.println("inner private i = " + inner.i);
//內(nèi)部類訪問(wèn)外部類私有變量
Outer outer = new Outer();
System.out.println("in static Inner , outer private o = " + outer.o);