这个问题,本人曾经在程序中遇到过,并且抛出了NullPointerException
主要问题是:
在泛型的练习中,继承的时候,如果加上了这句话,并且在子类中复写了父类中的,getName方法那么
在执行的时候,使用了子类的getName方法,但是在进行比较的时候却使用了父类的方法,也就是说使用了父类
的name,由于子类没有使用父类的方法去初始化name,也就是说这两个name,不是同一个,父类中的name = null。
所以在比较的时候出现了NullPointerException,
但是如果子类中没有定义自己的 name属性,编译器就会报错
当然这样的问题出现的概率还是比较小,这是由于个人的粗心发现的问题,个人的总结是:
1.在继承中,如果子类在继承父类的时候从父类获取的方法,没有特殊功能或扩展时,就不要复写,
当然大多数是自己粗心,或者copy代码的时候造成的,本人就是。
2.父类已经定义的属性,子类就不要再定义了,纯属多余
个人发现的小问题,希望对楼主有所帮助- import java.util.Comparator;
- import java.util.Iterator;
- import java.util.TreeSet;
- class Person5 {
- private String name;
- Person5(String name) {
- this.name = name;
- }
- public String getName() {
- return name;
- }
- }
- class Student5 extends Person5 implements Comparable<Person5>// <? super
- // E>接收E及E的父类型,这里的E指Student
- {
- private String name;
- Student5(String name) {
- super(name);
- }
- //返回的是子类的name,而初始化的是父类的name;
- //切记:没有实现特别需求时不用覆盖
- /*public String getName(){
- Return name;
- }
- */
- public int compareTo(Person5 s) {
- return this.getName().compareTo(s.getName());
- }
- }
- // 因为是继承关系,所以子类有父类的方法,如果类型定义为父类,
- // 那么使用的是父类方法,所以可以传入父类,一般也应该定义为父类
- //那么整个继承体系都可以使用该比较器,提高了扩展性
- class Comp implements Comparator<Person5> // <? super E>接收E及E的父类型,这里的E指所传入的继承体系中的子类型
- {
- public int compare(Person5 p1, Person5 p2) {
- // Person s1 = new Student("abc1");
- return p1.getName().compareTo(p2.getName());
- }
- }
- class GeneticDemo {
- public static void main(String[] args) {
- TreeSet<Student5> ts = new TreeSet<Student5>(new Comp());
- ts.add(new Student5("abc1"));
- ts.add(new Student5("abc8"));
- ts.add(new Student5("abc5"));
- ts.add(new Student5("abc3"));
- Iterator<Student5> it = ts.iterator();
- while (it.hasNext()) {
- System.out.println(it.next().getName());
- }
- }
- }
复制代码 |