抽象类+接口+内部类作业题
一、 选择题
1. |
Person类和Test类的代码如下所示,则代码中的错误语句是( B )。(选择一项) |
|
|
public class Person { public String name; public Person(String name) { this.name = name; } } public class Test { public static void main(String[] args) { final Person person = new Person("欧欧"); person.name = "美美"; person = new Person("亚亚"); } } |
|
|
|
|
|
A. |
final Person person = new Person("欧欧"); |
|
B. |
person.name = "美美"; |
|
C. |
person = new Person("亚亚"); |
|
D. |
没有错误 |
2. |
如下Java代码运行的结果是( B )。(选择一项) |
|
|
public class Test { final int age; public Test(){ age=10; } public static void main(String[ ] args) { System.out.println(new Test().age); } } |
|
|
|
|
|
A |
输出:0 |
|
B. |
输出:10 |
|
C. |
输出:null |
|
D. |
运行时出现异常 |
3. |
以下代码中错误的语句是( B )。(选择一项) |
|
|
public class Something{ public static void main(String[] args){ final Other o=new Other(); new Something().addOne(o);//1 } public void addOne( Other o){ o.i++;//2 o = new Other();//3 } } class Other{ public int i; } |
|
|
|
|
|
A |
1 |
|
B. |
2 |
|
C. |
3 |
|
D. |
没有错误 |
4. |
下列选项中,关于Java的抽象类和抽象方法说法正确的是(A C )。(选择二项) |
|
|
|
|
|
A |
抽象类中可以含有0个或多个抽象方法 |
|
B. |
抽象类中不可以有构造方法 |
|
C. |
一个类中若有抽象方法,则这个类必为抽象类 |
|
D. |
子类必须重写父类所有的抽象方法 |
5. |
在Java中关于abstract关键字,以下说法正确的是( AB )。(选择两项) |
|
|
|
|
|
A |
abstract类中可以没有抽象方法 |
|
B. |
abstract类的子类也可以是抽象类 |
|
C. |
abstract方法可以有方法体 |
|
D. |
abstract类可以创建对象 |
6. |
以下选项可替换题目中//add code here而不产生编译错误的是( BD )。(选择二项) |
|
|
public abstract class MyClass{ public int constInt=5; //add code here public void method( ){ } } |
|
|
|
|
|
A |
public abstract void method(int a); |
|
B. |
constInt =constInt+5; |
|
C. |
public int method( ); |
|
D. |
public abstract void anotherMethod( ); |
7. |
在Java接口中,下列选项中属于有效的方法声明是( AC )。(选择二项) |
|
|
|
|
|
A |
public void aMethod( ); |
|
B. |
final void aMethod( ); |
|
C. |
void aMethod(){ } |
|
D. |
private void aMethod( ); |
8. |
以下选项中关于匿名内部类的说法正确的是( AC )。(选择二项) |
|
|
|
|
|
A. |
匿名内部类可以实现多个接口,或者继承一个父类 |
|
B. |
匿名内部类不能是抽象类,必须实现它的抽象父类或者接口里包含的所有抽象方法 |
|
C. |
匿名内部类没有类名,所以匿名内部类不能定义构造方法 |
|
D. |
匿名内部类可以直接访问外部类的所有局部变量 |
二、 判断题(共20个题目,总计10分)
- 声明为final的类不能是超类。( T )
- 使用final修饰的变量将变成常量,其中不能再被改变;使用final修饰的方法将无法被子类重载;使用final修饰的类将无法再被其他类继承。( T )
- 抽象方法不能含有方法体,并且必须定义在抽象类中。( T )
- 抽象类是指在class前加使用abstract关键字修饰,且可以存在抽象方法和普通方法的类。( T )
- 接口中只有常量,没有变量;只有抽象方法,并且全部都是public方法。( T )
- 抽象类和接口都不能实例化,都没有构造方法。( T )
- 接口并不要求实现类和接口在概念本质上一致的,仅仅是实现了接口定义的约定或者能力而已。接口定义了“做什么”,而实现类负责完成“怎么做”,体现了功能(规范)和实现分离的原则。( T )
- 内部类作为外部类成员,权限修饰符和其他成员一样,可声明为private、默认、protected或public。( T )
- 匿名内部类适合创建那种只需要使用一次的类,它可以实现一个或多个接口,或者继承一个父类。( T )
- 对于物理连接,比如数据库连接、输入流输出流、Socket连接等,垃圾回收机制无能为力,必须手动关闭才可以。( T )
- 垃圾回收机制回收任何对象之前,总会先调用它gc( )方法,该方法是Object类提供的方法。不要主动调用某个对象的该方法,应该交给垃圾回收机制调用。( T )
三、 简答题
- final和abstract关键字的作用。
都是状态修饰符
final 是最终的 不可改变
abstract 是抽象的 不可具体化
- 接口和抽象类的联系和区别。
* A:成员区别
* 抽象类(和普通类相比,只是可以多定义了抽象方法而已)
* 成员变量:可以变量,也可以常量
* 构造方法:有
* 成员方法:可以抽象,也可以非抽象
* 接口:
* 成员变量:只可以常量 public static final
* 构造方法:无
* 成员方法:只可以抽象 public abstract
* B:关系区别
* 类与类
* 继承,单继承,多层继承
* 类与接口:
* 实现,单实现,多实现
* 接口与接口多继承
* 继承,单继承,
* C:设计理念区别
* 抽象类 被继承体现的是:"is a"的关系.抽象类中定义的是该继承体系的**共性功能**
* 接口 被实现体现的是:"like a "的关系.接口中定义的是该继承体系的**扩展功能**.
- 内部类的类型及其特点。
成员内部类和匿名内部类
* a:内部类可以直接访问外部类的成员,包括私有。
* b:外部类要访问内部类的成员,必须创建对象。
* 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
- 介绍Java垃圾回收机制。
四、 编码题
- 编写程序描述兔子和青蛙
需求说明:使用面向对象的思想,设计自定义类描述兔子和青蛙。
实现思路及关键代码
1) 分析兔子和青蛙的共性
2) 根据共性,定义抽象的动物类
属性:名字、颜色、类别(哺乳类、非哺乳类)
方法:吃饭,发出叫声
3) 根据青蛙会游泳 抽象游泳的接口
方法:游泳
4) 定义兔子继承动物类,青蛙继承动物同时实现游泳接口
程序运行结果如图所示。
class Workhzx1 {
public static void main(String[] args) {
Animal r = new Rabbit("美人鱼","黑色","哺乳类");
r.sound();
r.eat();
System.out.println("-----------------");
Animal f = new Frog("大兵","绿色","非哺乳类");
f.sound();
f.eat();
Swiming frogSwim = (Swiming)f;
frogSwim.swim();
}
}
/*
- 编写程序描述兔子和青蛙
需求说明:使用面向对象的思想,设计自定义类描述兔子和青蛙。
实现思路及关键代码
1) 分析兔子和青蛙的共性
2) 根据共性,定义抽象的动物类
属性:名字、颜色、类别(哺乳类、非哺乳类)
方法:吃饭,发出叫声
3) 根据青蛙会游泳 抽象游泳的接口
方法:游泳
4) 定义兔子继承动物类,青蛙继承动物同时实现游泳接口
程序运行结果如图所示。
*/
abstract class Animal {
private String name;
private String color;
private String type;
public Animal(){}
public Animal(String name,String color,String type){
this.name = name;
this.color = color;
this.type = type;
}
public void setName (String name){
this.name = name;
}
public String getName(){
return name;
}
public void setColor (String color){
this.color = color;
}
public String getColor(){
return color;
}
public void setType (String type){
this.type = type;
}
public String getType(){
return type;
}
public abstract void eat();
public abstract void sound();
}
interface Swiming {
public abstract void swim();
}
class Rabbit extends Animal {
public Rabbit(){}
public Rabbit(String name,String color,String type){
super (name,color,type);
}
public void sound(){
System.out.println("那只"+super.getColor()+"的,名叫"+super.getName()+"的兔子正在唧唧的叫");
}
public void eat (){
System.out.println("兔子是"+super.getType()+",爱吃胡萝卜");
}
}
class Frog extends Animal implements Swiming {
public Frog(){}
public Frog(String name,String color,String type){
super (name,color,type);
}
public void sound(){
System.out.println("那只"+super.getColor()+"的,名叫"+super.getName()+"的青蛙正在叽叽的叫");
}
public void eat (){
System.out.println("兔子是"+super.getType()+",爱吃昆虫");
}
public void swim(){
System.out.println("虽然不是鱼,但青蛙也是咏叹高手");
}
}
- 编写程序描述影视歌三栖艺人
需求说明:请使用面向对象的思想,设计自定义类,描述影视歌三梄艺人。
实现思路及关键代码
1) 分析影视歌三栖艺人的特性
a) 可以演电影
b) 可以演电视剧
c) 可以唱歌
2) 定义多个接口描述特性
a) 演电影的接口-----方法:演电影
b) 演电视剧的接口-----方法:演电视剧
c) 唱歌的接口-----方法:唱歌
3) 定义艺人类实现多个接口
程序运行结果如图2所示。
public class Workhzx2 {
public static void main(String[] args) {
Star a = new Star("马素素");
a.introduce();
a.actMovie();
a.actTv();
a.singSong();
}
}
interface Movie {
public void actMovie();
}
interface Tv {
public void actTv();
}
interface Sing {
public void singSong();
}
class Star implements Movie,Tv,Sing {
private String name;
public Star(){}
public Star(String name){
this.name = name;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void actMovie(){
System.out.println("我能演电影");
}
public void actTv(){
System.out.println("我能演电视剧");
}
public void singSong(){
System.out.println("我会唱歌");
}
public void introduce(){
System.out.println("大家好,我是:"+this.name);
}
}
五、 可选题
- 实现不同符合PCI规范的适配器
需求说明:PCI是一种规范,所有实现了该规范的适配器,必如显卡、声卡、网卡都可以安装到PCI插槽上并工作。模拟实现该功能。
实现思路及关键代码
1) 定义PCI接口,具有传送数据send()方法
2) 定义显卡VideaCard类,实现该接口
3) 定义声卡AudioCard类,实现PCI接口
4) 定义网卡NetCard类,实现PCI接口
5) 定义测试类,让显卡、声卡、网卡发送数据
public class Workhzx3 {
public static void main(String[] args) {
PCI date1 = new VideaCard();
date1.send();
PCI date2 = new AudioCard();
date2.send();
PCI date3 = new NetCard();
date3.send();
}
}
interface PCI {
public void send();
}
class VideaCard implements PCI {
public void send(){
System.out.println("让显卡发送数据");
}
}
class AudioCard implements PCI{
public void send(){
System.out.println("让声卡发送数据");
}
}
class NetCard implements PCI {
public void send(){
System.out.println("让网卡发送数据");
}
}
- 实现不同引用类型对象的大小比较
需求说明:学生类,新闻类,商品类虽然是完全不同的类,但是都具有比较的能力,比如可以比较两个学生的大小,但需要指定比较的依据是学号、姓名还是成绩等。
实现思路及关键代码:
将比较的能力定义为接口,让学生、新闻、商品类都实现该接口。
1) 定义接口Comparable,其中包含唯一的方法int compareTo(Object obj);返回值>0,表示大于,返回值=0,表示等于,返回值<0,表示小于。
2) 定义学生类,包括学号、姓名、年龄和分数,实现Comparable接口,按照分数倒序排列;
3) 定义新闻类,包括编号(int类型)、标题、内容和点击数,实现Comparable接口,按照编号正序排列;
4) 定义测试类,分别创建两个学生对象、新闻对象,进行比较并输出结果。
class Workhzx4 {
public static void main(String[] args) {
//Student s1 = new Student(34,"分数",23,43);
Student s1 = new Student(3838,"天才",99,90);
Student s2 = new Student(8,"弱智",666,100);
if (s1.compareTo(s2)>0) {
System.out.println(s2.print());
System.out.println(s1.print());
}else {
System.out.println(s1.print());
System.out.println(s2.print());
}
News n1 = new News(1001,"天上掉钱了","北京的上空洒下来了好几个亿的人民币",99999);
News n2 = new News(1041,"北京下大雨","室内的大雨持续了好几个月",777777);
if (n1.compareTo(n2)>0) {
System.out.println(n2.print());
System.out.println(n1.print());
}else {
System.out.println(n1.print());
System.out.println(n2.print());
}
}
}
interface Comparable {
public int compareTo (Object obj);
}
class Student implements Comparable {
private int num;
private String name;
private int age;
private int mark;
public Student (){}
public Student (int num,String name,int age,int mark){
this.num = num;
this.name = name;
this.age = age;
this.mark = mark;
}
/*public void setNum(int num){
this.num = num;
}
public int getNum(){
return num;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void setMark(int mark){
this.mark = mark;
}
public int getMark(){
return mark;
}*/
public int compareTo(Object obj){
Student other = (Student)obj;
if (this.mark>other.mark) {
return -1;
}else if (this.mark<other.mark) {
return 1;
}else{
return 0;
}
}
public String print(){
return "学生的学号是:"+num+",学生的姓名是:"+name+",学生的年龄是:"+age+",学生的分数是:"+mark+"分";
}
}
class News implements Comparable {
private int nid;
private String title;
private String contents;
private int type;
public News (){}
public News (int nid,String title,String contents,int type){
this.nid = nid;
this.title = title;
this.contents = contents;
this.type = type;
}
public int compareTo(Object obj){
News other = (News)obj;
return (this.nid - other.nid);
}
public String print(){
return"新闻的编号是:"+nid+",新闻的标题是:"+title+",新闻的内容是:"+contents+",新闻的点击数是:"+type+"次";
}
}