永发信息网

java 类

答案:7  悬赏:20  手机版
解决时间 2021-05-06 02:49
  • 提问者网友:轻浮
  • 2021-05-05 23:21

我写了程序如下

class Person
{
String name;
int age;

Person()
{
System.out.println("调用了个人构造方法Person()");
}

void SetNameAge(String name, int age)
{
this.name=name;
this.age=age;
}

void show()
{
System.out.println("Person类中的name和age值为:"+name+"\t"+age+"岁");
}
}

class Student extends Person
{
String department;

Student()
{
System.out.println("调用了学生构造方法Student()");
}

void SetDepartment(String dep)
{
department=dep;
System.out.println("department="+department);
}
}

public class app1
{
public static void main(String [] args)
{
Student stu=new Student();
//Person stu=new Student();
stu.SetNameAge("袁启", 20);
stu.show();
stu.SetDepartment("菊苑");
}
}

上面代码Student stu=new Student();换成Person stu=new Student();会报错(我不知道为什么),需要将代码改正如下:

class Person
{
String name;
int age;

Person()
{
System.out.println("调用了个人构造方法Person()");
}

void SetNameAge(String name, int age)
{
this.name=name;
this.age=age;
}

void show()
{
System.out.println("Person类中的name和age值为:"+name+"\t"+age+"岁");
}

public void SetDepartment(String string) {
// TODO Auto-generated method stub

}
}

class Student extends Person
{
String department;

Student()
{
System.out.println("调用了学生构造方法Student()");
}

public void SetDepartment(String dep)
{
department=dep;
System.out.println("department="+department);
}
}

public class app1
{
public static void main(String [] args)
{
//Student stu=new Student();
Person stu=new Student();
stu.SetNameAge("陈祥", 20);
stu.show();
stu.SetDepartment("菊苑412");
}
}

谁能告诉我Student stu=new Student();换成Person stu=new Student();
有什么区别吗?它们常常用于什么情况?

程序很简单的,但那个知识点我不懂,希望谁能帮我解决以下,谢谢

最佳答案
  • 五星知识达人网友:过活
  • 2021-05-06 00:13

换一种说法:你可以把Person父类看作是char型数据(占一个字节的大小,不同的系统会有所不同),继承Person的Student子类看作是int型数据(占2个字节)


你完全可以把一个char型的数据赋给int型的数据,而不会引起数据失真,而如果你把一个int型的数据赋给一个char型的数据时它的高8位就会被丢弃。


也就是说,Student子类的数据成员继承了父类的数据成员相当于:把父类的东西复制了一份到子类的最前面,所以当你用Person stu=new Student();时new的是Student类,当你把它赋给它的父类时,因为stu对象只能存放Person大小的数据,所以属于Student类的东西就没有取过来,它还是相当于Person stu=new Person();也就相当于上面的数据失真,而这里的失真是允许的。。。反过来Student stu=new Person();把new生成的父类赋给子类则是不合法的,因为这样导致的结果就是后面的数据域将会是随机填充的,所以这是不合法的,编译器不允许这样的定义。


总而言之,Person stu=new Student();就相当于Person stu=new Person(),你后面的程序把SetDepartmet方法移到父类Person中,stu引用自已本身有的方法当然是可以的了,而你一开始的程序就相当于生成的Person类去引用子类的方法,当然就出错了!

全部回答
  • 1楼网友:孤独入客枕
  • 2021-05-06 05:24

简单的来说多态是与继承相对的,在java中犹豫程序的严谨性,所以一个子类只能继承一个父类,但是想要用一个实例来调用多个不同的方法来实现的时候就要用到多态如:

//父类 public class Father{ //父类有一个打孩子方法 public void hitChild(){} } //子类1 public class Son1 extends Father{ //重写父类打孩子方法 public void hitChild(){ System.out.println("为什么打我?我做错什么了!"); } } //子类2 public class Son2 extends Father{ //重写父类打孩子方法 public void hitChild(){ System.out.println("我知道错了,别打了!"); } } //子类3 public class Son3 extends Father{ //重写父类打孩子方法 public void hitChild(){ System.out.println("我跑,你打不着!"); } } //测试类 public class Test{ public static void main(String args[]){ Father father; father = new Son1(); father.hitChild(); father = new Son2(); father.hitChild(); father = new Son3(); father.hitChild(); } }

在这里首先利用Father 类的参数传入,等到要调用具体的类的时候才根据实际创建的对象类型动态决定使用哪个方法

这样做的目的是:减少编码的工作量和提高程序的课维护性及可扩展性

  • 2楼网友:话散在刀尖上
  • 2021-05-06 04:28

Person stu=new Student();

这样是不错的

父类在前 子类在后

但是换成

Student stu=new Person(); 那就是必错的!

没有子类在父类前面的!

  • 3楼网友:忘川信使
  • 2021-05-06 03:40
如果Person stu=new Student(); 那么stu为Person对象, stu.SetDepartment("菊苑412"); [而SetDepartment为Student对象方法]
  • 4楼网友:人间朝暮
  • 2021-05-06 02:20

Person stu=new Student(); 这个是用父类指向类!

在实例化时先调用父类里的构造函数等等

  • 5楼网友:西风乍起
  • 2021-05-06 02:12

这是多态,任何一个类可以当作这个类以及这个类的父类来使用,当这个类调用变量时,这个类将以最新版本可以响应,。

简单理解就是:子类继承父类,父类实现子类的方法。

明白了吗?

  • 6楼网友:忘川信使
  • 2021-05-06 00:51

Student stu=new Student();换成Person stu=new Student();会报错

通俗的来说 Person 的范围要小,这个Person不具备department 这个 成员变量,但是你要以 Person 对象去存储一个他容纳不下的成员时,当然不行的啦。

就像你一个整形变量 int i; 你要用一个 Long l; 对 i 进行赋值,当然不行的啦,一样的道理,越界啦,long和int的边界值不一样(i=l;)long的长度要比int的长啦

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯