1、多态是什么,多态的前提条件是什么?
多态就是事物存在的多种形态
前提条件: 要有继承关系 要有方法重写 要有父类引用指向子类对象
2、多态中成员访问的特点分别是什么?
成员变量:编译看左边,运行看左边
成员方法(非静态方法):编译看左边,运行看右边
静态方法:编译看左边,运行看左边
3、多态的好处和弊端分别是什么?
好处:提高了代码的维护性 提高了代码的扩展性
弊端:不能使用子类的特有属性和行为
4、什么是向上转型,什么是向下转型?
向上转型举例:Person P = new SuperMan();
向下转型举例:SuperMan sm = (SuperMan)p
5、什么是抽象类,它的特点是什么?
抽象类就是看不懂的
抽象类和抽象方法必须用abstract关键字修饰
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能实例化,按照多态的方式,由具体的子类实例化,其实这也是多态的一种,抽象类多态.
抽象类的子类要么是抽象类要么重写抽象类中的所有抽象方法
6、抽象类的成员特点有哪些?
成员变量:既可以是变量,也可以是常量.abstract不可以修饰成员变量.
有构造方法,用于子类访问父类数据的初始化.
成员方法:既可以是抽象的也可以是非抽象的
7、抽象类的面试题:
A、一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
B、abstract不能和哪些关键字共存,为什么?
A: 可以 这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成
B: abstract和static
被abstract修饰的方法没有方法体
被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的
abstract和final
被abstract修饰的方法强制子类重写
被final修饰的不让子类重写,所以他俩是矛盾
abstract和private
被abstract修饰的是为了让子类看到并强制重写
被private修饰不让子类访问,所以他俩是矛盾的
8、什么是接口,它的特点是什么?
从狭义的角度讲就是指java中的interface
从广义的角度讲对外提供规则的都是接口
特点:接口用关键字interface表示 interface 接口名 {}
类实现接口用implements表示 class 类名 implements 接口名 {}
接口不能实例化可以按照多态的方式实例化.
接口的子类 可以是抽象类,但是意义不大.可以是具体类,要重写接口中的所有抽象方法.
9、接口的成员特点有哪些?
成员变量:只能是常量,并且是静态的并公共的.默认修饰符:public static final 建议自己手动给出
构造方法:接口没有构造方法
成员方法:只能是抽象方法 默认修饰符public abstract 建议自己手动给出
10、抽象类和接口的区别是什么?
抽象类成员变量可以是变量也可以是常量 有构造方法 成员方法可以是抽象也可以非抽象
接口 成员变量只可以是常量 成员方法只可以是抽象
11、根据需求,完成如下代码(按照标准格式写),并在测试类中进行测试。
需求一:
具体事物:基础班老师,就业班老师
共性:姓名,年龄,讲课。
特性:
基础班老师讲JavaSE
就业班老师讲Android
需求二:
具体事物:基础班学生,就业班学生
共性:姓名,年龄,学习
特性:
基础班学生学JavaSE
就业班学生学Android
class Test_People00 {
public static void main(String[] args) {
BaseStudent bs = new BaseStudent("李连杰",60);
System.out.print("我的姓名是:" + bs.getName() + " ,我的年龄是:" + bs.getAge() + " ,我是");
bs.study();
WorkStudent ws = new WorkStudent("李冰冰",20);
System.out.print("我的姓名是:" + ws.getName() + " ,我的年龄是:" + ws.getAge() + " ,我是");
ws.study();
}
}
abstract class Student
{
private String name; //姓名
private int age; //年龄
public Student() {} //空参
public Student(String name,int age) { //有参
this.name = name;
this.age = age;
}
public void setName(String name) { //设置姓名
this.name = name;
}
public String getName() { //获取姓名
return name;
}
public void setAge(int age) { //设置年龄
this.age = age;
}
public int getAge() { //获取年龄
return age;
}
public abstract void study(); //学习的方法
}
class BaseStudent extends Student
{
public BaseStudent() {} //空参
public BaseStudent(String name,int age) { //有参
super(name,age);
}
public void study() { //学习
System.out.println("基础班学生学JavaSE");
}
}
class WorkStudent extends Student
{
public WorkStudent() {} //空参
public WorkStudent(String name,int age) { //有参
super(name,age);
}
public void study() { //学习
System.out.println("就业班学生学JavaEE");
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------
需求三:
已知猫类和狗类:
属性:毛的颜色,腿的个数
行为:吃饭
猫特有行为:抓老鼠catchMouse
狗特有行为:看家lookHome
class Test00_Animal{
public static void main(String[] args) {
Cat c = new Cat("黄色",4);
c.eat();
c.catchMouse();
}
}
abstract class Animal
{
private String color;
private int leg;
public Animal() {}
public Animal(String color,int leg) {
this.color = color;
this.leg = leg;
}
public void setColor(String color) {
this.color = color;
}
public String getColor() {
return color;
}
public void setLeg(int leg) {
this.leg = leg;
}
public int getLeg() {
return leg;
}
public abstract void eat();
}
class Cat extends Animal
{
public Cat() {}
public Cat(String color,int leg) {
super(color,leg);
}
public void eat() {
System.out.print("猫吃鱼");
}
public void catchMouse() {
System.out.print("猫抓老鼠");
}
}
class Dog extends Animal
{
public Dog() {}
public Dog(String color,int leg) {
super(color,leg);
}
public void eat() {
System.out.print("狗吃骨头");
}
public void lookHome() {
System.out.print("看家");
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------
需求四:
已知接口Play中有一个方法playGame(),再测试类中如何调用该方法?
class Test_Play{
public static void main(String[] args) {
Play p = new ZiPlay(); //父类引用指向子类对象
p.playGame();
}
}
interface Play
{
public abstract void playGame();
}
class ZiPlay implements Play
{
public void playGame() {
System.out.println("接口的子类");
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------
需求五:
已知动物类(姓名,年龄,吃饭,睡觉),它有两个子类,分别是猫类和狗类。
不同的是猫吃鱼,狗吃肉。
经过马戏团的培训后,部分猫会跳高,部分狗也会跳高。
请写代码实现。
class Test5_Animal{
public static void main(String[] args) {
JumpCat jc = new JumpCat("小黑猫",5);
jc.jumping();
jc.eat();
jc.sleep();
JumpDog jd = new JumpDog("小黑狗",3);
jd.jumping();
jd.eat();
jd.sleep();
}
}
/**定义抽象动物类*/
abstract class Animal
{
private String name;
private int age;
public Animal() {}
public Animal(String name,int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public abstract void eat();
public abstract void sleep();
}
/**定义猫类*/
class Cat extends Animal
{
public Cat() {}
public Cat(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("猫吃鱼");
}
public void sleep() {
System.out.println("站着睡");
}
}
/**定义狗类*/
class Dog extends Animal
{
public Dog() {}
public Dog(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("狗吃骨头");
}
public void sleep() {
System.out.println("坐着睡");
}
}
/**定义接口*/
interface Inter
{
public abstract void jumping();
}
/**定义跳高猫类*/
class JumpCat extends Cat implements Inter
{
public JumpCat() {}
public JumpCat(String name,int age) {
super(name,age);
}
public void jumping() {
System.out.println("猫的名字是:" + getName() + " ,年龄是:" + getAge());
}
}
/**定义跳高狗类*/
class JumpDog extends Dog implements Inter
{
public JumpDog() {}
public JumpDog(String name,int age) {
super(name,age);
}
public void jumping() {
System.out.println("狗的名字是:" + getName() + " ,年龄是:" + getAge());
}
} |
|