import org.omg.CORBA.PUBLIC_MEMBER;
public class Girl {
public Girl(){}//空参构造方法
/*public void play(Cat cat){
System.out.println("女孩跟"+ cat.getPetName() + "玩");
}
public void play(Dog dog){
System.out.println("女孩跟"+ dog.getPetName() + "玩");
}*/
public void play(Pet pet) { //将值传入一个Pet类型的惨数里, //多态(继承的多态)
//调用同一个方法,根据不同对象传值,而得出不同的结果
System.out.println("女孩子跟" + pet.getPetName() + "一起玩");
//来判断该引用类型变量(pet)所“指向”的对象(Cat)是否属于该类或该类的子类
if(pet instanceof Cat){
//如果是猫 猫叫
//不行:cry 是猫类的方法 pet 是Pet类的对象引用,Pet类没有cry方法
//pet.cry();
//向下转型
Cat cat = (Cat)pet;
cat.Cry();
}
//如果是狗 给骨头啃
if (pet instanceof Dog){
Dog dog = (Dog)pet;
dog.eat();
}
}
public static void main(String [] args ) {
Girl girl = new Girl();//创建女孩这个对象
Cat cat = new Cat();//创建猫这个对象
cat.setPetName("咪咪");//把名字给他,传回去setPetName方法那里。
girl.play(cat);//女孩和猫的交互,数据传入play这个方法里,然后输出。
Dog dog = new Dog();
dog.setPetName("旺财");
girl.play(dog);
}
}
package com.lijie.lianxi1;
public class Pet {
public String petName;
public String petColor;
public String getPetName() {//定义好成员变量后,Shift+alt+s,界面出来后按r键使用get,set方法
return petName;
}
public void setPetName(String petName) {
this.petName = petName;
}
public StringgetPetColor() {//获取petcolor值
return petColor;
}
public void setPetColor(String petColor) {//初始化petcolor值
this.petColor = petColor;
}
public void petMethod(){
System.out.println("Pet.petMethod()");
}
public void method(){
System.out.println("Pet.method()");
}
public static void main(String[] args) {
}
}
package com.lijie.lianxi1;
public class Dog extends Pet {
//Dog dog = new Dog();//有个默认的构造方法,如果要调用,就会与dog对象形成死循环
public Dog(){}
public void eat(){
System.out.println("给狗骨头吃");
}
public void dogMether(){ //重写父类的方法,拓展所需要的功能
System.out.println("Dog.dogMether");
}
public void mether(){ //重写父类的方法,拓展所需要的功能
System.out.println("Dog.mether ");
}
public static void main(String[] args) {
//向上转型 自动的
// 子类转父类
//知识点1: 可以访问父类的属性、方法,但是无法访问子类的属性或者方法
Pet dog1 = new Dog(); //因为创建的对象是赋值给Pet这个属性
dog1.petName = "宠物狗。。";
System.out.println(dog1.petName);//所以打印是.petName而不是.dogName。
//知识点1
//System.out.println(dog1.dogName);出错
//知识点2:
// java 程序运行包括2步:
// 1、编译, dog1 当做Pet对象进行编译, 因为 pet类中没有dogName 属性,所以
// 打印dog1.dogName 是报错
// 2、执行的时候, dog1 指向的new Dog() 即开辟的空间是 Dog 所以 dog1.method()
// 执行的是 dog类定义 method方法
// Dog.method()
dog1.method();//调用的是父类的方法,因为上面new的对象的属性属于Pet。否则调用的是本类中的方法
//向下转型 强制性的
// 父类类型转为子类型需要显示转换
//java.lang.ClassCastException: com.qianfeng.day09.demo4.Pet
//cannot be cast to com.qianfeng.day09.demo4.Dog
//Dog dog = (Dog) new Pet();
//dog.dogMethod();
//dog.method();
//强转注意点:必须明确知道,父类变量具体指向与哪一个子类类型,才能强转
//如果,直接将父类型转换为子类型,会报异常:java.lang.ClassCastException
Pet pet = new Dog();//要先把Dog属性转为Pet属性,再强转。
Dog dog = (Dog)pet;
}
}
package com.lijie.lianxi1;
import java.security.CryptoPrimitive;
public class Cat extends Pet {
public Cat(){}
public void Cry(){
System.out.println("喵喵叫了");
}
}