Java抽象类接口、内部类题库
一、 选择题
1. Person类和Test类的代码如下所示,则代码中的错误语句是( C )。(选择一项)
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. 以下代码中错误的语句是( D )。(选择一项)
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的抽象类和抽象方法说法正确的是( AC )。(选择二项)
A 抽象类中可以含有0个或多个抽象方法
B. 抽象类中不可以有构造方法
C. 一个类中若有抽象方法,则这个类必为抽象类
D. 子类必须重写父类所有的抽象方法
5. 在Java中关于abstract关键字,以下说法正确的是( AB )。(选择两项)
A abstract类中可以没有抽象方法
B. abstract类的子类也可以是抽象类
C. abstract方法可以有方法体
D. abstract类可以创建对象
6. 以下选项可替换题目中//add code here而不产生编译错误的是( AD )。(选择二项)
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. 以下选项中关于匿名内部类的说法正确的是( BC )。(选择二项)
A. 匿名内部类可以实现多个接口,或者继承一个父类
B. 匿名内部类不能是抽象类,必须实现它的抽象父类或者接口里包含的所有抽象方法
C. 匿名内部类没有类名,所以匿名内部类不能定义构造方法
D. 匿名内部类可以直接访问外部类的所有局部变量
二、 判断题(共20个题目,总计10分)
1. 声明为final的类不能是超类。( T )
2. 使用final修饰的变量将变成常量,其中不能再被改变;使用final修饰的方法将无法被子类重载;使用final修饰的类将无法再被其他类继承。( T )
3. 抽象方法不能含有方法体,并且必须定义在抽象类中。( F )
4. 抽象类是指在class前加使用abstract关键字修饰,且可以存在抽象方法和普通方法的类。( T )
5. 接口中只有常量,没有变量;只有抽象方法,并且全部都是public方法。( T )
6. 抽象类和接口都不能实例化,都没有构造方法。( F )
7. 接口并不要求实现类和接口在概念本质上一致的,仅仅是实现了接口定义的约定或者能力而已。接口定义了“做什么”,而实现类负责完成“怎么做”,体现了功能(规范)和实现分离的原则。( T )
8. 内部类作为外部类成员,权限修饰符和其他成员一样,可声明为private、默认、protected或public。( T )
9. 匿名内部类适合创建那种只需要使用一次的类,它可以实现一个或多个接口,或者继承一个父类。( F )
10. 对于物理连接,比如数据库连接、输入流输出流、Socket连接等,垃圾回收机制无能为力,必须手动关闭才可以。( T )
11. 垃圾回收机制回收任何对象之前,总会先调用它gc( )方法,该方法是Object类提供的方法。不要主动调用某个对象的该方法,应该交给垃圾回收机制调用。( F )
三、 简答题
1. final和abstract关键字的作用。
2. 接口和抽象类的联系和区别。
3. 内部类的类型及其特点。
四、 编码题
1.编写程序描述兔子和青蛙
需求说明:使用面向对象的思想,设计自定义类描述兔子和青蛙。
实现思路及关键代码
1) 分析兔子和青蛙的共性
2) 根据共性,定义抽象的动物类
属性:名字、颜色、类别(哺乳类、非哺乳类)
方法:吃饭,发出叫声
3) 根据青蛙会游泳 抽象游泳的接口
方法:游泳
4) 定义兔子继承动物类,青蛙继承动物同时实现游泳接口
程序运行结果如图所示。
1 /**
2 *
3 * 动物类
4 *
5 * @author Administrator
6 *
7 */
8 public abstract class Animal
9 {
10 private String name;//名字
11 private String color;//颜色
12 private String type;//类别(哺乳类、非哺乳类)
13 public Animal()
14 {
15 super();
16 }
17 public Animal(String name, String color, String type)
18 {
19 super();
20 this.name = name;
21 this.color = color;
22 this.type = type;
23 }
24 public String getName()
25 {
26 return name;
27 }
28 public void setName(String name)
29 {
30 this.name = name;
31 }
32 public String getColor()
33 {
34 return color;
35 }
36 public void setColor(String color)
37 {
38 this.color = color;
39 }
40 public String getType()
41 {
42 return type;
43 }
44 public void setType(String type)
45 {
46 this.type = type;
47 }
48 /**
49 *
50 * 发出叫声
51 *
52 */
53 public abstract void shout();
54 /**
55 *
56 * 吃饭
57 *
58 */
59 public abstract void eat();
60 }
61 /**
62 *
63 * 游泳接口
64 *
65 * @author Administrator
66 *
67 */
68 public interface Swimmable
69 {
70 /**
71 *
72 * 游泳
73 *
74 */
75 public void swim();
76 }
77 public class Frog extends Animal implements Swimmable
78 {
79 public Frog()
80 {
81 super();
82 }
83 public Frog(String name, String color, String type)
84 {
85 super(name, color, type);
86 }
87 @Override
88 public void shout()
89 {
90 System.out.println("那只" + super.getColor()
91 + "的,名字叫" + super.getName() + "的青蛙正在呱呱的叫");
92 }
93 @Override
94 public void eat()
95 {
96 System.out.println("青蛙是" + super.getType() + ",爱吃昆虫");
97 }
98 @Override
99 public void swim()
100 {
101 System.out.println("虽然不是鱼,但是青蛙也是游泳高手");
102 }
103 }
104 public class Rabbit extends Animal
105 {
106 public Rabbit()
107 {
108 super();
109 }
110 public Rabbit(String name, String color, String type)
111 {
112 super(name, color, type);
113 }
114 @Override
115 public void shout()
116 {
117 System.out.println("那只" + super.getColor()
118 + "的,名字叫" + super.getName() + "的兔子正在叽叽的叫");
119 }
120 @Override
121 public void eat()
122 {
123 System.out.println("兔子是" + super.getType() + ",爱吃胡萝卜");
124 }
125 }
126 public class Test
127 {
128 public static void main(String[] args)
129 {
130 Animal rabbit = new Rabbit("美人", "黑色", "哺乳类");
131 rabbit.shout();
132 rabbit.eat();
133 System.out.println("====================");
134 Animal frog = new Frog("大兵", "绿色", "非哺乳类");
135 frog.shout();
136 frog.eat();
137 Swimmable swimer = (Swimmable) frog;
138 swimer.swim();
139 }
140 }
2.编写程序描述影视歌三栖艺人
需求说明:请使用面向对象的思想,设计自定义类,描述影视歌三梄艺人。
实现思路及关键代码
1) 分析影视歌三栖艺人的特性
a) 可以演电影
b) 可以演电视剧
c) 可以唱歌
2) 定义多个接口描述特性
a) 演电影的接口-----方法:演电影
b) 演电视剧的接口-----方法:演电视剧
c) 唱歌的接口-----方法:唱歌
3) 定义艺人类实现多个接口
程序运行结果如图2所示。
1 /**
2 *
3 * 可演电影接口
4 *
5 * @author Administrator
6 *
7 */
8 public interface Filmable
9 {
10 /**
11 *
12 * 演电影
13 *
14 */
15 public void actFilm();
16 }
17 /**
18 *
19 * 会唱歌接口
20 *
21 * @author Administrator
22 *
23 */
24 public interface Singable
25 {
26 /**
27 *
28 * 唱歌
29 *
30 */
31 public void sing();
32 }
33 /**
34 *
35 * 会演电视剧接口
36 *
37 * @author Administrator
38 *
39 */
40 public interface TVable
41 {
42 /**
43 *
44 * 演电视剧
45 *
46 */
47 public void showTV();
48 }
49 public class Star implements Filmable, TVable, Singable
50 {
51 private String name;//姓名
52 public Star()
53 {
54 super();
55 }
56 public Star(String name)
57 {
58 super();
59 this.name = name;
60 }
61 public String getName()
62 {
63 return name;
64 }
65 public void setName(String name)
66 {
67 this.name = name;
68 }
69 @Override
70 public void sing()
71 {
72 System.out.println("我会唱歌");
73 }
74 @Override
75 public void showTV()
76 {
77 System.out.println("我能演电视剧");
78 }
79 @Override
80 public void actFilm()
81 {
82 System.out.println("我能演电影");
83 }
84 public void introduce()
85 {
86 System.out.println("大家好,我是" + name);
87 }
88 }
89 public class Test
90 {
91 public static void main(String[] args)
92 {
93 Star star = new Star("马素素");
94 star.introduce();
95 star.actFilm();
96 star.showTV();
97 star.sing();
98 }
99 }
3.写一个方法对任意引用数据类型数组进行排序。具体要求如下:
1) 方法声明为public void sortArr(Object arr[]){ }
2) 方法中首先输出排序前数组内容,然后进行排序,最后输出排序后数组内容。
3) 可以是冒泡排序或其他算法实现,不直接调用Java提供的方法实现排序。
思路:任意类实现Comparable接口来实现该引用数据类型的元素排序,在sort()方法中将Object强转成Comparable实现两个对象的比较。
1 public void sort(Object[] arr)
2 {
3 //输出排序前数组
4 for (int i = 0; i < arr.length; i++)
5 {
6 System.out.println(arr[i]);
7 }
8 //大循环,一共n个元素,达到最终有序,至多n-1趟比较
9 Object temp;
10 for (int i = 0; i < arr.length - 1; i++)
11 {
12 //定义一个符号量
13 boolean flag = true;//没有交换,有序
14 //小循环
15 for (int j = 0; j < arr.length - 1 - i; j++)
16 {
17 //如果前一个大于后一个
18 Comparables c1 = (Comparables) arr[j];
19 Comparables c2 = (Comparables) arr[j + 1];
20 if (c1.compareTo(c2) > 0)
21 {
22 //交换
23 temp = arr[j];
24 arr[j] = arr[j + 1];
25 arr[j + 1] = temp;
26 //修改符号量
27 flag = false;//交换过,无序
28 }
29 }
30 //判断经过此趟循环后是否已经有序
31 if (flag)
32 {
33 break;//退出外层循环,省略后续趟循环
34 }
35 }
36 //输出排序后数组
37 for (int i = 0; i < arr.length; i++)
38 {
39 System.out.println(arr[i]);
40 }
41 }
五、 可选题
1.实现不同符合PCI规范的适配器
需求说明:PCI是一种规范,所有实现了该规范的适配器,必如显卡、声卡、网卡都可以安装到PCI插槽上并工作。模拟实现该功能。
实现思路及关键代码
1) 定义PCI接口,具有传送数据send()方法
2) 定义显卡VideaCard类,实现该接口
3) 定义声卡AudioCard类,实现PCI接口
4) 定义网卡NetCard类,实现PCI接口
5) 定义测试类,让显卡、声卡、网卡发送数据
1 class a
2 {
3 /**
4 *
5 * PCI接口
6 *
7 * @author Administrator
8 *
9 *
10 *
11 */
12 public interface PCI
13 {
14 /**
15 *
16 * 传输数据
17 *
18 */
19 public void send();
20 }
21 public class VideoCard implements PCI
22 {
23 @Override
24 public void send()
25 {
26 System.out.println("使用PCI接口传输视频数据");
27 }
28 }
29 public class SoundCard implements PCI
30 {
31 @Override
32 public void send()
33 {
34 System.out.println("使用PCI接口传输声音数据");
35 }
36 }
37 public class NetCard implements PCI
38 {
39 @Override
40 public void send()
41 {
42 System.out.println("使用PCI接口传输网络数据");
43 }
44 }
45 public class Test
46 {
47 public static void main(String[] args)
48 {
49 PCI p1 = new VideoCard();
50 p1.send();
51 PCI p2 = new SoundCard();
52 p2.send();
53 PCI p3 = new NetCard();
54 p3.send();
55 }
56 }
57 }
2.实现不同引用类型对象的大小比较
需求说明:学生类,新闻类,商品类虽然是完全不同的类,但是都具有比较的能力,比如可以比较两个学生的大小,但需要指定比较的依据是学号、姓名还是成绩等。
实现思路及关键代码:
将比较的能力定义为接口,让学生、新闻、商品类都实现该接口。
1) 定义接口Comparable,其中包含唯一的方法int compareTo(Object obj);返回值>0,表示大于,返回值=0,表示等于,返回值<0,表示小于。
2) 定义学生类,包括学号、姓名、年龄和分数,实现Comparable接口,按照分数倒序排列;
3) 定义新闻类,包括编号(int类型)、标题、内容和点击数,实现Comparable接口,按照编号正序排列;
4) 定义测试类,分别创建两个学生对象、新闻对象,进行比较并输出结果。
1 /**
2 *
3 * 比较接口
4 *
5 * @author Administrator
6 *
7 *
8 *
9 */
10 public interface Comparable
11 {
12 /**
13 *
14 * 比较
15 *
16 * @param obj 另外一个对象
17 *
18 * @return 比较的结果 >0 大于 =0 等于 <0 小于
19 *
20 */
21 public int compareTo(Object obj);
22 }
23 public class News implements Comparable
24 {
25 private int nid;//编号
26 private String title; //标题
27 private String contents;//内容
28 private String type;//新闻类别
29 public News()
30 {
31 super();
32 }
33 public News(int nid, String title, String contents, String type)
34 {
35 super();
36 this.nid = nid;
37 this.title = title;
38 this.contents = contents;
39 this.type = type;
40 }
41 /**
42 *
43 * 按照新闻编号正序排列
44 *
45 */
46 public int compareTo(Object obj)
47 {
48 News other = (News) obj;
49 return this.nid - other.nid;
50 }
51 @Override
52 public String toString()
53 {
54 return "News [nid=" + nid + ", title=" + title + ", contents="
55 + contents + ", type=" + type + "]";
56 }
57 }
58 public class Student implements Comparable
59 {
60 private int id;
61 private String name;
62 private int age;
63 private double score;
64 public Student()
65 {
66 super();
67 }
68 public Student(int id, String name, int age, double score)
69 {
70 super();
71 this.id = id;
72 this.name = name;
73 this.age = age;
74 this.score = score;
75 }
76 /**
77 *
78 * 按照学生成绩降序排序
79 *
80 */
81 public int compareTo(Object obj)
82 {
83 Student other = (Student) obj;
84 if (this.score > other.score)
85 {
86 return -1;
87 } else if (this.score < other.score)
88 {
89 return 1;
90 } else
91 {
92 return 0;
93 }
94 }
95 @Override
96 public String toString()
97 {
98 return "Student [id=" + id + ", name=" + name + ", age=" + age
99 + ", score=" + score + "]";
100 }
101 }
102 public class Test
103 {
104 public static void main(String[] args)
105 {
106 //
107 Student stu1 = new Student(11, "小红", 18, 97d);
108 Student stu2 = new Student(12, "小东", 20, 98d);
109 if (stu1.compareTo(stu2) > 0)
110 {
111 System.out.println(stu2);
112 System.out.println(stu1);
113 } else
114 {
115 System.out.println(stu1);
116 System.out.println(stu2);
117 }
118 //
119 News news1 = new News(33, "恒大亚冠", "恒大亚冠小组被淘汰", "体育");
120 News news2 = new News(44, "上海尚学堂", "请原谅我的姗姗来迟", "IT");
121 if (news1.compareTo(news2) > 0)
122 {
123 System.out.println(news2);
124 System.out.println(news1);
125 } else
126 {
127 System.out.println(news1);
128 System.out.println(news2);
129 }
130 }
131 }