二十一、对象的转型(重要)面向对象多态性的体现
1.对象的向上转型
向上转型:将子类的对象赋值给父类的引用;
Student s = new Student();
Person p = s;
这两句也可以这样写: Person p = new Student();
一个引用能调用那些成员(变量和函数),取决于这个引用的类型;但是它调用哪一个变量和函数,取决于这个引用所指向的对象。
public class Test{
public static void main(String[] aegs){
//Student s = new Student();
//Person p = s;
p.name ="lisi";
p.age = 20;
s.address ="bj";
s.introduce();
p.introduce();
}
}
运行结果
2.对象的向下转型
将父类的对象赋值给子类的引用;(向下转型的前提是向上转型)
Student s1 = new Student();
Person p = s1;
Student s2 = (Student)p; //必须强制类型转换。
public class Test{
public static void main(String[] args){
Person p = new Student();
Student s = (Student)p;
//错误的向下转型:因为不是所有的Person对象都是Student.就像不是所有的long都是int一样。
//Person p = new Person();
//Student s = (Student)p;
}
}
二十二、面向对象应用(一)
面向对象需要解决的问题就是:如何适应需求的不断变化。
例子:HP打印机、佳能打印机:可以抽象出一个打印机类,把重复的成员方法放在父类;各个子类,添加或者重载函数;
1.如果碰到定义两个类,成员方法有重复的时候,尝试使用继承,把重复代码集中到父类上;
2.不管碰到任何有重复代码的情况,要有意识去去除重复代码。
二十三、抽象类和抽象函数
1.抽象函数的语法特征
什么是抽象函数:只有函数的定义,没有函数体的函数被称为抽象函数;(函数的定义:返回值类型、函数名和参数列表组成。)
abstract void fun();
2.抽象类的语法特征
什么是抽象类:使用abstract定义的类;
抽象类特点:1)不能够生成对象; 2)如果一个类当中包含有抽象函数,那么这个类必须被声明为抽象类; 3)。抽象类中也可以没有抽象函数。
abstract class Person{
String name;
int age;
void introduce(){
System.out.println("my name is "+name+ ", age is" + age);
}
abstract void eat();
}
abstract class Person{
String name;
int age;
void introduce(){
System.out.println("my name is "+name+ ", age is" + age);
}
abstract void eat();
}
3.抽象类的作用
抽象类是一个基类,用来作为父类,子类复写父类中的抽象函数;
抽象类不能生成对象,但是可以拥有构造函数;不能直接调用抽象类的构造函数生成对象,但是抽象类的子类可以调用抽象类的构造函数(super():)
abstract class Person{
String name;
int age;
Person(){
}
Person(String name, int age){
this.name = name;
this.age = age;
}
void introduce(){
System.out.println("my name is "+name+ ", age is" + age);
}
abstract void eat();
}
class chinese extends Person{
String address;
chinese(){
//super(); 如果没有加这句,编译器会自动加上。
}
chinese(String name, int age, String adress){
super(name,age);
this.address =address;
}
void eat(){
System.out.println("eat with chopsticks");
}
}
二十四、为什么用抽象类
抽象类表达了一种概念。
抽象类的作用:在每个子类某个函数的方法体都不一样的时候,父类将此函数写为抽象函数,强制子类将此函数复写。
如果一段代码在语义上是有错误的,那么在语法上也应该是有错误的。这是未实现的。所有写代码的时候要注意语义和语法的统一。