Java------子类、父类继承、静态方法等等
纸上得来终觉浅
父类:
public class dogs {
private Integer id;
private String name;
public void call(){
System.out.println("dogs.....dogs.......dogs.....dogs.....dogs....dogs....");
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
子类:
public class dog extends dogs{
private Integer id;
public void call(){
System.out.println("dog..dog....dog....dog..dog.....dog....dog.........");
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
测试:
public class Test {
public static void main(String[] arge) {
dog dog = new dog();
dog.setId(1);
dog.setName("哈哈");
System.out.println(dog.getId()+".........."+dog.getName());
dog.call(); //输出结果:dog..dog....dog....dog..dog.....dog....dog.........
dogs dogs = new dog();
dogs.call(); //输出结果:dog..dog....dog....dog..dog.....dog....dog.........
}
}
这是最基础的案例:子类继承父类的方法,以及属性。
上述案例中:父类具有一个私有name,但是有共有的getName,setName方法。子类dog并没有name属性,但是通过使用setName、getName方法给子类dog给它个Name。
疑问:如果没有getName方法,setName方法,子类能否获取父类的name?
dog dog = new dog();
dog.setId(1);
System.out.println(dog.getId()+".........."+dog.name);
答案是不能的。
当把getName、setName方法改为private时,dog也是无法调用这些方法。
也就是子类并不能继承父类私有的属性或方法。但是子类的对象是包括子类所不能从父类中继承的私有成员的。因为我们能够通过public getName给子类dog添加上父类的私有属性。
疑问:子类能否重写父类的静态方法?
将父类和子类中的call方法都改为静态方法。
Dog dog = new dog();
dog.call(); //dog..dog....dog....dog..dog.....dog....dog.........
Dogs dogs = new dog();
dogs.call();//dogs.....dogs.......dogs.....dogs.....dogs....dogs....
//此时和通过类名.方法名调用的结果一样,也就是子类并没有重写父类的方法名
由此可见,子类并不能够重写父类的静态方法,
Dogs dogs = new dog();
dogs在调用普通方法时,执行的子类方法,在调用静态方法是,则执行父类方法。
在运行时期,将根据dogs 这个对象引用实际的类型来获取对应的方法。所以才有多态性。一个基类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。