习题
一、填空题
1、一个类如果实现一个接口,那么它就需要实现接口中定义的全部__抽象方法____,否则该类就必须定义成_抽象类_____。
2、一个类可以从其它的类派生出来,派生出来的类称为__派生类____,用于派生的类称为_基类_____或者__根类____。
3、定义一个Java类时,如果前面加使用_final_____关键字修饰,那么该类不可以被继承。
4、在Java语言中,所有的类都直接或间接继承自_Object_____类。
5、一个Lambda表达式由三个部分组成,分别为___参数列表___、_->_____和__表达式主题____。
二、判断题
1、抽象方法必须定义在抽象类中,所以抽象类中的方法都是抽象方法。错
2、Java中被final关键字修饰的变量,不能被重新赋值。对
3、不存在继承关系的情况下,也可以实现方法重写。错
重写(就是在子类中重新定义父类中已有的方法)
重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别。(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。) B、重写规则之二:参数列表必须与被重写方法的相同。重写有个孪生的弟弟叫重载,也就是后面要出场的。如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。 C、重写规则之三:返回类型必须与被重写方法的返回类型相同。 D、重写规则之四:重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。 E、重写规则之五:不能重写被标识为final的方法。 F、重写规则之六:如果一个方法不能被继承,则不能重写它。
重载(函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间)
方法重写和重载的主要区别
重写特点:函数名必须相同、参数列表必须相同、子类的返回值类型要等于或者小于父类的返回值类型等。
子类的作用域不能大于父类中方法的作用域,子类抛出的异常类型不能大于父类中抛出的异常类型。
重载的特点:函数名相同,参数列表不同,与访问控制符、返回值类型等无关。
重写用于继承关系的父子类中,不能用于同一类中,而重载通常用于同一类中。
重写用于更改父类方法的行为或者实现接口的方法。而重载用于为一个行为提供多种实现方式。
4、函数式接口在Java中是指有且仅有一个抽象方法的接口。对(P132)
5、接口中只能定义常量和抽象方法。错
接口里的变量必须赋值(初始化)变成常量,默认的是public static final的,不可修改。
三、选择题
1、在类的继承关系中,需要遵循以下哪个继承原则?B
A、多重 B、单一 C、双重 D、不能继承
2、关于super关键字以下说法哪些是正确的?(多选)AD
A、super关键字可以调用父类的构造方法
B、super关键字可以调用父类的普通方法
C、super与this不能同时存在于同一个构造方法中
D、super与this可以同时存在于同一个构造方法中
Super关键字用来访问父类的成员,列入访问父类的成员变量,成员方法,和构造方法
This用于指代当前对象,在方法中访问对象的其他成员
3、类中的一个成员方法被下面哪个修饰符修饰,该方法只能在本类被访问?C
A、public B、 protected C、 private D、default
4、在Java中,要想让一个类继承另一个类,可以使用以下哪个关键字?C
A、inherits B、implements C、extends D、modifies
5、已知类的继承关系如下:
class Employee;
class Manager extends Employee;
class Director extends Employee;
则以下语句能通过编译的有哪些? A
A、 Employee e=new Manager(); B、 Director d=new Manager();
C、 Director d=new Employee(); D、Manager m=new Director();
四、简答题
1、简述什么是方法重写。
重写:在继承关系中,子类的方法与父类的某一方法具有相同的方法名、返回类型和参数列表,则称子类的该方法重写(覆盖)父类的方法。
- 简述什么是多态。
多态:意味着一个对象有着多种形态,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。简单的说,多态就是使用父类类型的变量引用子类对象,根据被引用子类对象的特性,程序会得到不同的运行效果。
- 简述抽象类和接口的区别。
在Java中,使用abstract关键字修饰的类称之为抽象类。抽象类是不能被实例化的,通常需要写一个子类来继承抽象类,同时实例化子类来获得该类的对象。抽象类通常用于表示一种抽象的概念。
接口可以说是一种特殊的抽象类,接口中只能定义常量和抽象方法。由于接口的特殊性,在定义时需要使用interface关键字。
五、编码题
1.设计一个学生类Student和它的一个子类Undergraduate。要求如下:
- Student类有name、和age属性,一个包含两个参数的构造方法,用于给name和age属性赋值,一个show()方法打印Student的属性信息。
- 本科生类Undergraduate增加一个degree(学位)属性。有一个包含三个参数的构造方法,前两个参数用于给继承的name和age属性赋值,第三个参数给degree专业赋值,一个show()方法用于打印Undergraduate的属性信息。
- 在测试类中分别创建Student对象和Undergraduate对象,调用它们的show()。
package one.com;
public class Student {
public String name;
public int age;
public Student(String name,int age) {
this.name=name;
this.age=age;
}
/*前面是构造方法,可以看成是特别的方法,专用于对多个对象的属性进行赋值,比封装更加简单*/
/*构造方法需满足的三个条件:
* 1.方法名与类名相同
* 2.在方法名的前面没有返回值类型声明
* 3.在方法中不能使用return语句返回一个值,但可以单独写return作为方法结束
* */
public void show() {
System.out.println("name:"+name+"age:"+age);
/*输出格式:用""括起来的是需要输出的中文英文等,用+进行连接
* 需要输出x为25的变量值
* 1.System.out.println(x); 输出结果 25
* 2.Syetem.out.println("x="x); 输出结果 x=25
* */
}
/*方法语法格式:[修饰符] [返回值类型] 方法名([参数类型 参数名1,参数类型 参数名2]){
* 方法体
* return 返回值(当返回值类型为void时,return 可以省略)
* } */
/*修饰符 public protected private*/
}
//
package one.com;
/*
* 类的成员有:成员变量、构造方法、普通方法(成员方法)和内部类等
* 纠正:所以构造方法,和方法(成员方法)地位相同,并无包含关系!!!
* */
public class Undergraduate extends Student{
/*
* 子类会继承父类的成员变量和成员方法,但并不包括继承构造方法,对于构造方法只能调用。
* 子类继承父类时,需要注意以下三点:
1、在子类继承父类的时候,子类必须调用父类的构造函数;
2、在父类有默认构造函数,子类实例化时自动调用,在父类没有默认构造函数,即无形参构造函数,子类构造函数必须通过super调用父类的构造函数;
3、在java的继承当中子类是不可以继承父类的构造函数,只能调用父类的构造函数。
* */
public String degree;
/*如果不调用父类的构造函数就会出错*/
public Undergraduate(String name, int age,String degree) {
/*这个是调用父类的构造函数可用快捷键Alt+Shift+C*/
super(name, age);
/*super关键字用于访问父类的成员,
* 例如:
*成员变量: super.成员变量
*成员方法: super.成员方法([参数1,参数2....])
*构造方法: super.([参数1,参数2.....])*/
this.degree=degree;
// TODO Auto-generated constructor stub
}
/* 重写父类方法:要有相同的方法名,参数列表和返回值类型(上面那个不是) */
public void show() {
System.out.println("name="+name+"age:"+age+"degree:"+degree);
}
}
//
package one.com;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student student=new Student("zhangsan",16);
/*根据类创建实例对象
* 类名 对象名称=new 类名(赋值);
* */
student.show();
/*调用对象的方法
* 对象名称.方法();*/
Undergraduate underGraduate=new Undergraduate("lisi",20,"bechalor");
/*报错原因:类名应和调用子类的class名一样*/
underGraduate.show();
}
}
2、设计一个Shape接口和它的两个实现类Square和Circle。要求如下:
1)Shape接口中有一个抽象方法area(),方法接收有一个double类型的参数,返回一个double类型的结果。
2)Square和Circle中实现了Shape接口的area()抽象方法,分别求正方形和圆形的面积并返回。
3)在测试类中创建Square和Circle对象,计算边长为2的正方形面积和半径为3的圆形面积。
package two.com;
/*抽象类:定义方法描述该类的行为特征,但方法的实现方式无法确定(在定义方法时不需要实现方法体)
* 注意:
1.抽象类关键字 abstract
2.抽象类不能实例化
3.抽象方法没有方法体
4.一个类如果继承抽象类,那么重写重写类中的所有方法
5.抽象类方法只能存在于抽象类中
6.包含抽象方法的类必须定义为抽象类,但抽象类中可以不包含任何抽象方法
*/
/*接口:是一种特殊的抽象类,不能包含普通方法,其内部都是抽象方法,如果一个抽象类中都是抽象方法,可以定义为接口,其相当于多个类的公共规范*/
public interface Shape {
/*定义接口:[修饰符] interface 接口名[extends 父接口1,父接口2,....]{}*/
/*定义常量:[public static final] 常量类型 常量名=常量值
* 定义常量时必须进行初始化赋值*/
double area(double givenValue);/*定义了一个抽象方法*/
/*定义方法:[public absteact] 方法返回值类型 方法名 ([参数列表]);*/
}
//
package two.com;
/*接口与接口之间可以继承(extends),但又由于接口不能实现,所以需要定义一个接口的实现类(implements)*/
/*接口的实现类:实现接口中的所有方法,一个类可以在继承另一个类的同时实现多个接口*/
public class Square implements Shape {
public double area(double sideLength) {
/*因为在实现类中,所以public不能省*/
return sideLength*sideLength;
}
}
//
package two.com;
/*接口与接口之间可以继承(extends),但又由于接口不能实现,所以需要定义一个接口的实现类(implements)*/
/*接口的实现类:实现接口中的所有方法,一个类可以在继承另一个类的同时实现多个接口*/
public class Square implements Shape {
public double area(double sideLength) {
/*因为在实现类中,所以public不能省*/
return sideLength*sideLength;
}
}
//
package two.com;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
/*根据类创建完实例对象,才能在测试类中调用方法*/
Square square=new Square();
Circle circle=new Circle();
/*创建实例对象:类名 对象名称=new 类名(赋值);*/
System.out.println(square.area(2));
System.out.println(circle.area(3));
}
}