一、分析题
阅读下面的程序,分析代码是否能编译通过,如果能编译通过,请列出运行的结果。如果不能编译通过,请说明原因。
代码一:
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
是引用