发现一个 有意思的问题,父类如果没有定义无参数构造器的话,那么子类的构造会报错。 具体参考下面 被注释掉的部分。 具体报错如下:
/Users/yipengwang/IdeaProjects/my_java_project/oop/src/com/wyp/test/ExtendsTest.java:34:59
java: constructor Person in class com.wyp.test.Person cannot be applied to given types;
required: java.lang.String,int
found: no arguments
reason: actual and formal argument lists differ in length
com.wyp.test;
ExtendsTest {
(String[] args) {
Person p1 = Person(, );
Student s1 = Student(, , );
p1.rest();
s1.rest();
s1.study();
System..println(s1.);
}
}
Person {
String ;
;
(String name, height) {
.= name;
.= height;
}
() {
System..println();
}
}
Student Person {
String ;
;
String ;
(String name, height, String major) {
.= major;
.= height;
.= name;
}
() {
System..println();
}
}想请教一下这个具体是什么原理?
1、在创建Student的对象时,也会调用父类Person的构造方法,但是为什么是同一个对象呢?父类的对象去哪了呢?总不能说是父类的实例化就是子类吧?因为子类里面含有许多父类不具有的方法属性啊

2、然后我对创建对象的部分进行了改动

运行结果

既然Student可以是Person的对象(如第二行),那为什么Person不能是Student的对象呢?我这样理解对吗?可以说Student是Person的一种子分类(或者是对象),但是不能说Person是Student的一种子分类(对象)
3、最重要的一点,关于Student是Person的对象,在底层是如何表示的呢?是建立一条引用Object->Person->Student用来表示对象的父类对象的吗?
Person是Student的父类,向下转型要强制转换哦
1.如图
2.this的意义是什么啊?
对的,你说的没问题。构造方法的定义就是和类名一致,无返回值的方法,这里的无返回值并不是指void.
package opp.src.com.itbaizhan.oop;
public class TestExtends {
public static void main(String[] args) {
student s=new student("glp",18,"java");
s.rest();
s.study();
}
}
class person{
int age;
String name;
public void rest(){
System.out.println("休息一下");
}
}
class student extends person{
String major;
public void study(){
System.out.println("学习吧");
}
public student(String name,int age,String major) {
this.name = name;
this.age = age;
this.major = major;
}
}
老师,我的代码出了点问题
微信找我给你看一下吧
老师请问为什么会报错啊
person的p是小写的
class Student extends person{
String major;
public void study(){
System.out.println("学习");
rest();
System.out.println(this.name);
}
}这里的this.name是指在这个子类中创建的名字吗
这个属性是继承父类的,子类也是可以去使用的,也可以通过子类去给name去赋值,并获取到你所赋到的值
Student a=new Student(); a.name="aa"; a.study();
如何将红框部分的内容输出出来


为什么在父类中定义了构造器,子类再定义就报错
因为需要定义无参构造,你子类继承了父类,那么子类的构造方法一定是调用父类的,现在有了有参构造,想要使用无参构造,就必须把无参构造声明出来。

这个this指的是哪个对象?好像整个代码里面没有创建对象
不用了老师,我知道了

public class Test{
public static void main(String[ ] args) {
Student s = new Student("高淇",176,"Java");
s.rest();
s.study();
}
}
class Person {
String name;
int height;
public void rest(){
System.out.println("休息一会!");
}
}
class Student extends Person {
String major; //专业
public void study(){
System.out.println("在尚学堂,学习Java");
}
public Student(String name,int height,String major) {
//天然拥有父类的属性
this.name = name;
this.height = height;
this.major = major;
}
}为什么main方法中可以调用student类中的构造方法?
因为构造方法是public修饰的,我们在外部创建对象的时候,会默认调用对应的构造方法进行初始化对象。
老师你好,我想把Person父类中的rest()方法直接在main()中运行,代码该怎么写?
Person p = new Person(); p.rest()
这个括号为什么不能括到整个程序的最后一行

为什么有定义类前面加class,有时候加public,有什么又加public class



public修饰的类只能有一个,如果定义其他类,不能加public,被public修饰的这个类必须和文件名相同
老师,我的这个public Student那里为什么会报错?

这个rest的方法可以不放在里面吗,放在外面可以调用吗

放在外面?同学你这个外面,是指哪个外面?
方法可以放在什么位置呢:可以在方法体内调用其他方法,方法是不可以脱离成单独的位置放的,不然也没意义 是吧
我们最常见的是不就是 创建了一个方法 然后在 main方法里调用 是吧