Java面向对象
Java异常
Java数组
Java常用类
Java集合
Java IO流
Java线程
Java反射
Socket编程
Java注解开发
Java GoF设计模式
HashMap
Java内存模型
Java线性表

Java抽象类

把所有的三角形抽象类三角形类, 把所有的圆形抽象为圆形类,把所有的矩形抽象为矩形类, 把所有的三角形/圆形/矩形等所有平面图形抽象为平面图形类。

在平面图形类, 可以进行对平面图形求面积/求周长等操作, 但是不同的图形有不同的求法, 在平面图形类中, 求面积/求周长的操作没法具体实现. 就像所有的动物都会动, 不同的动物动的方式不同,动物类有这个操作,也没法具体实现。

当一个类的某个操作没法具体实现时,这个操作可以定义为抽象方法。

抽象方法使用abstract修饰的方法,只有方法的声明部分,没有方法体。

package com.wkcto.chapter01.abstracttest.demo01;
/**
 * 定义平面图形 类
 * 		该类有对平面图形求面积,求周长的操作
 * 
 * 1) 当一个类的某个操作没法具体实现时, 这个操作可以定义为抽象方法
 * 2) 使用abstract修饰的方法为抽象方法, 只有方法的声明,没有方法体
 * 3) 含有抽象方法的类必须定义为抽象类
 * @author 蛙课网
 *
 */
public abstract class Graphics2d {
	//定义抽象方法,求面积
	public abstract double getArea();
	//定义抽象方法,求周长
	public abstract double getPerimeter();
	
}
package com.wkcto.chapter01.abstracttest.demo01;
/**
 * 定义矩形类
 * 
 * 	1) 子类继承了抽象类, 需要在子类中重写抽象类的抽象方法
 * @author 蛙课网
 *
 */
public class Rectangle extends Graphics2d {
	int width;
	int height;
	
	public Rectangle(int width, int height) {
		super();
		this.width = width;
		this.height = height;
	}

	@Override
	public double getArea() {
		return width*height;
	}

	@Override
	public double getPerimeter() {
		return 2*(width+height);
	}

}
package com.wkcto.chapter01.abstracttest.demo01;
/**
 * 测试类,
 * 	定义一个方法,可以显示任意平面图形的面积与周长
 * @author 蛙课网
 *
 */
public class Test {

	public static void main(String[] args) {
		//创建矩形 对象
		Rectangle rect = new Rectangle(10, 5);
		//方法的形参graphics2d是一个父类引用,在调用方法时, 可以传递子类对象
		showInfo(rect);
		
		//创建圆形对象
		Circle c1 = new Circle(10);
		showInfo(c1);
	}

	//	定义一个方法,可以显示任意平面图形的面积与周长
	public static void showInfo( Graphics2d graphics2d) {
		System.out.println("平面图形的信息------------------");
		System.out.println("面积:" + graphics2d.getArea());
		System.out.println( "周长:" + graphics2d.getPerimeter());
	}
}
package com.wkcto.chapter01.abstracttest.demo01;
/**
 * 定义三角形类
 * 		如果子类继承了抽象类, 没有重写所有的抽象方法,那么子类也需要定义为抽象类
 * @author 蛙课网
 *
 */
public abstract class Triangle extends Graphics2d {
	int a;
	int b;
	int c;
	
	@Override
	public double getPerimeter() {
		return a+b+c;
	}
}
package com.wkcto.chapter01.abstracttest.demo01;
/**
 * 测试抽象类的特点:
 * 	1) 只要使用abtract修饰的类就是抽象类
 * 	2) 含有抽象方法的类必须定义 为抽象类,但是,抽象类中不一定含有抽象方法
 * 		有时,对现有的类进一步抽象形成更高层级的类(更抽象的类),如食物类,动物类, 它们是没法实例化,这种情况下,可以定义为抽象类
 * 	3) 抽象类是一种引用数据类型, 可以定义变量, 但是抽象类不能实例化对象,
 * 		抽象类定义引用可以赋值子类对象
 * 	4) 抽象类肯定含有构造方法, 子类创建对象时调用子类构造方法,子类构造方法体执行前会先执行父类的构造方法
 * 	5) abstract与final不能同时使用
 * @author 蛙课网
 *
 */
public class Test02 {
	public static void main(String[] args) {
		//使用抽象类定义一个变量
		Graphics2d graphics2d;
//		graphics2d = new Graphics2d();;//Cannot instantiate the type Graphics2d
		
		Rectangle rectangle = new Rectangle(10, 5);
		
		//抽象类引用可以赋值子类对象
		graphics2d = rectangle;
		graphics2d = new Rectangle(5, 2);
		
		
	}
}

练习: 主人喂养宠物,宠物就卖萌

package com.wkcto.chapter01.abstracttest.demo02;
/**
 * 宠物类
 * 		卖萌
 * @author 蛙课网
 *
 */
public abstract class Pet {
	//卖萌
	public abstract void sellMeng() ;
}
package com.wkcto.chapter01.abstracttest.demo02;
/**
 * 小狗是宠物
 * @author 蛙课网
 *
 */
public class Dog extends Pet {

	@Override
	public void sellMeng() {
		System.out.println("汪汪汪~~~~");
	}

}
package com.wkcto.chapter01.abstracttest.demo02;
/**
 * 主人类
 * @author 蛙课网
 *
 */
public class Master {
	//喂宠物
	public void feed( Pet  pet) {
		//宠物卖萌
		pet.sellMeng();
	}
}
package com.wkcto.chapter01.abstracttest.demo02;
/**
 * 测试主人喂宠物,宠物就卖萌
 * @author 蛙课网
 *
 */
public class Test {

	public static void main(String[] args) {
		Master xiaoxi  = new Master();
		
		Dog dog = new Dog();
		xiaoxi.feed(dog);
		
		Cat cat = new Cat();
		xiaoxi.feed(cat);
	}

}

练习:

愤怒的小鸟, 红火(红颜色的鸟)可以正常飞行 , 蓝冰(蓝颜色的鸟)可以一个变三个, 黄风(黄颜色的鸟)可以加速飞行,  定义一个弹弓类,有一个弹射的方法 ,可以把鸟给射出去, 鸟在飞。

全部教程