zoukankan      html  css  js  c++  java
  • java基础:9.1 抽象类

    在前几章,我们学了父类与继承等操作。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类。

    在父类里定义一些方法,但这些方法不能在父类中实现,因为他们的实现取决于几何对象的具体类型。这样的方法称为抽象方法,在方法头中用abstract修饰符表示。抽象方法是非静态的

    抽象类和常规类很像,但是不能使用new操作符创建它的实例。抽象方法只有定义而没有实现,它的实现由子类提供。

    一个包含抽象方法的类必须声明为抽象类。

    抽象类的构造方法定义为protected,因为它只被子类使用。创建一个具体子类的实例时,它的父类的构造方法被调用以初始化父类中定义的数据域。

    不能使用new 操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型

    GeometricObject[] object = new GeometricObject[10];

    object[0] = new Circle();  是合法的

    // GeometricObject.java
    // 包含抽象类的父类
    public abstract class GeometricObject {
    
    	private String color = "white";
    	private boolean filled;
    	private java.util.Date dateCreated;
    	
    	protected GeometricObject() {
    		dateCreated = new java.util.Date();
    	}
    	
    	protected GeometricObject(String color,boolean filled) {
    		dateCreated = new java.util.Date();
    		this.color = color;
    		this.filled = filled;
    	}
    	
    	public String getColor() {
    		return color;
    	}
    	
    	public void setColor(String color) {
    		this.color = color;
    	}
    	
    	public boolean ifFilled() {
    		return filled;
    	}
    	
    	public void setFilled(boolean filled) {
    		this.filled = filled;
    	}
    	
    	public java.util.Date getDateCreated(){
    		return dateCreated;
    	}
    	
    	@Override
    	public String toString() {
    		return "created on "+dateCreated + "
    color" + color + 
    				"and filled :" + filled;
    	}	
    	public abstract double getArea();
    	public abstract double getPerimeter();
    }
    
    // Circle.java
    // 子类1
    public class Circle extends GeometricObject{
    	   private double radius;
    	   public Circle(){
    	    }
    	   
    	   public  Circle(double newRadius){
    	        this.radius = newRadius;
    	    }
    		
    	   protected  Circle(double radius,String color,boolean filled) {
    			this.radius = radius;
    			setColor(color);
    			setFilled(filled);
    		}
    	    /* return radius */
    	    public double getRadius() {
    	    	return radius;
    	    }
    	    /* set radius */
    	    public void setRadius(double radius) {
    	    	this.radius = (radius >=0) ? radius : 0;
    	    }
    	    
    	    public double getArea(){
    	        return radius*radius*Math.PI;
    	    }
    	    
    	    public double getPerimeter(){
    	    	return 2*radius*Math.PI;
    	    }
    	    
    	    public void printCircle() {
    	    	System.out.println("the circle is created " + getDateCreated() +
    	    			"and the radius is " + radius );
    	    }
    }
    
    // Rectangle.java
    // 子类2
    public class Rectangle extends GeometricObject{
    	   private double width;
    	   private double height;
    	   
    	   public Rectangle(){
    	    }
    	   
    	   public  Rectangle( double width,double height){
    	        this.width = width;
    	        this.height = height;
    	    }
    		
    	   protected  Rectangle(double width,double height,String color,boolean filled) {
    	        this.width = width;
    	        this.height = height;
    			setColor(color);
    			setFilled(filled);
    		}
    
    	    public double getWidth() {
    	    	return width;
    	    }
    	    
    	    public void setWidth(double width) {
    	    	this.width = width;
    	    }
    
    	    public double getHeight() {
    	    	return height;
    	    }
    
    	    public void setHeight(double height) {
    	    	this.height = height;
    	    }
    	    
    	    public double getArea(){
    	        return height*width;
    	    }
    	    
    	    public double getPerimeter(){
    	    	return 2 * (height+ width);
    	    }    	    
    }
    
    // 测试程序
    
    public class TestGeometric {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		GeometricObject g1 = new Circle(5);
    		GeometricObject g2 = new Rectangle(5,3);
    		System.out.println("The two objects have the same area? "
    				+ equalArea(g1,g2) );
    		displayGeometricObject(g1);
    		displayGeometricObject(g2);
    	}
    	
    	public static boolean equalArea(GeometricObject g1,GeometricObject g2) {
    		return g1.getArea() == g2.getArea();
    	}
    	
    	public static void displayGeometricObject(GeometricObject g) {
    		System.out.println();
    		System.out.println("the area is " + g.getArea());
    		System.out.println("the perimeter is " + g.getPerimeter());
    	}
    
    }
    
  • 相关阅读:
    js自定义回调函数
    python:sql建表语句转换为json
    简单list转化为tree结构
    JSP中页面定时刷新
    struts2中<s:select/>标签的运用详解
    Redis 的 Sentinel
    redis持久化(persistence)
    java验证身份证合理性
    js 里面的键盘事件对应的键码
    Struts2中使用OGNL表达式语言访问静态方法和静态属性
  • 原文地址:https://www.cnblogs.com/l20902/p/10610932.html
Copyright © 2011-2022 走看看