1:java继承就是子类拥有父类的一切(感觉就是为了偷懒),子类还可以扩大父类的权限
2:子类重写父类的时候,子类权限>=父类,静态只能覆盖静态,
子类第一行有隐试super()访问父类中默认的构造方法,构造方法至少有一个会去访问父类
父类中数据子类可以直接获取,对象在建立的时候,会先查看父类是如何初始化的,再初始化子类的构造方法
属性只能被继承,不能被重写,因为属性是在编译阶段就被确定好了的
3:重载只看同名函数的参数列表(类型,顺序,个数),重写的返回类型方法名参数列表要一样,就方法主体不一样
package extendsDemo;
public class Animal {
String name = "Animal";
public Animal() {
System.out.println("animal constr");
}
public Animal(String name) {
System.out.println(name + "animal constr");
}
public void move() {
System.out.println("animal move");
}
public void run() {
this.move();//执行的是子类的move方法,this指当前对象
} //可以写成move();这个是默认的this
//都是先在子类里面找,找不到就父类里面找
public void eat() {
System.out.println("eat " + name);
}/*即使改成this。name,输出也是eat dog,因为属性只能被继承*/
}
package extendsDemo;
public class Dog extends Animal {
String name = "dog";
public Dog() {
/*super(name);错误的--子类还没创建就传就给了父类,这句话
相当于把子类当前对象name传给了父类,就是在创建你父亲时
就把你儿子东西给了他,可以换成super(xxx)。
因为这个不是当前对象的全局变量*/
System.out.println("dog constr");
}
public void move() {
System.out.println("dog move " + super.name);
}//可以在子类使用super来访问父类,就是要使用父类的name
//如果想再子类调用eat方法,直接在方法主体加上eat()
public void move(String name) {
System.out.println("dog move");
}
}
package extendsDemo;
public class TestDog {
public static void main(String[] args) {
Dog dog = new Dog();
dog.run();
dog.eat();
}
}