抽象类+接口+内部类作业题

抽象类+接口+内部类作业题

一、 选择题

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接口中,下列选项中属于有效的方法声明是(a )。(选择二项)

A

public void aMethod( );

B.

final void aMethod( );

C.

void aMethod(){ }

D.

private void aMethod( );

8.

以下选项中关于匿名内部类的说法正确的是(  b,c   )。(选择二项)

A.

匿名内部类可以实现多个接口,或者继承一个父类

B.

匿名内部类不能是抽象类,必须实现它的抽象父类或者接口里包含的所有抽象方法

C.

匿名内部类没有类名,所以匿名内部类不能定义构造方法

D.

匿名内部类可以直接访问外部类的所有局部变量

二、 判断题(共20个题目,总计10分)

1. 声明为final的类不能是超类。( dui   )

2. 使用final修饰的变量将变成常量,其中不能再被改变;使用final修饰的方法将无法被子类重;使用final修饰的类将无法再被其他类继承。(   

3. 抽象方法不能含有方法体,并且必须定义在抽象类中。(  错 

4. 抽象类是指在class前加使用abstract关键字修饰,且可以存在抽象方法和普通方法的类。(  dui  

5. 接口中只有常量,没有变量;只有抽象方法,并且全部都是public方法。( dui   

6. 抽象类和接口都不能实例化,都没有构造方法。(  cuo  

7. 接口并不要求实现类和接口在概念本质上一致的,仅仅是实现了接口定义的约定或者能力而已。接口定义了“做什么”,而实现类负责完成“怎么做”,体现了功能(规范)和实现分离的原则。  dui  

8. 内部类作为外部类成员,权限修饰符和其他成员一样,可声明为private、默认、protectedpublic(  dui )

9. 匿名内部类适合创建那种只需要使用一次的类,它可以实现一个或多个接口,或者继承一个父类。(   cuo 

10. 对于物理连接,比如数据库连接、输入流输出流、Socket连接等,垃圾回收机制无能为力,必须手动关闭才可以。( dui  )

11. 垃圾回收机制回收任何对象之前,总会先调用gc( )法,该方法是Object类提供的方法。不要主动调用某个对象的该方法,应该交给垃圾回收机制调用。(  cuo  

 

三、 简答题

1. final和abstract关键字的作用。

1final修饰类中的属性或者变量

无论属性是基本类型还是引用类型,final所起的作用都是变量里面存放的“值”不能变。

这个值,对于基本类型来说,变量里面放的就是实实在在的值,如1abc”等。

而引用类型变量里面放的是个地址,所以用final修饰引用类型变量指的是它里面的地址不能变,并不是说这个地址所指向的对象或数组的内容不可

final修饰属性,声明变量时可以不赋值,而且一旦赋值就不能被修改了。对final属性可以在三个地方赋值:声明时、初始化块中、构造方法中。总之一定要赋值。

 2final修饰类中的方法

 作用:可以被继承,但继承后不能被重写。

 3final修饰类

 作用:类不可以被继承

abstract(抽象)修饰符,可以修饰类和方法

1,abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。

2,abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分以";"代替。需要子类继承实现(覆盖)。

注意:有抽象方法的类一定是抽象类。但是抽象类中不一定都是抽象方法,也可以全是具体方法。

abstract修饰符在修饰类时必须放在类名前。

abstract修饰方法就是要求其子类覆盖(实现)这个方法。调用时可以以多态方式调用子类覆盖(实现)后的方法,也就是说抽象方法必须在其子类中实现,除非子类本身也是抽象类。

注意:父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类。抽象类中可以有构造方法,是子类在构造子类对象时需要调用的父类(抽象类)的构造方法。

2. 

3. 接口和抽象类的联系和区别。

4. 

5. 

 

接口

抽象类

多继承

支持

不支持

类型限制

没有

有,只能是引用类型

方法实现

继承类型中必须给出方法实现

继承类中可以不给出

扩展性

比较麻烦

相对比较灵活

多层继承

比较麻烦,需要借助虚函数

比较灵活

6. 内部类的类型及其特点。内部类的类型及其特点。

⒈ 静态内部类  内部类对象可以访问创建它的对象的实现,包括私有数据

2,成员内部类   内部类不为同一的其他类所见,具有很好的封装

3,局部内部类

4匿名内部类 匿名内部类可以方便的定义运行时回调; 

7. 介绍Java垃圾回收机制。

1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用  需要注意的是,调用System.gc()也仅仅是一个请求(建议)JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。旦垃圾回收器准备好释放对象占用的存储空间,首先会去调用finalize()方法进行一些必要的清理工作。只有到下一次再进行垃圾回收动作的时候,才会真正释放这个对象所占用的内存空间。

四、 编码题

1. 编写程序描述兔子和青蛙

需求说明:使用面向对象的思想,设计自定义类描述兔子和青蛙。

实现思路及关键代码

1) 分析兔子和青蛙的共性

2) 根据共性,定义抽象的动物类

属性:名字、颜色、类别(哺乳类、非哺乳类)

方法:吃饭,发出叫声

3) 根据青蛙会游泳 抽象游泳的接口

方法:游泳

4) 定义兔子继承动物类,青蛙继承动物同时实现游泳接口

程序运行结果如图所示。

 

package cn.rabit;

public class Rabbit extends Animal{

@Override

public void eat() {

System.out.println("兔子是"+this.getType()+",爱吃胡萝卜");

}

@Override

public void shout() {

System.out.println("那只"+this.getColor()+"的,名叫"+this.getName()

+"的兔子正在呱呱的叫");

}

}

package cn.rabit;

public class Frog extends Animal implements Ability{

@Override

public void swiming() {

System.out.println("虽然不是鱼,但青蛙也是泳坛高手");

}

@Override

public void eat() {

System.out.println("兔子是"+this.getType()+",爱吃昆虫");

}

@Override

public void shout() {

System.out.println("那只"+this.getColor()+"的,名叫"+this.getName()

+"的青蛙正在呱呱的叫");

}

}

package cn.rabit;

public abstract class Animal {

private String name;

private String color;

private String type;

public abstract void eat();

public abstract void shout();

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

}

package cn.rabit;

public interface Ability {

public void swiming();

}

package cn.rabit;

public class TestRabbit {

public static void main(String[] args) {

Rabbit r=new Rabbit();

Frog f=new Frog();

f.setName("大冰");

f.setColor("绿色");

f.setType("非哺乳类");

r.setName("美人");

r.setColor("黑色");

r.setType("哺乳类");

//"美人","黑色","哺乳类"

r.shout();

r.eat();

System.out.println("====================");

f.shout();

f.eat();

f.swiming();

}

}

2. 编写程序描述影视歌三栖艺人

需求说明:请使用面向对象的思想,设计自定义类,描述影视歌三梄艺人。

实现思路及关键代码

1) 分析影视歌三栖艺人的特性

a) 可以演电影

b) 可以演电视剧

c) 可以唱歌

2) 定义多个接口描述特性

a) 演电影的接口-----方法:演电影

b) 演电视剧的接口-----方法:演电视剧

c) 唱歌的接口-----方法:唱歌

3) 定义艺人类实现多个接口

程序运行结果如图2所示。

 

public interface TvShow {

public void showTv();

}

public interface Sing {

public void showSinging();

}

public interface Movie {

public void showMovie();

}

public class Actor implements TvShow, Movie, Sing {

private String name;

Actor(String name){

this.name=name;

}

@Override

public void showSinging() {

System.out.println("我可以唱歌");

}

@Override

public void showMovie() {

System.out.println("我可以演电影");

}

@Override

public void showTv() {

System.out.println("我可以演电视剧");

}

public static void main(String[] args) {

Actor a=new Actor("马素素");

a.showMovie();

a.showSinging();

a.showTv();

}

}

 

3. 写一个方法对任意引用数据类型数组进行排序。具体要求如下:

1) 方法声明为public  void sortArr(Object arr[]){  }

2) 方法中首先输出排序前数组内容,然后进行排序,最后输出排序后数组内容。

3) 可以是冒泡排序或其他算法实现,不直接调用Java提供的方法实现排序。

思路:任意类实现Comparable接口来实现该引用数据类型的元素排序,在sort()方法中将Object强转成Comparable实现两个对象的比较。

package cn.sort.pxd2;

public class Student implements Comparable{

private int age;

Student s[]=new Student[4];

Student (int age){

this.age=age;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public void sortArr(Object s[]){

Student[] st=(Student [])s;

for(int i=0;i<s.length-1;i++){

for(int j=0;j<s.length-1-i;j++){

if(st[j].getAge()>st[j+1].getAge()){

int tmp=st[j].getAge();

st[j].setAge(st[j+1].getAge());

st[j+1].setAge(tmp);

}

}

}

}

}

package cn.sort.pxd2;

public interface Comparable{

public void sortArr(Object t[]);

}

package cn.sort.pxd2;

public class Test11 {

public static void main(String[] args) {

Student s1=new Student(1);

Student s2=new Student(3);

Student s3=new Student(7);

Student s4=new Student(2);

Student s[]=s1.s;

s[0]=s1;

s[1]=s2;

s[2]=s3;

s[3]=s4;

for(int i=0;i<s.length;i++){

System.out.print(s[i].getAge()+" ");

}

s1.sortArr(s);

System.out.println();

for(int i=0;i<s.length;i++){

System.out.print(s[i].getAge()+" ");

}

}

}

五、 可选题

1. 实现不同符合PCI规范的适配器

需求说明:PCI是一种规范,所有实现了该规范的适配器,必如显卡、声卡、网卡都可以安装到PCI插槽上并工作。模拟实现该功能。

 

实现思路及关键代码

1) 定义PCI接口,具有传送数据send()方法

2) 定义显卡VideaCard类,实现该接口

3) 定义声卡AudioCard类,实现PCI接口

4) 定义网卡NetCard类,实现PCI接口

5) 定义测试类,让显卡、声卡、网卡发送数据

2. 实现不同引用类型对象的大小比较

需求说明:学生类,新闻类,商品类虽然是完全不同的类,但是都具有比较的能力,比如可以比较两个学生的大小,但需要指定比较的依据是学号、姓名还是成绩等。

实现思路及关键代码:

将比较的能力定义为接口,让学生、新闻、商品类都实现该接口。

1) 定义接口Comparable,其中包含唯一的方法int compareTo(Object obj)

2) 定义学生类,包括学号、姓名、年龄和分数,实现Comparable接口,按照分数倒序排列;

3) 定义新闻类,包括编号(int类型)、标题、内容和点击数,实现Comparable接口,按照编号正序排列;

4) 定义测试类,分别创建两个学生对象、新闻对象,进行比较并输出结果。

5) 返回值>0,表示大于,返回值=0,表示等于,返回值<0,表示小于。

package student.news.goods;

public interface Comparable {

public int compareTo(Object obj);

}

package student.news.goods;

public class Student implements Comparable {

private int studentId;

private String name;

private int score;

private int age;

Student (int score){

this.score=score;

}

@Override

public int compareTo(Object obj) {

Student stu=(Student)obj;

if(this.score>stu.score)return 1;

if(this.score<stu.score)return -1;

return 0;

}

}

package student.news.goods;

public class News implements Comparable {

private int serialNumber;

private String title;

private String content;

private int clicks;

News(int serialNumber) {

this.serialNumber = serialNumber;

}

@Override

public int compareTo(Object obj) {

News ne = (News) obj;

if (this.serialNumber > ne.serialNumber)

return 1;

if (this.serialNumber < ne.serialNumber)

return -1;

return 0;

}

}

package student.news.goods;

public class Test {

public static void main(String[] args) {

Student stu1 = new Student(11);

Student stu2 = new Student(12);

stu1.compareTo(stu2);

print(stu1, stu2);

News n1 = new News(1001);

News n2 = new News(1002);

n1.compareTo(n2);

print(n1, n2);

}

public static void print(Comparable o1, Comparable o2) {

if (o1 instanceof Student && o2 instanceof Student) {

Student s1 = (Student) o1;

Student s2 = (Student) o2;

if (s1.compareTo(s2) == 1) {

System.out.println("s1" + " " + "s2");

} else if (s1.compareTo(s2) == -1) {

System.out.println("s2" + " " + "s1");

} else {

System.out.println("s1" + "和" + "s2" + "一般大");

}

}else if(o1 instanceof News && o2 instanceof News){

News s1 = (News) o1;

News s2 = (News) o2;

if (s1.compareTo(s2) == 1) {

System.out.println("n2" + " " + "n1");

} else if (s1.compareTo(s2) == -1) {

System.out.println("n1" + " " + "n2");

} else {

System.out.println("n2" + "和" + "n1" + "一般大");

}

}

}

}

 

抽象类+接口+内部类作业答案

一、 选择题


1. C

2. B

3. D

4. AC

5. AB

6. AD

7. A

8. BC

9. AD



二、 判断题


1. √

2. √

3. ×

4. √

5. √

6. ×

7. √

8. √

9. ×

10. √

11. ×

12. √

13. ×

14. ×

15. ×



三、 简答题


答案略

四、 编码题


1. 编写程序描述兔子和青蛙

需求说明:使用面向对象的思想,设计自定义类描述兔子和青蛙。

/**

 * 动物类

 * @author Administrator

*/

public abstract class Animal {

private String name;//名字

private String color;//颜色

private String type;//类别(哺乳类、非哺乳类)

public Animal() {

super();

}

public Animal(String name, String color, String type) {

super();

this.name = name;

this.color = color;

this.type = type;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

/**

 * 发出叫声

 */

public abstract void shout();

/**

 * 吃饭

 */

public abstract void eat();

}

/**

 * 游泳接口

 * @author Administrator

*/

public interface Swimmable {

/**

 * 游泳

 */

public void swim();

}

public class Frog extends Animal implements Swimmable{

public Frog() {

super();

}

public Frog(String name, String color, String type) {

super(name, color, type);

}

@Override

public void shout() {

System.out.println("那只"+super.getColor()+

"的,名字叫"+super.getName()+"的青蛙正在呱呱的叫");

}

@Override

public void eat() {

System.out.println("青蛙是"+super.getType()+",爱吃昆虫");

}

@Override

public void swim() {

System.out.println("虽然不是鱼,但是青蛙也是游泳高手");

}

}

public class Rabbit extends Animal{

public Rabbit() {

super();

}

public Rabbit(String name, String color, String type) {

super(name, color, type);

}

@Override

public void shout() {

System.out.println("那只"+super.getColor()+

"的,名字叫"+super.getName()+"的兔子正在叽叽的叫");

}

@Override

public void eat() {

System.out.println("兔子是"+super.getType()+",爱吃胡萝卜");

}

}

public class Test {

public static void main(String[] args) {

Animal rabbit = new Rabbit("美人", "黑色", "哺乳类");

rabbit.shout();

rabbit.eat();

System.out.println("====================");

Animal frog = new Frog("大兵", "绿色", "非哺乳类");

frog.shout();

frog.eat();

Swimmable swimer = (Swimmable)frog;

swimer.swim();

}

}

2. 编写程序描述影视歌三栖艺人

需求说明:请使用面向对象的思想,设计自定义类,描述影视歌三梄艺人。

/**

 * 可演电影接口

 * @author Administrator

*/

public interface Filmable {

/**

 *  演电影

 */

public void actFilm();

}

/**

 * 会唱歌接口

 * @author Administrator

*/

public interface Singable {

/**

 * 唱歌

 */

public void sing();

}

/**

 * 会演电视剧接口

 * @author Administrator

*/

public interface TVable {

/**

 * 演电视剧

 */

public void showTV();

}

public class Star implements Filmable,TVable,Singable{

private String name;//姓名

public Star() {

super();

}

public Star(String name) {

super();

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public void sing() {

System.out.println("我会唱歌");

}

@Override

public void showTV() {

System.out.println("我能演电视剧");

}

@Override

public void actFilm() {

System.out.println("我能演电影");

}

public void introduce(){

System.out.println("大家好,我是"+name);

}

}

public class Test {

public static void main(String[] args) {

Star star = new Star("马素素");

star.introduce();

star.actFilm();

star.showTV();

star.sing();

}

}

3. 写一个方法对任意数据类型数组进行排序。具体要求如下:

1) 方法声明为public  void sortArr(Object arr[]){  }

2) 方法中首先输出排序前数组内容,然后进行排序,最后输出排序后数组内容。

3) 可以是冒泡排序或其他算法实现,不直接调用Java提供的方法实现排序。

public void sort(Object [] arr){

//输出排序前数组 

for(int i=0;i<arr.length;i++){

System.out.println(arr[i]);

}

//大循环,一共n个元素,达到最终有序,至多n-1趟比较

Object temp;

for(int i=0;i<arr.length-1 ;i++){

//定义一个符号量

boolean  flag = true;//没有交换,有序

//小循环

for(int j=0;j<arr.length-1-i;j++){

//如果前一个大于后一个

Comparables c1 = (Comparables)arr[j];

Comparables c2 = (Comparables)arr[j+1];

if(c1.compareTo(c2)>0){

//交换

temp = arr[j];

arr[j]=arr[j+1];

arr[j+1]=temp;

//修改符号量

flag = false;//交换过,无序

}

}

//判断经过此趟循环后是否已经有序

if(flag){

break;//退出外层循环,省略后续趟循环

}

}

//输出排序后数组

for(int i=0;i<arr.length;i++){

System.out.println(arr[i]);

}

}

五、 可选题

 

1. 实现不同符合PCI规范的适配器

/**

 * PCI接口

 * @author Administrator

 *

 */

public interface PCI {

/**

 * 传输数据

 */

public void send();

}

 

public class VideoCard implements PCI{

@Override

public void send() {

System.out.println("使用PCI接口传输视频数据");

}

}

public class SoundCard implements PCI{

@Override

public void send() {

System.out.println("使用PCI接口传输声音数据");

}

}

public class NetCard implements PCI {

@Override

public void send() {

System.out.println("使用PCI接口传输网络数据");

}

}

public class Test {

public static void main(String[] args) {

PCI p1 = new VideoCard();

p1.send();

PCI p2 = new SoundCard();

p2.send();

PCI p3 = new NetCard();

p3.send();

}

}

 

2. 实现不同引用类型对象的大小比较

/**

 * 比较接口

 * @author Administrator

 *

 */

public interface Comparable {

/**

 * 比较

 * @param obj 另外一个对象

 * @return 比较的结果  >0 大于  =0 等于  <0 小于

 */

public int compareTo(Object obj);

}

public class News implements Comparable{

private int nid;//编号

private String title; //标题

private String contents;//内容

private String  type;//新闻类别

public News() {

super();

}

public News(int nid, String title, String contents,String type) {

super();

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;

}

@Override

public String toString() {

return "News [nid=" + nid + ", title=" + title + ", contents="

+ contents + ", type=" + type + "]";

}

}

public class Student implements Comparable{

private int id;

private String name;

private int age;

private double score;

public Student() {

super();

}

public Student(int id, String name, int age, double score) {

super();

this.id = id;

this.name = name;

this.age = age;

this.score = score;

}

/**

 * 按照学生成绩降序排序

 */

public int compareTo(Object obj) {

Student other =(Student)obj;

if(this.score>other.score){

return -1;

}else if(this.score<other.score){

return 1;

}else{

return 0;

}

}

@Override

public String toString() {

return "Student [id=" + id + ", name=" + name + ", age=" + age

+ ", score=" + score + "]";

}

}

public class Test {

public static void main(String[] args) {

//

Student stu1 = new Student(11, "小红", 18, 97d);

Student stu2 = new Student(12, "小东", 20, 98d);

if(stu1.compareTo(stu2)>0){

System.out.println(stu2);

System.out.println(stu1);

}else{

System.out.println(stu1);

System.out.println(stu2);

}

//

News news1 = new News(33, "恒大亚冠", "恒大亚冠小组被淘汰", "体育");

News news2 = new News(44, "上海尚学堂", "请原谅我的姗姗来迟", "IT");

if(news1.compareTo(news2)>0){

System.out.println(news2);

System.out.println(news1);

}else{

System.out.println(news1);

System.out.println(news2);

}

}

}

猜你喜欢

转载自blog.csdn.net/qq_36421955/article/details/80824047