多态
子类类型赋值给父类 Father f1 = New Son(),
调用子类方法报错。 调用父类方法OK。这个就是多态
public class goodStudy{public static void main(String[] args) {ArrayList list = new ArrayList();// 子类类型赋值给父类Person u1 = new User();// 调用子类方法报错u1.testUser(); // 这里会报错}
}
class Person{public void testPerson(){System.out.println("我是person");}
}
class User extends Person{public void testUser(){System.out.println("我是testUser");}
}
为啥会报错
package goodStudy;
//ArrayList在java--> util包中
import java.util.ArrayList;
// LinkedList也在java--> util包中
import java.util.LinkedList;public class goodStudy{public static void main(String[] args) {ArrayList list = new ArrayList();User u1 = new User();Person p1 = new Person();list.add(u1);list.add(p1);// 我们发现取出来会报错?为什么呢User uuu = list.get(0);}
}class Person{public void testPerson(){System.out.println("我是person");}
}
class User extends Person{public void testUser(){System.out.println("我是testUser");}
}
为啥会报错:因为我们存储的时候没有约束类型。所以取出来的时候会报错
如何处理
我们可以把它声明为 Object类型,就不会报错了
ArrayList list = new ArrayList();
User u1 = new User();
Person p1 = new Person();
list.add(u1);
list.add(p1);
// 我们可以把它声明为 Object类型
Object uuu = list.get(0);
为啥不能够调用方法
package goodStudy;
//ArrayList在java--> util包中
import java.util.ArrayList;
// LinkedList也在java--> util包中
import java.util.LinkedList;public class goodStudy{public static void main(String[] args) {ArrayList list = new ArrayList();User u1 = new User();Person p1 = new Person();list.add(u1);list.add(p1);Object uuu = list.get(0);// 这里调用方法会报错uuu.testUser();}
}
class Person{public void testPerson(){System.out.println("我是person");}
}
class User extends Person{public void testUser(){System.out.println("我是testUser");}
}
因为:也是我们在存储的时候没有约束类型。
怎么处理呢? 强制类型的转换
如果想要执行对象u1的方法,需要进行强制类型的转换
package goodStudy;
//ArrayList在java--> util包中
import java.util.ArrayList;
// LinkedList也在java--> util包中
import java.util.LinkedList;public class goodStudy{public static void main(String[] args) {ArrayList list = new ArrayList();User u1 = new User();Person p1 = new Person();list.add(u1);list.add(p1);// 我们发现取出来会报错?为什么呢Object uuu = list.get(0);// 强制转换,把uu是Object类型转换为User类型User uu = (User)uuu;// 现在就不会报错了uu.testUser();}
}
class Person{public void testPerson(){System.out.println("我是person");}
}
class User extends Person{public void testUser(){System.out.println("我是testUser");}
}
判断是否是某个类型 instanceof
public class goodStudy{public static void main(String[] args) {User u1 = new User();// 判断u1是否是User 类型if(u1 instanceof User){System.out.println("u1是User类型");}}
}class Person{public void testPerson(){System.out.println("我是person");}
}
class User extends Person{public void testUser(){System.out.println("我是testUser");}
}
如何约束集合list只能存放某一种(User)类型
package goodStudy;
//ArrayList在java--> util包中
import java.util.ArrayList;
// LinkedList也在java--> util包中
import java.util.LinkedList;public class goodStudy{public static void main(String[] args) {// 约束集合类型只能存放User类型的数据ArrayList<User> list = new ArrayList();User u1 = new User();Person p1 = new Person();list.add(u1);// list.add(p1); 存放Person就会报错的// 现在取数据肯定是User类型的了User u = list.get(0);// 调用User类型的方法u.testUser();}
}class Person{public void testPerson(){System.out.println("我是person");}
}
class User extends Person{public void testUser(){System.out.println("我是testUser");}
}
java集合中为啥要引入泛型
1,类型安全,集合中存储Object类型,在我们取出来的时候,需要进行类型转化,不仅繁琐还容易出现问题。
2,提高代码可读性和维护性,当你看到List<User>时,可以立即知道这个列表存储的是User对象
对象和泛型的区别
用于约束外部对象的使用场景就是类型
用于约束内部对象的使用场景就是泛型
有些时候也把泛型称为类型参数
public class goodStudy{public static void main(String[] args) {// 现在,MyCont这里是被修饰了的。只能存放 Novel类型的MyCont<Novel> my =new MyCont();// 因为Object不是Novel类型的,所以会报错my.data = new Object(); // 会报错// my.data = new Novel();// 不会报错}
}class MyCont<C>{public C data;
}class Novel{}
泛型不存在多态的使用
public class goodStudy{public static void main(String[] args) {// 现在,MyCont这里是被修饰了的。只能存放 Novel类型的MyCont<Novel> my =new MyCont();// 为啥这里会报错呢?// 因为:类型存在多态的使用,泛型不存在多态的使用test(my);}// MyCont类型,约束是对象类型的public static void test(MyCont<Object> cont){System.out.print("hiehie");}
}class MyCont<C>{public C data;
}class Novel{}
分析上述问题
public static void test(MyCont<Object> cont){System.out.print("hiehie");
}
在这一行代码中,MyCont类型的使用 Object 进行约束。
虽然MyCont<Novel> my =new MyCont(); 中my是Object类型的子类型。
但是:在泛型不存在多态的使用。所以就会存在问题
我们可以理解为:
用水果袋子去装水果,正常来说:去装苹果香蕉没有问题,但是我买了一个榴莲。
装水果的袋子就等同于装榴莲的袋子吗? 不等同对吧。
所以:泛型不存在多态的使用。