72.抽象类

在我们编写一个对象的时候,我们可能会对一些类的方法进行定义,但是并不具体实现。而是将这些方法的实现放到它的子类中去。这样可以增强类设计的灵活性。

 

比如,我们定义了一个表示各种图形的类Shape,这个类有一些属性,还有一个用于计算这个图形的周长的方法calPerimeter(),但是,对于不同的图形,对周长的计算方法也不同,我们不能将所有的图形的周长的计算方法都写到这个方法中。

 

通过关键字abstract,我们可以在父类Shape中不实现这个方法,而将它的实现放到子类中去。比如,一个圆形的类继承了Shape这个父类,然后,在这个子类中实现calPerimeter()这个方法的细节:圆形的周长=2ПR,其中, П表示圆周率,而R表示圆的半径。如果是一个矩形继承了这个类,则可以在这个子类中实现这个方法calPerimeter(),它的计算方式是2*(Width+Heigt)。


从上面的讨论中可以看出来,我们有时候只是定义某个类的一个“骨架”,并不具体实现,而将进一步的具体实现放到子类中去完成。这个时候,我们可以将这个类定义为abstract的,而将没有实现的方法声明为abstract的。因为abstract类中具有没有被实现的方法,所以,抽象类不能被实例化。

 

这样做,比起在类里面留一个未实现的空方法来说,要安全的得多,会防止其他人误用,导致难以发现问题的bug。使用抽象类,会让使用该类的人明确知道,需要由自己来根据实际情况来实现这个类中的部分方法。

 

抽象类里面并非一定需要抽象方法,当你定义了一个类,但是又不想让它被直接实例化的时候,可以使用抽象类的方法来实现。反之,如果类中有抽象方法,则一定要将类定义为抽象的类。


在以下任一条件成立时,类必须定义成抽象类:
类中有至少一个抽象方法;
类继承了父类中的抽象方法,但是至少有一个抽象方法没有实现;
类实现了某个接口,但没有全部实现接口中的方法。

 

下面我们来看一个抽象类的例子。

 

首先我们定义了一个用来表示各种图形的类Shapes,这个类有两个抽象方法,一个用于返回图形的形状,一个用于返回图形的周长:

public abstract class Shapes {
 private String color;

 /**
  * 得出周长
  */
 public abstract double perimeter();

 /**
  * 得到形状
  */
 public abstract String getType();

 // 用于设置/获取“颜色”属性的方法
 public String getColor() {
  return color;
 }

 public void setColor(String theColor) {
  color = theColor;
 }
}


注意,这是一个抽象类,不能直接实例化它。


 

public class ShapeTriangle extends Shapes {
 protected double a, b, c;

 public ShapeTriangle() {
  setSides(0.0, 0.0, 0.0);
 }

 public ShapeTriangle(double i, double j, double h) {
  setSides(i, j, h);
 }

 public void setSides(double x, double y, double z) {
  this.a = x;
  this.b = y;
  this.c = z;
 }

 /**
  * 实现父类中的抽象方法
  */
 public double perimeter() {
  return a + b + c;
 }

 public String getType() {
  return "三角形";
 }

 public static void main(String args[]) {
  ShapeTriangle st = new ShapeTriangle(3.0, 4.0, 5.0);
  System.out.println("形状:" + st.getType());
  System.out.println("周长:" + st.perimeter());
 }
}


这是一个表示三角形的类,这个类继承了父类Shapes,然后,在父类的基础上新增了一些属性以及相应的方法。

 

根据三角形的实际情况,实现了父类中的两个抽象方法:getType()返回一个“三角形”的字符串,而且根据三角形周长的算法实现了父类中的计算周长的方法:perimeter。

 

而对于圆形,可能需要这样来实现它的两个抽象方法:

public class ShapeCircle extends Shapes {
 private double r;

 public ShapeCircle() {
  setRadius(0.0);
 }

 public ShapeCircle(double ra) {
  setRadius(ra);
 }

 public void setRadius(double rad) {
  this.r = rad;
 }

 /**
  * 实现父类的抽象方法
  */
 public double perimeter() {
  return 2.0 * Math.PI * r;
 }

 public String getType() {
  return "圆";
 }

 public static void main(String args[]) {
  ShapeCircle sc = new ShapeCircle(5);
  System.out.println("形状:" + sc.getType());
  System.out.println("周长:" + sc.perimeter());
 }
}


在这个类ShapeCircle中,也继承了类Shapes,但它对抽象方法perimeter()的实现方式是和ShapeTriangle不一样的。
注意:
  区分没有实现的方法和空方法体的方法的区别,下面这个方法是没有实现的方法:public int methodA();
  而下面这个方法是空方法体的方法:public int methodB(){}
  没有实现的方法可以用abstract来修饰,而空方法体方法却不能使用abstract来修饰,它已经实现了方法,只是在这个方法中什么动作也没有做而已

java判断题及答案关于Java基本数据类型的数据在内存中占据的字节数,哪种说法是正确的? A. byte(1个字节) B. short(2个字节) C. char(1个字节) D. float(4个字节) E. long(4个字节) F. double(4个字节) 分数 2 作者 周雪芹 单位 山东理工大学 Java中,以下表达式说法正确的是:( )。 A. int a=20;a++; a的值是21。 B. int a=20;int b=a++; b的值是21。 C. int a=20;int b=++a; b的值是21。 D. int a=3++; a的值是3。 分数 2 作者 马俊 单位 兰州大学 以下哪些字符串可以用作Java程序中的标识符? A. _number B. 3number C. #number D. $number 分数 2 作者 马俊 单位 兰州大学 Java语言中,下列表达式中哪些条件表达式的结果是真? A. (36+6)/7>=5 B. !false&&!(4%2-4==4)&&7*4-5>20 C. !(4>2&&4<6) D. !(45>23&&72/7==0) 分数 1 作者 吕行军 单位 河北农业大学 Java中,以下哪些是引用数据类型 A. 数组 B. int C. 接口 D. boolean E. 枚举 F. 类 分数 2 作者 孔德桢 单位 浙大城市学院 对于如下的代码片段,执行b.func()之后,值为27的表达式有 class A { int i, j; public void fun() { i++; j++; } } class B extends A { static int j; public void func() { int j = 2; for (i = 0; i < 10; i++) { j += 3; fun(); } if (j < 30) { super.j = j; } else { /**/ B.j = j; } } } class Main { public static void main(String[] args) throws Exception { B b = new B(); A a = b; b.func(); } } A. b.i + b.j B. ((A)b).i + ((A)b).j; C. a.i + a.j D. b.i + a.j 分数 2 作者 孔德桢 单位 浙大城市学院 下列有关匿名对象的说法,正确的有 A. 匿名对象只能继承一个类或实现一个接口 B. 匿名对象可以有构造函数 C. 匿名对象不能被重复构造 D. 每个匿名对象都具有独一无二的类型 分数 2 作者 周雪芹 单位 山东理工大学 关于super关键字,以下说法哪些是正确的?( ) A. super关键字可以调用父类的构造方法 B. super关键字可以调用父类的普通方法 C. super关键字与this不能同时存在于同一个构造方法中 D. super关键字与this可以同时存在于同一个构造方法中 分数 2 作者 郑如滨 单位 集美大学 接口和抽象类描述正确的有 A. 抽象类没有构造函数 B. 接口没有构造函数 C. 抽象类不允许多继承 D. 接口中的方法可以有方法体 分数 2 作者 周雪芹 单位 山东理工大学 关于Java中的抽象类,哪些说法是正确的?( ) A. 抽象类中可以含有抽象的方法,也可以含有非抽象的方法。 B. 含有抽象方法的类一定是抽象类。 C. 抽象类是不能用new操作来生成对象的,只能被子类继承。 D. 抽象类的子类如果实现了父类的所有抽象方法,它就是一个普通的类。如果没有实现抽象方法,则它还是抽象类。 分数 2 作者 周雪芹 单位 山东理工大学 接口中定义常量(变量)时,默认含有哪些修饰符?( ) A. public B. static C. final D. void 分数 2 作者 马俊 单位 兰州大学 Java语言中关于接口和抽象类描述正确的有? A. 抽象类没有构造函数 B. 接口没有构造函数 C. 抽象类不允许多继承 D. 接口中的方法可以有方法体 分数 2 作者 周雪芹 单位 山东理工大学 面向对象程序设计的三大特征是:( )。 A. 封装 B. 继承 C. 多态 D. 隐藏 分数 2 作者 周雪芹 单位 山东理工大学 下面的语句哪个能够创建一个String类对象? A. String str1="mooc"; B. String str2=new String(); C. String str3=new String("sdut"); D. String str4="abc"+"123"; 分数 2 作者 马俊 单位 兰州大学 Java语言中,下列有关使用String类的语句中哪几项是正确的? A. String s[]={"Zero","One","Two","Three","Four"}; B. String s[5]=new String[]{"Zero","One","Two","Three","Four"}; C. String s[]=new String[]{"Zero","One","Two","Three","Four"}; D. String s[]=new String(){"Zero","One","Two","Three","Four"}; 分数 2 作者 周雪芹 单位 山东理工大学 Java虚拟机为了提升性能,减少内存的开销,避免字符串对象的重复创建,开辟了一块特殊的内存空间——字符串池,它用来存放( )条件的字符串对象。 A. 字符串常量 B. 有限个字符串常量进行加运算的结果 C. 字符串对象调用intern方法返回的字符串对象 D. 其他对象调用toString方法返回的结果 分数 2 作者 周雪芹 单位 山东理工大学 String类对象的创建方式包括:( )。 A. String str1="imooc"; B. String str2=new String(); C. String str3=new String("imooc"); D. String str4="abc"+"123"; E. String str5=str1.toUpperCase(); 分数 2 作者 周雪芹 单位 山东理工大学 现在字节数组如下,如何得到每个字节所对应的字符? byte[] bytes= {97,98,99,100,65,66,67,68,69}; //打印输出:abcdABCDE A. System.out.println(new String(bytes)); B. System.out.println(new String(bytes,0,bytes.length)); C. System.out.println(bytes.toString()); D. System.out.println(Arrays.toString(bytes)); 分数 2 作者 周雪芹 单位 山东理工大学 JAVA中如何将基本数据类型的数据转换成字符串? 以整型数据为例,现有一个整数: int i=100; 下面哪种方式能够得到字符串“123”? A. String str1=i+""; B. String str2=String.valueOf(i); C. String str3=Integer.toString(i); D. String str4=String.format("%d", i); 分数 2 作者 周雪芹 单位 山东理工大学 对String类型的字符串String str="123";,调用str对象的( )方法,得到int类型的十进制整型数值 123? A. int i1=Integer.parseInt(str); B. int i2=new Integer(str); C. int i3=Integer.parseInt(str, 10); D. int i4=str.toInteger(); 分数 2 作者 周雪芹 单位 山东理工大学 下列哪些方法属于java.lang.Math类( )? A. random() B. sqrt() C. abs() D. pow() E. exp() F. ceil() G. floor() 分数 2 作者 马俊 单位 兰州大学 Java语言中下列方法属于java.lang.Math类的有哪些? A. random() B. abs() C. sqrt() D. sin() 分数 2 作者 周雪芹 单位 山东理工大学 迭代器接口(Iterator)所定义的方法有( )。 A. hasNext() B. next() C. remove() D. nextElement() 分数 2 作者 周雪芹 单位 山东理工大学 List类型的对象list可以以几种形式输出其内容( )? A. System.out.println(list.toString()); B. for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } C. for (Object obj : list) { System.out.println(obj); } D. Iterator it = list.iterator(); while (it.hasNext()) { System.out.println(it.next()); } 分数 2 作者 周雪芹 单位 山东理工大学 对于Set类型的对象set,可以以几种形式输出其内容( )? A. System.out.println(set.toString()); B. for (int i = 0; i < set.size(); i++) { System.out.println(set.get(i)); } C. for (Object obj : set) { System.out.println(obj); } D. Iterator it = set.iterator(); while (it.hasNext()) { System.out.println(it.next()); } 分数 2 作者 周雪芹 单位 山东理工大学 在JAVA集合框架中,下面哪些类型所表示的对象是有序的?( ) A. HashMap B. HashSet C. TreeMap D. LinkedList E. LinkedHashMap 分数 2 作者 周雪芹 单位 山东理工大学 Java中的数组在声明并分配了空间之后,关于其数组元素,哪些说法是正确的?( ) A. 数组元素未人为赋值之前不能进行访问 B. 数组元素都有默认值 C. 基本数据类型中数值类型数组,元素默认值为0;布尔类型数组,元素默认值为false。 D. 引用数据类型的数组,其数组元素默认值为null
最新发布
12-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值