1、多态是什么,多态的前提条件是什么?
多态就是父类引用变量指向子类对象;
前提条件:必须有子父类关系或类实现接口关系;
2、多态中成员访问的特点分别是什么?
成员变量:
当子父类中出现同名的成员变量,多态调用该变量时,
编译时期:参考的是引用变量所属的类中是否有被调用的成员变量。没有编译失败;
运行时期:也是调用引用型变量所属的类中的成员变量;
简单记:运行编译看左边。
成员方法(非静态方法)
编译时期:参考引用变量所属的类,如果没有类中调用的方法,便以失败;
运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的方法;
简单记:编译看左边,运行看右边。
静态方法
编译时期:参考引用变量所属的类中是否有调用的静态方法;
运行时期:参考引用变量所属的类中是否有调用的静态方法;
简单记:编译运行都看左边;
其实对于静态方法,是不需要对象的。直接用类名调用即可。
3、什么是接口,它的特点是什么?
接口是功能的集合,同样可以看做是一种数据类型,是比抽象类更为抽象的“类”;
接口只描述应该具备的方法,并没有具体实现,具体的实现由接口的实现类来完成。这样就实现了功能 的定义与实现分离,优化了程序设计。
一切事物均有功能,即一切事物皆有接口。
4、接口的成员特点有哪些?
1. 接口中可以定义变量,但是变量必须有固定的修饰符修饰 public static final,
固定格式:public static final 数据类型 变量名 = 值;
所以接口中的变量也称为常量,其值不能被改变。
注意:修饰符 public static final 在接口变量定义中可以省略不写;
但是,不写不等于没有;
三个修饰符也可以选择性书写。
2. 接口中可以定义方法,方法也有固定的修饰符,public abstract
固定格式:public abstract 返回值类型 方法名();
修饰符 public abstract,可以不写,也可以选择性书写
但是,写与不写,都有
3. 实现类实现接口,重写接口中全部的抽象方法,创建实现类对象
实现类重写了一部分抽象方法,实现类还是一个抽象类
4. 接口不可以创建对象
5、抽象类和接口的区别是什么?
相同点:
都位于继承的顶端,用于被其他类实现或继承;
都不能实例化对象;
都包含抽象放大,其子类都必须重写这些抽象方法。
区别:
抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码的重用性;接口只包含抽象方法;
一个类只能继承一个直接父类(可能是父类),可以实现多个接口;接口弥补了Java的单继承;
抽象类是这个事物中应该具备的内容,继承体系是is...a关系;
接口是这个事物额外的功能,继承体系是一种 like...a关系。
二者选用:
优先选用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类。
6、定义一个父类Animal eat方法 , 定义两个子类 Dog 特有方法keepHome , Cat 特有方法 catchMouse ;并且 重写eat方法
测试类中写一个方法,参数列表有一个参数Animla类型,
要求: 调用该方法分别传递Dog对象 和Cat 对象, 使用instanceof进行将转后调用eat,和他们的特有方法
/**
* Animal类
* @author vanguard
*
*/
public abstract class Animal {
public abstract void eat();
}
1 public class Dog extends Animal {
2 public void eat() {
3 System.out.println("狗吃狗粮");
4 }
5 public void keepHome() {
6 System.out.println("狗看家");
7 }
8 }
public class Cat extends Animal {
public void eat() {
System.out.println("猫吃猫粮");
}
public void catchMouse() {
System.out.println("猫抓老鼠");
}
}
1 /**
2 * 测试类中写一个方法,参数列表有一个参数Animla类型
3 * @author vanguard
4 *
5 */
6 public class Test {
7 public static void pet(Animal a) {
8 if(a instanceof Dog) {
9 Dog d = (Dog)a;
10 d.eat();
11 d.keepHome();
12 }
13 if(a instanceof Cat) {
14 Cat c = (Cat)a;
15 c.eat();
16 c.catchMouse();
17 }
18 }
19 public static void main(String[] args) {
20 pet(new Dog());
21 pet(new Cat());
22 }
23 }
7.测试: 如果一个方法的返回值类型是父类,那么能否返回一个子类对象.(该父类不管是类,抽象类还是接口)
public class Fu {
public void show() {
System.out.println("父类show方法");
}
}
public class Zi extends Fu {
public void show() {
System.out.println("子类show方法");
}
}
public class Test {
public static Fu test(Zi z) {
return z;
}
public static void main(String[] args) {
Zi z = (Zi) test(new Zi());
}
}
经过测试,如果一个方法的返回值类型是父类,那么能返回一个子类对象。
8.现有两种 OldPhone NewPhone; 两个类都有call() sendMessage() 方法(考虑向上抽取一个父类);
已知接口IPlay中有一个方法 playGame(),NewPhone添加玩游戏的功能;
要求: 分别测试OldPhone和NewPhone的两个方法,再测试新手机palyGame()的方法.
/**
* Phone的抽象类
* 功能:
* call
* sendMessage
* @author vanguard
*
*/
public abstract class Phone {
public abstract void call();
public abstract void sendMessage();
}
/**
* 接口IPlay
* 方法:playGame()
* @author vanguard
*
*/
public interface IPlay {
public abstract void playGame();
}
/**
* OldPhone类继承Phone重写call()、sendMessage()
* @author vanguard
*
*/
public class OldPhone extends Phone {
public void call() {
System.out.println("旧手机打电话");
}
public void sendMessage() {
System.out.println("旧手机发信息");
}
}
/**
* NewPhone类继承Phone重写call()、sendMessage(),
* 实现IPlay接口,重写PlayGame()
* @author vanguard
*
*/
public class NewPhone extends Phone implements IPlay {
public void call() {
System.out.println("新手机打电话");
}
public void sendMessage() {
System.out.println("新手机发信息");
}
public void playGame() {
System.out.println("新手机玩游戏");
}
}
/**
* 测试类
* 分别测试OldPhone和NewPhone的两个方法,再测试新手机palyGame()的方法.
* @author vanguard
*
*/
public class Test {
public static void main(String[] args) {
OldPhone op = new OldPhone();
op.call();
op.sendMessage();
NewPhone np = new NewPhone();
np.call();
np.sendMessage();
np.playGame();
}
}
9 .(完成下面的汽车案例)
描述:汽车都具有跑的功能,普通的奥迪车也不例外,但是高端的奥迪车除了具有跑的功能外,还具有自动泊车和无人驾驶的功能!
需求:定义普通奥迪车,高端奥迪车,实现描述中的功能并测试
/**
* 定义汽车的抽象类
* @author vanguard
*
*/
public abstract class Car {
public abstract void run();
}
/**
* 其他功能的接口
* 自动泊车
* 自动驾驶
* @author vanguard
*
*/
public interface OtherFunction {
public abstract void parkAssist();
public abstract void autopilot();
}
/**
* 普通奥迪类
* @author vanguard
*
*/
public class AudiCar extends Car {
public void run() {
System.out.println("普通奥迪车跑");
}
}
/**
* 高端奥迪类
* @author vanguard
*
*/
public class HAudiCar extends Car implements OtherFunction {
public void run() {
System.out.println("高端奥迪车跑");
}
public void parkAssist() {
System.out.println("自动泊车");
}
public void autopilot() {
System.out.println("自动驾驶");
}
}
/**
* 测试类
* @author vanguard
*
*/
public class Test {
public static void main(String[] args) {
AudiCar ac = new AudiCar();
ac.run();
HAudiCar hc = new HAudiCar();
hc.run();
hc.parkAssist();
hc.autopilot();
}
}