1.面向对象的三个主要特征
1.封装:外部无法访问,保护类中的操作不会被外部访问
2.继承:扩展类的功能 子类继承父类的方法
3.多态:是Java中最重要的点。要想实现多态性,必须要有封装、继承、父类对象引用子类对象,向上向下转型。
在成员变量中,父类对象引用子类对象的时候,调用的是父类中的成员变量
/**
* 在成员变量中,父类引用对象指向子类对象的时候,调用的是父类中的变量
* @author hasee
*
*/
public class Demo02 {
public static void main(String[]arg){
Animal02 a=new Dog02();
System.out.println(a.age);
}
}
class Animal02{
int age=10;
public void eat(){
System.out.println("动物在"+"eat");
}
}
class Dog02 extends Animal02{
int age=20;
public void eat(){
System.out.println("狗在"+"eat");
}
}
输出结果:
在成员方法中,父类对象引用子类对象的时候,调用的是子类中的成员方法(前提是子类覆写了父类的方法)
// 在成员方法中,父类引用对象指向子类对象的时候,调用的是子类中的方法
public class Demo01 {
public static void main(String[]arg){
/*Animal animal=new Animal();
animal.eat();*/
Animal01 a=new Dog01();//父类声明引用对象,指向子类对象
a.eat();//父类调用子类的方法
}
}
class Animal01{
public void eat(){
System.out.println("动物在"+"eat");
}
}
class Dog01 extends Animal01{
public void eat(){
System.out.println("狗在"+"eat");
}
public void aaa(){
System.out.println("狗在"+"eat");
}
}
输出结果:
在静态方法中,父类对象引用子类对象的时候,调用的是父类中的静态方法
/**
* 在静态成员方法中,父类引用对象指向子类对象的时候,调用的是父类中的静态方法
* @author hasee
*
*/
public class Demo03 {
public static void main(String[]arg){
Animal03 a=new Dog03();
a.say();
}
}
class Animal03{
int age=10;
public static void say(){
System.out.println("Aniam:"+"我是谁");
}
}
class Dog03 extends Animal03{
int age=20;
public static void say(){
System.out.println("Dog:"+"我是狗");
}
}
输出结果:
向上转型:向上转型后父类的引用所指向的属性是父类的属性,如果子类重写了父类的方法,那么父类引用指向的或者调用的方法是子类 的方法,这个叫动态绑定。
向下转型:向下转型就是父类中没有这个方法,而子类中有这个方法,需要向下转型调用这个方法(前提是要先向上转型,不然会报错)
/**
* 向上转型和向下转型
*向上转型不要强制转型
*向上转型后父类的引用所指向的属性是父类的属性,
*如果子类重写了父类的方法,那么父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定。
*
*但是如果非要使用子类的方法那就需要向下转型,只有先经过向上转型的对象才能继续向下转型。不然需要使用instanceof进行判断
*
*/
public class Demo04 {
public static void main(String[]arg){
Animal04 a=new Dog04();
a.eat();//向上转型 自动转
if(a instanceof Dog04){//首先需要判断一下
Dog04 dog = (Dog04) a;//向下转型,强制转
dog.play();
}
}
}
class Animal04{
int age=10;
public void eat(){
System.out.println("动物在"+"eat");
}
public static void say(){
System.out.println("Aniam:"+"我是谁");
}
}
class Dog04 extends Animal04{
int age=20;
public void eat(){
System.out.println("狗在"+"eat");
}
public static void say(){
System.out.println("Dog:"+"我是狗");
}
public void play(){
System.out.println("狗仔完游戏");
}
}
运行结果: