今天老师讲了Java的重载与重写,小小的record一下...
先定义父类person与子类student,其中包含change方法的重载与子类对父类方法的重写。
class Person{
String name= "parents";
String change(String name){
name=name+"1";
return name;
}
String change(String name,int number){
name=name+number;
return name;
}
}
class Student extends Person {
String name= "child";
String change(String name){
name=name+"2";
return name;
}
String change(String name,int number){
name=name+number+number;
return name;
}
}
再把子类对象赋给父类变量
public class testproject{
public static void main(String[] args) {
Person one=new Student();
System.out.println(one.change(one.name));
System.out.println(one.change(one.name,0));
}
}
结果如下
parents2
parents00
可以看到调用的都是子类重写与重载的方法,但当你注释掉没被调用的父类的方法时,编译显示不通过!!被报错:没有为类型 Person 定义方法 change
强行运行就会抛出异常
Exception in thread "main" java.lang.Error: 无法解析的编译问题:
没有为类型 Person 定义方法 change(String)
没有为类型 Person 定义方法 change(String, int)
说明编译器编译时只关注定义的变量的类型,但并不看它真正指向的对象!
虽然子类的方法重写会覆盖父类方法,但定义相同的变量却不会覆盖父类的变量!父类仍会保持它的原属性!如下面代码所示:
public class testproject{
public static void main(String[] args) {
Person one=new Student();
System.out.println(one.name);
}
}
其结果为
parents
另外,作为函数参数时,也只看变量的类型,不关注它所指的对象,如下面代码所示:
public class testproject{
public static void main(String[] args) {
Person one=new Student();
sayhello(one);
}
public static void sayhello(Person one) {
System.out.println("hello,parents!");
}
public static void sayhello(Student one) {
System.out.println("hello,child!");
}
}
其结果为
hello,parents!