父类:public class People
{
int index = 1;
}
子类:public class Man extends People
{
int index = 2;
}
测试类:public class Start
{
public static void main(String[] args)
{
People p = new Man();
System.out.println(p.index);
}
}打印出来的为什么是父类的值啦?请问java内存是怎么分配的他们的。请详细解说。
{
int index = 1;
}
子类:public class Man extends People
{
int index = 2;
}
测试类:public class Start
{
public static void main(String[] args)
{
People p = new Man();
System.out.println(p.index);
}
}打印出来的为什么是父类的值啦?请问java内存是怎么分配的他们的。请详细解说。
解决方案 »
- 数字换成中文的大写
- Thread.currentThread().getContextClassLoader().loadClass()和Class.forName()返回的Class对象会有啥区别没?还有关于反射的安全
- ssl证书问题啊。。。。。。。。。。。keytool
- servlet文件中含有自定义包应该怎样编译?
- socket通信中while(true)的问题
- JAVA从新到主要搞WEB的步骤?
- java小应用程序中如何使用jdbc进行数据连接~??高手请进
- 各位大侠帮一下忙!!!
- 100分
- 请教小问题一个,谁知道100分相赠
- MYsql Communications link failure
- 服务器端nio的cpu 100%的疑问
void foo(Object x) {
System.out.println("Object");
}void foo(String x) {
System.out.println("Object");
}Object x = "abc";
foo(x); // 这个在编译的时候,找的是第一个方法,虽然实际上它是一个String
道理和你那个一样
People p = new Man();你可以理解为向上转型。People是父类,Man是子类,Java中子类可以向父类转型。所以p实质上的类型是People 你打印i,当然是打印的People中定义的啊。
一个是Person.index, 一个是Man.indexPeople p = new Man();
System.out.println(p.index);
System.out.println(((Man)p).index);你这样运行一下就看得很清楚了,两个index同时存在,以什么类型访问就得到该类型的index
p 在声明时虽然被new成了Man类型,但是其引用的声明还是People类型,或者说只能看的到People属性的内容,看不到Man属性相关的内容,此时如果People中如果没有index变量的话(例如修改成int indexOther = 1;),在main方法中使用p.index编译器还会报错,需要强制转换成Man类型才可以使用。这么说你更明白些了吧!
楼主的代码中没有体现“方法的重写”这一条件。
如果把上面的代码改成如下内容:People类public class People {
public void printInf() {
System.out.println("I'm People");
}
}
Man类
public class Man extends People {
public void printInf() {
System.out.println("I'm man");
}
}
测试:public class TestManPeople {
public static void main(String[] args) {
People p = new Man();
p.printInf();
}
}这次输出的结果就是“I'm man”啦!
class People
{
int index = 1;
void display(){System.out.println(index);};
}
class Man extends People
{
int index = 2;
// void display(){System.out.println(index);};
}
public class Test{
public static void main(String [] args){
People p=new Man();
p.display();
}
}结果是1
package MERAN;
class People
{
int index = 1;
void display(){System.out.println(index);};
}
class Man extends People
{
int index = 2;
void display(){System.out.println(index);};
}
public class Test{
public static void main(String [] args){
People p=new Man();
p.display();
}
}结果是2 明白了吧?
System.out.println(new Integer("23"));
System.out.println(new Char('c');懂了 System.out.println(“hello world");
就弄懂了OOP
属性没有多态,只有方法有多态,即属性是静态绑定,方法是动态绑定
当编译成字节码时
People p = new Man(); //编译器只知道p是什么类型,不知道p具体指向什么对象,只有运行期才知道
System.out.println(p.index); //所以这里编译就把p.index直接编译为固定的People类的getFiled指令,这就是所谓的静态绑定,字节码编译时就已经被写死了属性的(相对)地址。
而方法编译的时候,会编译为一个invoke_virtual指令,真正运行的时候,才会从virtual-table里查找方法的地址,然后才执行,这就是所谓的动态绑定,编译时并没有直接写死方法的调用地址
多态三要素, 类继承, 子类重写父类方法,持有子类对象的父类型引用 。 你这个是属性 木有多态,
至于你想知道具体怎么回事。 jvm 中有个方法表 ,在 解析阶段会将方法引用指向方发表。 具体解析过程你去我博客看