this 用法有三種,主要應用場合:java
表示當前對象引用,經常使用於形參或局部變量與類的成員變app
量同名的情形,使用this.成員名錶示當前對象的成員ide
class FighterPlane { private String name; private int missileNum; private A a; public void setA(A _a){ if (_a !=null) { a = _a ;} } public A getA(){ if (a !=null) { return a;} else return null; } public void fire(){ ……} public FighterPlane(String _name,int _missileNum){ ……} } class A { FighterPlane fp; public A(FighterPlane fpp){ this.fp = fpp; fpp.setA(this);//將當前對象傳給FighterPlane } public void invoke(){ //A中對象發送消息給FighterPlane的對象 fp.fire(); } } public class Run{ public static void main(String[] args) { FighterPlane ftp = new FighterPlane("su35",10); A a = new A(ftp); a.invoke(); } }
class AddClass { public int x=0,y=0,z=0; AddClass (int x) { this.x=x; } AddClass (int x,int y) { this(x); this.y=y; } AddClass (int x,int y,int z) { this(x,y); this.z=z; } public int add() {return x+y+z; } } public class RunAddClass { public static void main(String[] args) { AddClass p1=new AddClass(2,3,5); AddClass p2=new AddClass(10,20); AddClass p3=new AddClass(1); System.out.println("x+y+z="+p1.add()); System.out.println("x+y="+p2.add()); System.out.println("x="+p3.add()); } }
super訪問當前類的直接父類,主要應用場合:函數
子類的數據成員或成員方法與父類的數據成員或成員方法名this
字相同時,當要調用父類的同名方法或同名數據成員時則可設計
用super來指明。即super.數據成員;super.成員方法code
super(參數) , 表示調用父類構造方法orm
class A { int x=4;int y=1; public void Printme() { System.out.println("x="+x+" y="+y); System.out.println("class name: "+getClass().getName()); } } public class AA extends A{ int x; public void Printme() { int z=super.x+6; super.x = 5; super.Printme(); System.out.println("I am an "+getClass().getName()); x=6; System.out.println(" z="+z+" x="+x+" super.x="+super.x +" y="+y+"super.y="+y); } } public static void main(String arg[]) { int k; A p1=new A(); AA p2=new AA(); p1.Printme(); p2.Printme(); } }
子類和父類定義了同名數據成員,子類繼承了父類的x,自對象
己又定義了一個x,則會發生父類數據成員的隱藏。在子類blog
中用的x都是子類本身的,若要使用父類x,則必須用super.x。
子類在覆蓋父類方法的同時,調用父類的super.Printme(),這
個方法中的成員變量均爲父類的成員變量。super.Printme()中
的代碼雖然調用父類代碼,但其中的this指的是子類對象。
類的域變量在類初始化的時候就開始建立了,而方法中的變量是在調用到該方法時,纔會爲該變量建立。
import java.awt.*; import java.applet.*; //抽象類Shapes abstract class Shapes { protected int x,y,k; protected double m; public Shapes(int x,int y,int k,double m){ this.x=x; this.y=y; this.k=k; this.m=m; } abstract public double getArea(); abstract public double getPerimeter(); } //各子類定義 class Rect extends Shapes { public double getArea() { return(k*m); } public double getPerimeter() { return(2*k+2*m);} public Rect(int x,int y,int width,int height) { super(x,y,width,height);} } class Triangle extends Shapes{ public double getArea(){ return(Math.sqrt(m*( m-k)*( m-x)*(m-y)));} public double getPerimeter(){ return(k+x+y);} public Triangle(int baseA,int baseB,int baseC){ super(baseA, baseB, baseC,0); //m充當了周長的一半 m= (baseA+ baseB+ baseC)/2.0; } } class Circle extends Shapes{ public double getArea() //Math是java.lang包中的類,PI是靜態其屬性,其值爲Π { return(m* m *Math.PI);} public double getPerimeter() {return(2*Math.PI* m);} public Circle(int x,int y,int width){ //k充當了直徑,m充當了半徑的角色 super(x,y, width, width/2.0); } } //使用類 public class RunShape extends Applet{ Rect rect=new Rect(5,15,25,25); Triangle tri=new Triangle(5,5,8); Circle cir =new Circle(13,90,25); public void paint(Graphics g){ //繪製矩形,輸出矩形的面積和周長 g.drawRect(rect.x,rect.y,rect.k,(int)rect.m); g.drawString("Rect Area:"+rect.getArea(),50,35); g.drawString("Rect Perimeter:"+rect.getPerimeter(),50,55); //輸出三角形的面積和周長 g.drawString("Triangle Area:"+tri.getArea(),50,75); g.drawString("Triangle Perimeter:"+tri.getPerimeter(),50,95); //繪製圓,輸出圓的面積和周長 g.drawOval(cir.x-(int)cir.k/2,cir.y-(int)cir.k/2,cir.k,cir.k); g.drawString("Circle Area:"+cir.getArea(),50,115); g.drawString("Circle Perimeter:"+cir. getPerimeter(),50,135); } }
接口最直接的好處就是提供了一個統一的操做方法名,而後一樣的方法名在不一樣的類中能夠有不一樣的具體實現過程,這樣的結果就是在操做實現了該接口的類的對象時,不用去事先了解該方法的名字,而採用統一的名字進行調用。
接口的設計用途:通用可擴展代碼,多態體現
import java.util.*; public boolean addAll(int index, Collection c) { int numNew = c.size(); ...... } public boolean addAll(int index, AbstractCollection c) public boolean addAll(int index, AbstractList c) public boolean addAll(int index, AbstractSet c) public boolean addAll(int index, LinkedList c) public boolean addAll(int index, ArrayList c) ......
//定義接口 public interface Washer { public static final int ON = 1 ; public static final int OFF = 0 ; abstract void startUp(); //啓動 abstract void letWaterIn(); //進水 abstract void washClothes(); //洗衣 abstract void letWaterOut(); //排水 abstract void stop(); //中止 } //實現接口 class RoseBrand implements Washer{ public void startUp(){ System.out.println("startUp");} public void letWaterIn(){System.out.println("letWaterIn");} public void washClothes(){System.out.println("washClothes");} public void letWaterOut(){System.out.println("letWaterOut");} public void stop(){System.out.println("stop");} public void dehydrate(){System.out.println("dehydrate ");}//脫水 } //使用接口 public class Consumer { public static void main(String args[]){ //接口聲明引用實現接口的RoseBrand類的對象。 Washer w = new RoseBrand(); w.startUp(); w.letWaterIn(); w.washClothes(); w.letWaterOut(); w.stop(); //w.dehydrate ();當經過接口調用玫瑰洗衣機類獨有的, //接口未定義的功能方法,編譯會報錯。 } }
在類中,用implements關鍵字來實現接口。一個類能夠實現多個接口,在implements後用逗號隔開多個接口的名字。一個接口也可被多個類來實現。
接口中的字段(域)的值存儲在該接口的靜態存儲區域內,使用接口名.字段或實現類.字段都可訪問。
類在實現接口的抽象方法時,必須顯式使用public修飾符,不然將被警告爲縮小了接口中定義的方法的訪問控制範圍。
class X { Y b = new Y(); X() { System.out.println("X"); } } class Y { Y() { System.out.println("Y"); } } public class Z extends X{ Y y = new Y(); Z() { System.out.println("Z"); } public static void main(String[] args) { new Z(); } }
A. Z B. YZ C. XYZ D. YXYZ
答案:D
解析:執行new Z();後,進入Z類,首先實現父類X,實現X時又因爲Y b = new Y();先實現Y,因而輸出Y,完畢後回到X,輸出X,再回到Z類,執行Y y = new Y();輸出Y,最後輸出Z。
在子類對父類的繼承中,若是子類的成員變量和父類的成員變量同名,此時稱爲子類隱藏(override)了父類的成員變量。
覆蓋:子類重寫父類的方法,要求方法名和參數類型徹底同樣(參數不能是子類),返回值和異常比父類小或者相同(即爲父類的子類),訪問修飾符比父類大或者相同。
隱藏:父類和子類擁有相同名字的屬性或者方法( 方法隱藏只有一種形式,就是父類和子類存在相同的靜態方法)時,父類的同名的屬性或者方法形式上不見了,實際是仍是存在的。
A a = new A(); a = new A1(); a = new A2(); a = new A3(); A1 a1 = new A3 (); A3 a3 = a1; //× A2 a2 = new A1(); //× a3 = new A2(); //×
import java.applet.*; import java.awt.*; import java.awt.event.*; public class test extends Applet implements ActionListener{ private TextField input; private double d=0.0; //進行初始化工做,產生對象,加入監聽者 public void init(){ input = new TextField(10); //myApplet是容器,input是組件,調用add使input嵌入容器 add(input); input.addActionListener(this); //向TextField註冊監聽器 } public void paint(Graphics g){ g.drawString("您輸入了數據"+d,10,50); } public void actionPerformed(ActionEvent e) { d=Double.valueOf(input.getText()).doubleValue(); //進行刷新,調用paint()方法 repaint(); } }