OPP的三个高级特性:
1.封装;
2.继承:子类继承父类;
3.多态;
一、多态(polymorphism):子类的对象可以替代父类的对象使用;
原理:同一类事物,可以拥有多种不同的形态;
代码理解:父类的引用可以指向子类的对象;
例:
1.Person p = new Person();主类
Student s = new Student();子类
Person p = s;
Teacher t = new Teacher();子类
Programmer coder = new Programmer();子类
p = t;
p = coder;
2.Animal a = new Cat();主类
a = new Dog();子类
二、特点:
1.只要是主类的子类,都可以把子类的对象赋值给父类的对象(父类的引用(或父类类型的变量)可以指向子类的对象;),即多态性;
2.一个变量只有一种数据类型
3.一个引用类型变量可能指向(或引用)多种不同类型的对象;
4.一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能访问子类中添加的属性和方法;
三、理解多态
父类的引用可以指向子类的对象;
多态的好处:提高扩展性;
缺点:多态中不能直接调用子类新添的属性和方法;
例:
Person p;无论给p赋值的类型是什么(Teacher,Programmer,Worker,Student),都只能使用Person中定义的方法和属性;
四、虚方法:
1.虚方法指的就是子类重写的方法;
2.虚方法优先级大于父类原方法;
五、两种类型
1.编译时类型:定义变量时使用的类型;
2.运行时类型:执行代码时给变量赋值时使用的类型;
例:
Person p = new Student();
编译类型:Person;
运行类型:Student;
六、强制转型
向下转型:
在继承关系下,类是有层次的,上面的是父类,下面的是子类;
如果将学生类型转成大学生类型需要向下转换,即强制转换,强制转换可能会产生转换异常;
用例及解释:
//用多态调用Student中的方法:向下转换(强制转换) Person per = new Student("无敌");//可以存储更丰富的类型,Person,Teacher,Student; Student stu = (Student) per ;// 并非把P转成studnet类型了,其实p本来就是student,但是可以调用student类新添的方法; //Account acc = (Account) per;//不可转换,不能将编译类型转换成与运行类型不一致的类型;
if(per instanceof Student){//判断p是否可以向下转换为学生类型; System.out.println("是"); ((Student)per).study(); }
七、向上转型
向上转型:在Java中,向上转型(upcasting)是指将子类的对象引用赋值给父类的对象引用变量。这样做是安全的,因为子类对象可以被视为父类对象。通过向上转型,可以访问父类中的公有和受保护的成员变量和方法,但不能访问子类特有的私有成员。
下面是一个简单的示例,演示了如何进行向上转型: class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("The dog barks");
}
}
public class UpcastingExample {
public static void main(String[] args) {
Dog myDog = new Dog(); // 创建Dog对象
Animal myAnimal = (Animal) myDog; // 向上转型为Animal类型
myAnimal.makeSound(); // 调用Animal的makeSound方法
}
}
八、instanceof运算符
1.作用:判断某个对象是否是某个类的实例;
2.语法:
if(p instanceof Student){
}//p是否是Student类型的实例
如果类型转换失败,将会产生一个ClassCastException异常;