七、 面向对象(二)
匿名類對(duì)象
創(chuàng)建的類的對(duì)象是匿名的。當(dāng)我們只需要一次調(diào)用類的對(duì)象時(shí),我們就可以考慮使用匿名的方式創(chuàng)建類的對(duì)象。特點(diǎn)是創(chuàng)建的匿名類的對(duì)象只能夠調(diào)用一次!
package day007;//圓的面積 class circle {double radius;public double getArea() {// TODO Auto-generated method stubreturn Math.PI * radius * radius;}public void setRadius(double r){radius = r;}public double getRadius(){return radius;}public void show(){System.out.println("我是一個(gè)圓");}}public class lambda{public void printArea(circle c, int time){System.out.println("radius"+"\t"+"area");for(int i =1;i<= time;i++){c.setRadius(i);System.out.println(c.getRadius() + "\t" + c.getArea());}}public static void main(String[] args){lambda p = new lambda();circle c = new circle();//新的圓半徑為0p.printArea(c, 5);new circle().show();//這個(gè)對(duì)象就是匿名對(duì)象,只使用一次后就無(wú)法再次調(diào)用 } } 對(duì)象作為參數(shù)傳遞在上面這個(gè)例子里,我們使用new circle()直接調(diào)用circle的方法。這個(gè)對(duì)象就是匿名類對(duì)象,這個(gè)對(duì)象產(chǎn)生時(shí),在內(nèi)存堆中開(kāi)辟內(nèi)存存儲(chǔ)了數(shù)據(jù),但是在棧中并沒(méi)有相應(yīng)的變量名指向這塊內(nèi)存地址,那么我們無(wú)法再第二次調(diào)用這個(gè)匿名類,即我們不可以使用此類再次調(diào)用circle類的屬性與方法。
在java虛擬機(jī)中,這個(gè)匿名類對(duì)象很快就被垃圾回收機(jī)制收走了,切記,當(dāng)我們某個(gè)類對(duì)象只需要使用一次的情況,我們才會(huì)考慮使用匿名類對(duì)象。
可變個(gè)數(shù)的行參的方法:
格式:對(duì)于方法的形參: 數(shù)據(jù)類型 ... 形參名;
可變個(gè)數(shù)的形參的方法與同名的方法之間構(gòu)成重載;
可變個(gè)數(shù)的形參在調(diào)用時(shí),個(gè)數(shù)從0開(kāi)始,到無(wú)窮多個(gè)都可以。
使用可變多個(gè)形參的方法與方法的形參使用數(shù)組是一致的。
若方法中存在可變個(gè)數(shù)的形參,那么一定要聲明在方法形參的最后。
在一個(gè)方法中,最多聲明一個(gè)可變個(gè)數(shù)的形參。
package day007;public class javaArgs {public static void main(String[] args) {// TODO Auto-generated method stubjavaArgs jargs = new javaArgs();jargs.getSum(1,2,3,4);new javaArgs().getSum(123,223);jargs.getSum("求和是", 2,3,5,8);} // public int getSum(int ... args){public void getSum(int ... args){int sum = 0;//args使用與數(shù)組一致for(int i = 0; i<args.length;i++){sum += args[i];}System.out.println(sum); // return sum; }//重載,可變個(gè)數(shù)的形參聲明在方法形參的最后public void getSum(String s,int ... args){int sum = 0;for(int i = 0; i<args.length;i++){sum += args[i];}System.out.println(s + ":"+ sum);} } java的*args的使用? java中形參與實(shí)參
形參:方法聲明時(shí),方法小括號(hào)內(nèi)的參數(shù),實(shí)參:調(diào)用方法時(shí),實(shí)際傳入的參數(shù)的值。
我們之前做的兩個(gè)值轉(zhuǎn)換:
package day007;public class TestArgsTransfer {public static void main(String[] args) {// TODO Auto-generated method stub//兩個(gè)值轉(zhuǎn)換int i = 10;int j = 5;System.out.println("i:" + i + " j:" + j);int temp = i;i = j;j = temp;System.out.println("i:" + i + " j:" + j);}} 兩個(gè)值交換然后你可能會(huì)想用一個(gè)類封裝一個(gè)方法完成交換。然后你寫了這樣一個(gè)方法。
package day007;public class TestArgsTransfer {public static void main(String[] args) {// TODO Auto-generated method stub//兩個(gè)值轉(zhuǎn)換int i = 10;int j = 5;//封裝到類方法TestArgsTransfer tt = new TestArgsTransfer();System.out.println("i:" + i + " j:" + j);tt.swap(i, j);//將i的值傳遞給m,j的值傳遞給nSystem.out.println("i:" + i + " j:" + j);}//定義一個(gè)方法,交換兩個(gè)變量的值public void swap(int m,int n){int temp = m;m = n;n = temp;System.out.println("m:" + m + " n:" + n);}} 你寫的封裝方法結(jié)果是你的i和j根本就沒(méi)有變,為什么呢?
簡(jiǎn)單來(lái)說(shuō)就是i與j是你定義的類屬性,你將i,j作為實(shí)參傳到了類方法里面,類方法swap里的兩個(gè)變量發(fā)生了位置轉(zhuǎn)換,但是main中的兩個(gè)值并沒(méi)有發(fā)生任何變化,在內(nèi)存中的表現(xiàn)如上圖,調(diào)用swap方法時(shí),會(huì)在棧中存兩個(gè)swap的局部變量,這兩個(gè)變量的值交換了,但是main的變量未發(fā)生改變。
那我們要如何做呢。
package day007;public class TestArgsTransfer1 {public static void main(String[] args) {// TODO Auto-generated method stubTestArgsTransfer1 tt = new TestArgsTransfer1();DataSwap ds = new DataSwap();System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);tt.swap(ds);System.out.println(ds);System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);}//交換元素的值public void swap(DataSwap d){int temp = d.i;d.i = d.j;d.j = temp;System.out.println(d);//打印引用變量d的值 } }class DataSwap{int i = 10;int j = 5; } 形參是引用數(shù)據(jù)類型這里swap方法傳入的是一個(gè)引用數(shù)據(jù)類型ds,相當(dāng)于d與ds一致都指向同一個(gè)堆空間,那么在swap中完成兩個(gè)值的交換。
練習(xí)一下,下面代碼的執(zhí)行結(jié)果是什么:
class Value {int i = 15; }class TestValue {public static void main(String argv[]) {TestValue t = new TestValue();t.first();}public void first() {int i = 5;Value v = new Value();v.i = 25;second(v, i);System.out.println(v.i);}public void second(Value v, int i) {i = 0;v.i = 20;Value val = new Value();v = val;System.out.println(v.i + " " + i);} }分析:
第一步,定義了TestValue類,在類的main函數(shù)中,生成一個(gè)實(shí)例t,并在堆中開(kāi)辟內(nèi)存(0x0001),在棧中定義t指向堆中內(nèi)存0x0001。實(shí)例調(diào)用實(shí)例的first方法。
第二步,在棧中有局部變量i值為5,一個(gè)新的變量v,指向堆中新開(kāi)辟內(nèi)存(0x0011),v的局部變量i值為25,將v與當(dāng)前局部變量i=5作為實(shí)參傳給second方法。
第三步,局部變量i的值改為0,v的局部變量i變?yōu)?0,定義一個(gè)新變量val指向堆中先開(kāi)辟內(nèi)存(0x0111),second中實(shí)參v指向內(nèi)存(0x0111)
第四步,此時(shí)打印v.i值為內(nèi)存0x0111中的i,值為15,i為局部空間中的變量i為0,first打印的v.i值為20(實(shí)參傳入first,v本身未發(fā)生指向的改變)。
面向?qū)ο?#xff1a;封裝
我們考慮不讓對(duì)象來(lái)直接作用屬性,而是通過(guò)"對(duì)象.方法"的形式,來(lái)控制對(duì)象對(duì)屬性的訪問(wèn)。實(shí)際情況中,對(duì)屬性的要求就可以通過(guò)方法來(lái)體現(xiàn)。
兩種方法:①將類的屬性私有化,②提供公共的方法(setter & getter)來(lái)實(shí)現(xiàn)調(diào)用。
package day007;public class java_private {public static void main(String[] args) {// TODO Auto-generated method stubAnimal an = new Animal(); // an.legs = 4;//飄紅an.setLegs(4);an.getLegs();}}class Animal{private String name;private int legs;public void setLegs(int l){legs = l;}public int getLegs(){System.out.println(legs);return legs;} } 私有封裝權(quán)限修飾符
? 構(gòu)造器
也就是構(gòu)造方法,但是與python的__init__有相似之處,但是不完全一致。
構(gòu)造器的作用:①創(chuàng)建對(duì)象 ②給創(chuàng)建的對(duì)象的屬性賦值(創(chuàng)建對(duì)象的話,相當(dāng)于python中的__new__與__init__的作用)。
1.設(shè)計(jì)類時(shí),若不顯式聲明類的構(gòu)造器的話,程序會(huì)默認(rèn)提供一個(gè)空參的構(gòu)造器
默認(rèn)加()就相當(dāng)于調(diào)用了構(gòu)造器了,類比python加()后實(shí)例化即調(diào)用了構(gòu)造方法。
2.一旦顯式的定義類的構(gòu)造器,那么默認(rèn)的構(gòu)造器就不再提供。
3.如何聲明類的構(gòu)造器。格式:權(quán)限修飾符? 類名(形參){ }。
?4.類的多個(gè)構(gòu)造器之間構(gòu)成重載。
類對(duì)象的屬性賦值的先后順序:①屬性的默認(rèn)初始化 ②屬性的顯式初始化③通過(guò)構(gòu)造器給屬性初始化?④通過(guò)"對(duì)象.方法"的方式給屬性賦值。
package day007;public class init {public static void main(String[] args) {Person p1 = new Person();System.out.println(p1.getName() + ":" + p1.getAge());String str = new String("hello");System.out.println(str);Person p2 = new Person("jeff");System.out.println(p2.getName());System.out.println(p2.getAge());Person p3 = new Person("frank",23);System.out.println("name:" + p3.getName() + " age:" + p3.getAge());//體會(huì)屬性賦值的過(guò)程Person p4 = new Person();System.out.println("name:" + p4.getName() + " age:" + p4.getAge());Person p5 = new Person(12);System.out.println("name:" + p5.getName() + " age:" + p5.getAge());} }class Person{//屬性private String name;private int age = 1;//構(gòu)造器public Person(String n){name = n;}public Person(){ // age = 10; // name = "張三"; }public Person(int a){age = a;}public Person(String n,int a){name = n;age = a;}//方法public void setName(String n){name = n;}public void setAge(int a){age = a;}public String getName(){return name;}public int getAge(){return age;} } 構(gòu)造器?
轉(zhuǎn)載于:https://www.cnblogs.com/Jeffding/p/8681442.html
總結(jié)
以上是生活随笔為你收集整理的七、 面向对象(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 驻马店看卵巢多囊最好的医院推荐
- 下一篇: centos 搭建jenkins+git