第五周Java作业-多态

1.

//修饰符为public,另外的包可以访问对象的属性和方法
package com.resource;
public class FighterPlane{
  public String name;
  public int missileNum;
  public void fire(){
  	if(missileNum>0){
  	   System.out.println("now fire a missile!");
  	   missileNum-=1;
  	}
  	else{
  	  System.out.println("No missile left!");
  	}
  }
 }
 package com.run;
 package com.resource.*;
 public class RunPlane{
   public static void main (String args[]){
      FighterPlane fp=new FighterPlane();
      fp.name="王 85";
      fp.missileNum=7;
       fp.fire();
   }
}   
 
//若FighterPlane修饰符为protected,则RunPlane没有访问权限。

 

//修饰符为protected,不同包的子类可以访问protected的属性和方法
package com.resource;
public class FighterPlane{
  protected String name;
  protected int missileNum;
  public void fire(){
  	if(missileNum>0){
  	   System.out.println("now fire a missile!");
  	   missileNum-=1;
  	}
  	else{
  	  System.out.println("No missile left!");
  	}
  }
 }
 package com.run;
 import com.resource.FighterPlane;
 public class RunPlane extends FighterPlane{
   public static void main (String args[]){
      RunPlane fp=new RunPlane();
      fp.init();
      fp.fire();
   }
}   
   private void init(){
     name="www";
     missileNum=8;
 }
}
 

 

2.public和protect

//子类可以直接访问父类的protected属性和方法
class Plane{
  protected String name;
  public void setName(String _name){
     name=_name;
  }
  public String getName(){
    return name;
  }
}
class FighterPlane extends Plane{
  private int missileNum;
  public void setNum(int _missileNum){
    missileNum=_missileNum;
  }
  public void fire(){
    missileNum-=1;
  }
}
class Run{
    public static void main(String []args){
      FighterPlane p=new FighterPlane;
      p.name="sss";
      p.setName="subs";
      System.out.println(p.getName());
      p.fire();
}
}

 

//​子类不能直接访问父类的private属性和方法,可以调用父类的公用方法间接访问私有属性
class Plane{
  private String name;
  public void setName(String _name){
     name=_name;
  }
  public String getName(){
    return name;
  }
}
class FighterPlane extends Plane{
  private int missileNum;
  public void setNum(int _missileNum){
    missileNum=_missileNum;
  }
  public void fire(){
    missileNum-=1;
  }
}
class Run{
    public static void main(String []args){
      FighterPlane p=new FighterPlane;
      //p.name="sss";
      p.setName="subs";
      System.out.println(p.getName());
      p.fire();
}
}​

 

3.组合是使用多个已有的对象组合为一个功能更加复杂强大的新对象。体现的是整体与部分、拥有的关系,使多个对象相互关联,通过发送消息的方式。

 class FighterPlane{
  String name;
  int missileNum;
  public FighterPlane (String _name,int _missileNum){
    name=_name;;
    missileNum=_missileNum;
  }
  public void fire(){
  	if(missileNum>0){
  	   System.out.println("now fire a missile!");
  	   missileNum-=1;
  	}
  	else{
  	  System.out.println("No missile left!");
  	}
  }
 }
class A
{ 
    FighterPlane fp;
    public A(FighterPlane fpp){
      this.fp=fpp;
   }
   public void fireMissile(){
     fp.fire();
  }
}
public class Run{
    public static void main(String []args){
      FighterPlane ftp=new FighterPlane("subs",9);
      A a=new A(ftp);
      a.fireMissile();
}
}​

 

4.重载:在类中定义了多个同名而不同内容参数的成员方法,称这些方法为重载。重载使旧的接口方法得以保留以保障原先使用程序的稳定,同时增加带参数的新的重载方法以满足扩充需求,并且新增加的重载方法于原先旧方法之间存在功能复用关系。

class Parent{
    public int getScore(){
      return 4;
    }
    public int getScore(){
      return i;
    }
}

 

5.覆盖:子类对父类参数相同,返回类型相同的同名方法重新进行定义。覆盖可使抽象类申明在保证消息发送统一性的前提下,具有消息结果执行上的相异性特点。

class Parent{
    public int getScore()
    {return 3;}
    public String getCountry()
    {return "CHINA";}
}
class Son extends Parent{
    public int getScore(){
     return 4;
   }
}
public class RunSon{
    public static void main(String args[]){
       Son s=new Son();
       System.out.println(s.getScore());
System.out.println(s.getCountry());
 }
}
/*输出结果:
4 
CHINA*/

 

 

1.子类构造函数→父类构造函数→父类属性→父类构造函数→子类属性→子类构造函数

子类对象的实例化过程:
(1)在方法区先加载父类,再加载子类;
(2)然后在栈中申请空间,声明变量P;
(3)在堆内存中开辟空间,分配对象地址;
(4)在对象空间中,对对象的属性(包括父类的属性)进行默认初始化;
(5)子类构造方法进栈;
(6)显示初始化父类的属性;
(7)父类构造方法进栈,执行完毕出栈;
(8)显示初始化子类的属性;
(9)初始化完毕后,将堆内存中的地址值赋给引用变量P,子类构造方法出栈。

2.通过对象引用的方法,创建两个类,这两个类中都包含另一个类的成员。

class FighterPlane{
  private B b;
  public void setB(B _b){
  if(_b!=null){b=_b}
  }
  public B getB(){
  if(b!=null){return b}
  else return null;
  }
}
class B{
  FighterPlane fp;
  public B(FighterPlane fpp){
  this.fp=aa;
  fpp.setB(this);
  }
}

 

3.组合是将两个类结合起来,其中一个类是另外一个类的域变量,两个类之间平级。
而继承则是子类沿用父类的对象与方法,是父类的下级。
当只需要使用另外一个类的方法时使用组合;当需要使用另外一个类的方法但不想被其他类访问时用继承。

4.运行时多态即覆盖,子类方法覆盖父类方法。
 

//父类
class A {  
    void fun()  
    {  
        System.out.println(“I am A”);  
    }  
}  
//A的子类B
class B extends A  
{  
    void fun()  
    {      
        System.out.println(“I am B”);  
    }  
}  
//A的子类C  
class C extends A  
{  
    void fun()  
    {      
        System.out.println(“I am C”);  
    }  
}  

class Test  
{  
    public static void main(String[] args)  
    {  
        //定义父类对象引用变量
        A a;
        //子类对象  
        B  b = new B();  
        C  c = new C();
        //父类对象引用变量 引用 子类对象  
        a=b;  
        a.fun();  //输出   I am B
        a=c;  
        a.fun();  //输出   I am C
    }  
}

5.

interface Shapes 
{  public double getArea();
   public double getPerimeter();
}
class Rect implements Shapes 
{ private int k;
  private int m;
  public Rect(int k, int m){
        this.k=m;
        this.k=m;
    }
  public double getArea()
	  { return(k*m); }
  public double getPerimeter()
	  { return(2*k+2*m);}
}
class Triangle implements Shapes
{   private int k;
    private int x;
    private int y;
    public Triangle(int k, int x, int y){
        this.k=k;
        this.x=x;
        this.y=y;
    }
    public double getArea()
    { double m=(x+y+z)/2.0;
      return(Math.sqrt(m*( m-k)*( m-x)*(m-y)));}
    public double getPerimeter()
	 {return(k+x+y);}
   }
class Circle implements Shapes
{   private int m;
    public Circle(int m){
        this.m=m;
    }
   public double getArea()
		{return(m* m *Math.PI);}
    public double getPerimeter()
		{return(2*Math.PI* m);}
}
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); 
  }
}

 

6.instanceof用来测试一个对象是否为一个类的实例。

boolean result = obj instanceof Class

详情可参考https://www.cnblogs.com/ysocean/p/8486500.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值