章节2
课时51 对象转型_1
基本概念
- 一个基类的引用类型变量可以“指向”其子类的对象。
- 一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。
- 【引用变量 instanceof 类名】可以用来判断该引用类型变量所“指向”的对象是否属于该类或该类的子类。
- 子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称作向下转型(downcasting)。
对象转型实例I
代码
public class Test {
public static void main(String[] args) {
Animal a = new Animal("name");
Cat c = new Cat("catname","blue");
Dog d = new Dog("dogname","black");
System.out.println(a instanceof Animal);// true
System.out.println(b instanceof Animal);// true
System.out.println(c instanceof Animal);// true
System.out.println(a instanceof Cat);// false
a=new Dog("bigdog","yellow");
System.out.println(a.name);// bigdog
System.out.println(a.furname);// error
Dog d1 = (Dog)a;
System.out.println(d1.furcolor);// yellow
}
}
内存分析
课时52 对象转型_2
对象转型实例II
对象转型对于可扩展性带来的好处
public class Test {
public static void main(String[] args) {
Test test = new Test();
Animal a = new Animal("name");
Cat c = new Cat("catname","blue");
Dog d = new Dog("dogname","black");
test.f(a);
test.f(c);
test.f(d);
}
public void f(Animal a){
System.out.println("name: "+a.name);
if(a instanceof Cat){
Cat c = (Cat)a;
System.out.println("" + "c.eyesColor"+" eyes");
}else if(a instanceof Dog){
Dog d = (Dog)a;
System.out.println("" + "d.furColor"+" fur");
}
}
}
运行结果
课时53 多态_1
基本概念
- 动态绑定是指“在执行期间(而非编译期间)”判断所引用对象的实际类型。根据其实际的类型调用其相应的方法。
多态产生的必要条件
- 1、要有继承
- 2、要有重写
- 3、父类引用指向子类对象(这样当父类调用子类被重写的方法的时候时,多态就会派上用场)
动态绑定和多态
代码
package TestPolymoph;
class Animal {
private String name;
Animal(String name) {
this.name = name;
}
public void enjoy() {
System.out.println("叫声······");
}
}
class Cat extends Animal {
private String eyesColor;
Cat(String n, String e) {
super(n);
this.eyesColor = e;
}
public void enjoy() {
System.out.println("猫叫声······");
}
}
class Dog extends Animal {
private String furColor;
Dog(String n, String f) {
super(n);
this.furColor = f;
}
public void enjoy() {
System.out.println("狗叫声······");
}
}
class Lady {
private String name;
private Animal pet;
Lady(String name, Animal pet) {
this.name = name;
this.pet = pet;
}
public void myPetEnjoy() {
pet.enjoy();
}
}
public class Test {
public static void main(String[] args) {
Cat c = new Cat("catname", "blue");
Dog d = new Dog("dogname", "black");
Lady l1 = new Lady("l1", c);
Lady l2 = new Lady("l2", d);
l1.myPetEnjoy();
l2.myPetEnjoy();
}
}
![](http://i.imgur.com/0Ekqeay.png)内存分析
课时54 多态_2
课堂练习
![](http://i.imgur.com/ahwmlLx.png)分析上面的程序,体会“多态特性”对于系统可扩充性的重要性。
分析游戏物体的多态包装。游戏图
课时55 抽象类
修改课时53的代码以讲解本节课内容
abstract class Animal {
private String name;
Animal(String name) {
this.name = name;
}
public abstract void enjoy();
}
概念
- 含有抽象方法的类必须被声明为抽象类,抽象类必须被重写。
- 抽象类不能被实例化。
- 抽象方法只需声明,而不需实现。
课时56 final关键字
代码路径:java\mashibing\TestFinal\TestFinal.java
概念
- final的类不能被继承。
- final的方法不能被重写。
- final变量的值不能被改变(final的成员/局部变量)。
错误说明
课时57 interface_1
接口
概念
- 是抽象方法和常量值的定义的集合
- 从本质上讲,接口是一种特殊的抽象类,这种抽象类只包含常量和方法的定义,而没有变量和方法的实现。
特性
- 接口可以多重实现。
- 接口中声明的属性默认是public static final的;也只能是public static final。
- 接口中只能定义抽象方法,而这些方法默认为public的,也只能是public的。
- 接口可以继承其他接口,并添加新的属性和抽象方法。
- 多个无关的类可以实现同一个接口。
- 一个类可以实现多个无关的接口。
- 与继承关系类似,接口与实现类之间存在多态性。
- 定义java类的语法格式:
class [extends ] [implements [,] *]{
*
}
接口举例
interface Singer {
public void sing();
public void sleep();
}
class Student implements Singer {
private String name;
Student(Strng name) {
this.name = this.name;
}
public void study() {
System.out.println("studying");
}
public void sing() {
System.out.println("student is singing");
}
public void sleep() {
System.out.println("student is sleeping");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
课时58 interface_2
代码路径:java\mashibing\TestInterface\Valuable.java
课时59 总结
第三章总结
练习(工人、农民、国家干部实现照顾宠物的接口)
public interface Valuable {
public void feeding();
public void playing();
}
class worker implements Valuable {
public void feeding() {
System.out.println("worker is feeding the pets!");
}
public void playing() {
System.out.println("worker is playing with the pets!");
}
}
class farmer implements Valuable {
public void feeding() {
System.out.println("farmer is feeding the pets!");
}
public void playing() {
System.out.println("farmer is playing with the pets!");
}
}
class official implements Valuable {
public void feeding() {
System.out.println("official is feeding the pets!");
}
public void playing() {
System.out.println("official is playing with the pets!");
}
}