如下程序的输出,为什么是:MyPerson?!
class MyPerson {
public void mydisplay(int abc)
{
System.out.println("MyPerson");
}
}class subMyPerson extends MyPerson{
public void mydisplay(char abc)
{
System.out.println("SubMyPerson");
}
}public class MyTestProject {
public static void main(String[] args) {
char i1 = 100;
MyPerson mytemp = new subMyPerson();
mytemp.mydisplay(i1);
}
}
class MyPerson {
public void mydisplay(int abc)
{
System.out.println("MyPerson");
}
}class subMyPerson extends MyPerson{
public void mydisplay(char abc)
{
System.out.println("SubMyPerson");
}
}public class MyTestProject {
public static void main(String[] args) {
char i1 = 100;
MyPerson mytemp = new subMyPerson();
mytemp.mydisplay(i1);
}
}
{
public void mydisplay(int abc)
{
System.out.println("MyPerson");
}
}
//子类
class subMyPerson extends MyPerson
{
public void mydisplay(char abc)
{
System.out.println("SubMyPerson");
}
}
public class MyTestProject
{
public static void main(String[] args)
{
char i1 = 100;
/**
* @author 不再悲伤
* 首先我得强调类中的函数是被重写过的;然后
* 该subMyPerson类开辟一块内存给mytemp,然后
* 被强制转化成Myperson类型。这样会导致原类会丢失
* 一些东西,比如函数,此时启用原函数
*/
MyPerson mytemp = new subMyPerson();
mytemp.mydisplay(i1);
}
}
//输出结果:MyPerson
结果应当为:MyPerson
SubMyPerson
并且因为是父类引用 所以子类特有的方法对于对象是不可见的 故无法调用subMyPerson的方法
public void mydisplay(int abc)
{
System.out.println("MyPerson");
}
}class subMyPerson extends MyPerson{
public void mydisplay(char abc)
{
System.out.println("SubMyPerson");
}
}public class MyTestProject {
public static void main(String[] args) {
char i1=100;
MyPerson mytemp = new subMyPerson();//可以这么理解 MyPerson mytemp确定申明的是MyPerson ,使用subMyPerson对象进行赋值,即覆盖!由于在MyPerson申明中没有mydisplay(char abc)的申明因此无法覆盖,只能作为重载。若把mydisplay(char abc)改成mydisplay(int abc)此时MyPerson中有mydisplay(int abc 的申明)因此可以覆盖。这就是覆盖和重载的区别! mytemp.mydisplay(i1);
}
}
MyPerson 只知道有 mydisplay(int abc) 这个方法.
你叫它怎么执行 mydisplay(char abc)方法呢?
mytemp 是一个上转型对象(就是这样定义的,具体的上转型对象解释自己翻书)首先看下特点:
上转型对象不能操作子类新增的成员变量(失掉了这部分属性);
不能使用子类新增的方法(失掉了一些功能)。
上转型对象可以操作子类继承或者隐藏的成员变量,也可以使用子类继承的或者重写的方法。
上转型对象操作子类继承或重写的方法,其作用等价于子类对象去调用这些方法。
因此,如果子类重写了父类的某个方法,则当对象的上转型对象调用这个方法时一定是调用了这个重写的方法从21楼重写要满足的条件我们知道,这不是重写。
于是,子类的mydisplay(char abc)方法属于是子类新增加的方法,所以mytemp永远不可能执行子类的这个方法。所以,在父类没有mydisplay(char abc)这个方法的时候,Char类型自动转换为int型,执行父类的mydisplay(int abc)方法。如果把父类的方法改成mydisplay(String abc),类型转换失败,程序就会出错,并不是跟楼上所说那样先执行父类后执行子类。
public void mydisplay(int abc)
{
System.out.println("MyPerson");
} public void mydisplay(char abc)
{
System.out.println("Char in MyPerson");
}
}那么jvm会根据输入参数的精度调用最合适的方法。如下:char i1 = 65535;
Fa s = new Son();
s.mydisplay(i1); //invokevirtual MyPerson.mydisplay:(C)V
int i2 = 2;
s.mydisplay(i2); //invokevirtual MyPerson.mydisplay:(I)V
1、覆盖你类的方法。@override
1.应用在一个类的内部;
2.方法的名称相同,参数个数,类型不同比如:public class Book {
String press;
String bookName;
public Book()
{
System.out.println("无参数!");
}
public Book(String press)
{
System.out.println("本书出版社的名称是::"+press);
}
public Book(String bookName,String press)
{
this.bookName=bookName;
this.press=press;
System.out.println("本书的名称是::"+bookName);
System.out.println("本书出版社名称是:"+press);
}
public static void main(String args[])
{
Book book1= new Book();
Book book2=new Book("任命出版社");
Book book3= new Book("JAVA","人民出版社");
}
}
方法重写:
1.应用在父,子类继承关系中;
2.方法重写不仅要求子类与父类的方法同名,而且方法的参数类型、个数以及方法的返回值类型都要与父类一致。
比如:
//定义父类Animal
public class Animal {
private String name;
public Animal(String name)
{
this.name=name;
}
//定义printInfo方法,用于输出animal的名称
public void printInfo(Animal animal)
{
System.out.println("My name is:"+animal.getName());
}
private String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
}
//定义子类Cat继承Animal
public class Cat extends Animal {
private String name;
public Cat(String name)
{
super(name);
this.name=name;
}
//Cat中的printInfo方法重写了父类Animal中的printInfo方法
public void printInfo(Cat cat)
{
System.out.println("My name is:"+cat.getName());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//定义子类Dog继承Animal
public class Dog extends Animal
{
private String name;
public Dog(String name)
{
super(name);
this.name=name;
}
//Dog中的printInfo方法重写了父类Animal中的printInfo方法
public void printInfo(Dog dog)
{
System.out.println("My name is:"+dog.getName());
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
//测试类Test
public class Test {
public static void mian(String args[])
{
Animal animal1 = new Cat("小花");
Animal animal2 = new Dog("阿明");
animal1.printInfo(animal1);
animal2.printInfo(animal2);
}}
在子类中而言,只能算是函数的重载 重载和重写的定义是不一样的 先在书上看下概念吧
public void mydisplay(int abc)
{
System.out.println("MyPerson");
}
}class subMyPerson extends MyPerson{
public void mydisplay(int abc)
{
System.out.println("SubMyPerson");
}
}public class MyTestProject {
public static void main(String[] args) {
char i1 = 100;
MyPerson mytemp = new subMyPerson();
mytemp.mydisplay(i1);
}
}输出
SubMyPerson输出完成 (耗时 0 秒) - 正常终止-----------------------------------------------------------------------------
class MyPerson {
public void mydisplay(int abc)
{
System.out.println("MyPerson");
}
}class subMyPerson extends MyPerson{
public void mydisplay(int abc)
{
System.out.println("SubMyPerson");
}
}public class MyTestProject {
public static void main(String[] args) {
char i1 = 100;
subMyPerson mytemp = new subMyPerson();
mytemp.mydisplay(i1);
}
}输出SubMyPerson