第六章 面向对象(下)

来源:互联网 发布:淘宝女装店铺改卖男装 编辑:程序博客网 时间:2024/06/05 23:53

6.1this的用法有3种;

  • this.域变量、this.成员方法:在一些容易混淆的场合,在方法内借助this来明确表示用的是类的域变量;
  • this(参数)——引用重载的构造方法
  • this指代当前对象
super的用法有2种;
  • super.域变量、super.成员方法(参数)
  • super(参数)
6.2子类对象实例化的过程;
  1. 为子类对象分配内存空间,对域变量进行默认初始化
  2. 绑定构造方法
  3. 调用this或super语句,注意二者必居其一,但不能同时存在
  4. 进行实例变量的显式初始化操作
  5. 执行当前构造方法体中的程序代码
6.3 如果传入参数的名称和域变量的名称相同,则必须用this来指明域变量,否则将造成语意不清而出现问题;
6.4 产生抽象类并采用继承方式定义子类,可以简化子类定义,增加系统结构关系的清晰度,以代码为例:
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();}package 第六章;import java.awt.*;import java.applet.*;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){    //m充当了半径的角色,k充当了直径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);   }}
结果:

抽象类在具体子类方面的应用:

package 第六章;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();}package 第六章;import java.awt.*;import java.applet.*;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){    //m充当了半径的角色,k充当了直径super(x,y, width, width/2.0);}}public class RunShape1 extends Applet{Rect rect=new Rect(5,15,25,25);Triangle tri=new Triangle(5,5,8);Circle cir=new Circle(13,90,25); //增加两个方法,注意抽象类的声明为s,ab为字符串输出的坐标。//getClass.getName是得到对象对应的类名。private void drawArea(Graphics g,Shapes s,int a,int b){g.drawString(s.getClass().getName()+" Area"+s.getArea(),a,b);}private void drawPerimeter (Graphics g,Shapes s,int a,int b){g.drawString(s.getClass().getName()+" Perimeter"+s.getPerimeter(),a,b);}public void paint(Graphics g){     g.drawRect(rect.x,rect.y,rect.k,(int)rect.m);              //1  drawArea (g,rect,50,35);     //2  drawPerimeter(g,rect,50,55);     //3  drawArea (g, tri,50,75);         //4  drawPerimeter(g,tri,50,95);         //5   g.drawOval(cir.x-(int)cir.k/2,cir.y-(int)cir.k/2,cir.k,cir.k); //6  drawArea (g, cir,50,115);     //7  drawPerimeter(g,cir,50,135);   //8 }}
结果:


6.5 接口相当于一种标准,类似于产品功能说明书;
package 第六章;interface  Washer {    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 ();当通过接口调用玫瑰洗衣机类独有的,//接口未定义的功能方法,编译会报错。  }  }
结果:

6.6 抽象类和接口比较;
共同点:二者都有抽象方法,都不能实例化。都有自己的声明,并能引用具体子类或实现类对象
不同点:
属性:抽象类可以有域变量,而接口不能有域变量,只能是静态变量;
成员方法:抽象类可以有具体方法,而且具体方法可以调用抽象方法,接口如果有方法则全部是抽象方法;
实现策略:抽象类必须有子类继承,接口必须有实现类实现;
扩展性:抽象类弱,接口强;
6.7 引用比较方法;
equals方法;
==;
instanceof方法;
6.8 
内部类可以直接访问外部类中的所有属性;
匿名内部类的使用条件:
  1. ’只用到类的一个实例;
  2. 类在定义后马上用到;
  3. 类非常小;