抽象类
1,语法定义
抽象类前使用abstract关键字修饰,则该类为抽象类
2.应用场景
(1)在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
(2)从多个具有相同特征的类抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性
3.作用
限制规定子类必须实现某些方法,但不关注实现细节
(主要目的:不关注子类的实现。但是要约束子类必须要有哪些子类)
4.适用方法(使用规则)
(1)abstract定义抽象类
(2)abstract定义抽象方法,只声明,不需要实现
(3)包含抽象方法的类都是抽象类
(4)抽象类中可以包含普通的方法,也可以没有抽象方法
(5)抽象类不能直接创建,可以定义引用变量
**抽象类没没有方法体,但是以分号结束
***小技巧
"syso+alt+/"System.out.println("");快捷键
在创建子类时,勾选Browse选择父类名称
在创建子类时,勾选abstract直接生成抽象类
创建测试类(Initail类main方法)时,勾选public static void main(String[] args)直接生成:
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public abstract class Telphone {
public abstract void call();
public abstract void message();
}
public class CellPhone extends Telphone {
@Override
public void call() {
System.out.println("通过键盘打电话");
}
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("通过键盘打电话");
}
}
class SmartPhone extends Telphone {
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("可以通过语音打电话");
}
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("可以通过语音发短信");
}
}
public class Initail {
public static void main(String[] args) {
// TODO Auto-generated method stub
Telphone tel1=new CellPhone();
tel1.call();
tel1.message();
Telphone tel2=new SmartPhone();
tel2.call();
tel2.message();
}
}
疑问:
@Override 为自动生成的代码,,是什么意思,有什么作用?
@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处:
1、可以当注释用,方便阅读;
2、编译器可以给你验证 // TODO Auto-generated method stub 为自动生成的代码,,是什么意思,有什么作用?
意思是告诉你这些代码是自动生成的,不是你自己写的,就是一个提示的作用,没大作用
练习:
现有shape图形类,他有两个图形类,用Rectangle矩形和Circle圆形子类,求圆形的周长和面积。
package com.shape; public abstract class Shape { public abstract void CPerimeter(); public abstract void CArea(); }
package com.shape; import java.util.Scanner; public class Rectangle extends Shape { int longs=0; int width=0; int perimeter=0; int area=0; @Override public void CPerimeter() { int longs=0; int width=0; Scanner in=new Scanner(System.in); System.out.println("请输入长方形的长"); longs=in.nextInt(); System.out.println("请输入长方形的宽"); width=in.nextInt(); // TODO Auto-generated method stub perimeter=2*(longs+width); System.out.println("长方形周长为:"+perimeter); } @Override public void CArea() { int longs=0; int width=0; Scanner in=new Scanner(System.in); System.out.println("请输入长方形的长"); longs=in.nextInt(); System.out.println("请输入长方形的宽"); width=in.nextInt(); // TODO Auto-generated method stub area=longs*width; System.out.println("长方形面积为:"+area); } }
package com.shape; import java.util.Scanner; public class Circle extends Shape { @Override public void CPerimeter() { // TODO Auto-generated method stub double r=0; double perimeter=0; Scanner in=new Scanner(System.in); System.out.println("圆形的半径"); r=in.nextInt(); perimeter=2*(Math.PI )*r; System.out.println("圆形的周长为:"+perimeter); } @Override public void CArea() { // TODO Auto-generated method stub double r=0; double area=0; Scanner in=new Scanner(System.in); System.out.println("圆形的半径"); r=in.nextInt(); area=(Math.PI) *r*r; System.out.println("圆形的周长为:"+area); } }
package com.shape; public class Initail { public static void main(String[] args) { Shape sh1=new Rectangle(); Shape sh2=new Circle(); sh1.CArea(); sh1.CPerimeter(); sh2.CArea(); sh2.CPerimeter(); } }