面向对象(下)自测题

一、分析题

阅读下面的程序,分析代码是否能编译通过,如果能编译通过,请列出运行的结果。如果不能编译通过,请说明原因。
代码一:

interface Animal {
	void breathe();  
	void run();
	void eat(){};
}
class Dog implements Animal {  
	public void breathe() {
    System.out.println("I’m breathing")
	}
	public void eat() {
    System.out.println("I’m eathing")
	}
}
public class test04 {
    public static void main(String [] args) {
      Dog dog = new Dog();
      dog.breathe();
      dog.eat();
	}
}

答:程序编译不通过,因为接口中定义的方法不能有方法体,所以定义的eat()方法是错误的。接口中的方法必须在子类中全部实现,由于run()方法在子类中并没有重新实现,所以这也是错误的。

二、简答题

1、什么是方法重写?
2、什么是多态?
3、抽象类和接口的区别?

1、在继承关系中,子类的方法与父类的某一方法具有相同的方法名返回类型和参数列表,则称子类的该方法重写(覆盖)父类的方法。
2、多态意味着一个对象有着多种形态,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。简单的说,多态就是使用父类类型的变量引用子类对象,根据被引用子类对象的特性,程序会得到不同的运行效果。
3、在Java中,使用abstract关键字修饰的类称之为抽象类。抽象类是不能被实例化的,通常需要写一个子类来继承抽象类,同时实例化子类来获得该类的对象。抽象类通常用于表示一种抽象的概念。接口可以说是一种特殊的抽象类,接口中只能定义常量和抽象方法。由于接口的特殊性,在定义时需要使用interface关键字。

三、编程题

请按照题目的要求编写程序并给出运行结果。
1、 设计一个学生类Student和它的一个子类Undergraduate,要求如下:

  • 1) Student类有name(姓名)、和age(年龄)属性,一个包含两个参数的构造方法,用于给name和age属性赋值,一个show()方法打印Student的属性信息-
  • 2) 本科生类Undergraduate增加一个degree(学位)属性。有一个包含三个参数的构造方法,前两个参数用于给继承的name和age属性赋值,第三个参数给degree专业赋值,一个show()方法用于打印Undergraduate的属性信息
  • 3) 在测试类中分别创建Student对象和Undergraduate对象,调用它们的show()。
 class Student {
	String name;
	int age;

	 Student(String name, int age) {
		public this.name = name;
		public this.age = age;
	}

	void show() {
		System.out.println("学生姓名:" + name + "----年龄:" + age);
	}

	 static class Undergraduate extends Student {
		public String degree;

		public Undergraduate(String degree, String name, int age) {
			super("李浩", 19);
			super.show();
			this.name = name;
			this.age = age;
			this.degree = degree;
		}

		void show() {
			System.out.println("学生姓名:" + this.name + "----年龄:" + this.age + "----学位:" + this.degree);
		}
	}
}

public class Test {
	public static void main(String[] args) {
		Student stu=new Undergraduate("本科","小芳",19);
		stu.show();
		}
	}

补充:解决报错在这里插入图片描述

编译时出现:No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing instance of type E(e.g. x.new A() where x is an instance of E). E指代我写的那个包含内部类的外部类。根据提示,没有可访问的外部类E的实例,必须分配一个合适的外部类E的实例(如x.new A(),x必须是E的实例。A为内部类的名称)看着这句提示,我就纳闷了,我已经用new实例化了这个类,为什么还不行呢。于是百度谷歌了一下相关资料。原来我写的内部类是动态的,也就是开头以 class开头(没有加static修饰符)。而主程序是public static class main。在Java中,类中的静态方法不能直接调用动态类的方法及使用动态类的属性。只有将某个内部类修饰为静态类,然后才能够在静态类中调用该类的成员变量与成员方法。所以
解决办法一:是将 class改为static class.
解决办法二:先定义一个外部类的实例x,然后用x去调用内部类的A的构造函数,从而实现实例化。例如:x.new A( ).
二:在写完一个类时没有在主方法而是直接在类中调用System.out.println()方法打印信息,这时编译会报错。因为类不能直接在方法外调用方法。方法才能调用方法,而System.out.println(x); 是一个内置方法,所以只能放到方法里去调用,不能写在类里
————————————————
版权声明:本文为CSDN博主「流浪的侠客」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yechaodechuntian/article/details/12192397
是引用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值