第六章 面向对象(下)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nove_wb/article/details/78385891

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. 类非常小;

阅读更多
换一批

没有更多推荐了,返回首页