java类的派生_Java基类和派生类

本文详细介绍了Java中的继承概念,强调了派生类如何包含基类的子对象,并必须在构造器中调用基类构造器以初始化。通过示例展示了无参和有参构造器的使用,以及访问权限的影响。同时,解释了派生类如何覆盖基类的属性和方法,以及如何正确访问私有属性。
摘要由CSDN通过智能技术生成

背景:对基类和派生类有更清晰的认识。

从外部看来,派生类是一个与基类具有相同接口的新类,或许还会有一些额外的的方法和域 。但继承并不仅仅是类的复用。当创建了一个派生类的对象时,该类包含了一个基类的子对象。这个子对象和你用基类直接创建的对象没有什么两样。

二者的区别在于,后者来自于外部,而基类的子对象来自于派生类对象的内部。对基类的子对象初始化时至关重要的,而且也只有一种方法来保证这一点,那就是在派生类的构造器中调用基类的构造器,而基类的构造器具有执行基类初始化所需的所有能力和知识。

示例

在无参构造器时, java会自动在派生类的构造器中插入对基类的构造器的调用。

public classHumans {

Humans(){

System.out.println("我是人!");

}

}

public class Student extendsHumans{

Student(){

System.out.println("我是学生!");

}

}

public classtest {public static voidmain(String args[]){newStudent();

}

}

输出结果为:

我是人!我是学生!

可以发现,总是基类的构造器先被初始化。

示例

但是当构造器有参数时,那就必须使用关键字super现实地编写调用基类构造器的代码,并且匹配适当的参数列表。

public classHumans {privateString name;

Humans(String name){

System.out.println("我是叫"+name+"的人");

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

public class Student extendsHumans{privateString name;

Student(String name){super(name);

System.out.println("我是学生!");

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

public classtest {public static voidmain(String args[]){new Student("zhangsan");

}

}

输出结果:

我是叫zhangsan的人

我是学生!

如果注释掉上面的super(name);将会报错。原因是派生类必须调用基类构造器。因为实例化派生类时,基类也会被实例化,如果不调用基类的构造器,基类将不会被实例化,所以派生类没有调用基类构造器会报错。

但是如果Humans的代码变成这样就不会错。如下代码:

public classHumans {privateString name;

Humans(){

System.out.println("我是人!");

}

Humans(String name){

System.out.println("我是叫"+name+"的人");

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

public class Student extendsHumans{privateString name;

Student(String name){//super(name);

System.out.println("我是学生!");

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

public classtest {public static voidmain(String args[]){new Student("zhangsan");

}

}

输出结果为:

我是人!我是学生!

原因是,如果基类有一个无参的构造器,就算派生类不用super显示调用基类的构造函数,编译器也会自动去调用基类的无参构造函数。

所以上面的代码不会报错,输出结果也不是

我是叫zhangsan的人

我是学生!

而是

我是人!我是学生!

示例

派生类继承了基类的所有public和protected属性和方法,代码如下:

public classHumans {publicString sex;protected intage ;privateString name;

Humans(String sex,String name,intage){this.sex =sex;this.name =name;this.age =age;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

public class Student extendsHumans{

Student(String sex ,String name,intage){super(sex,name,age);

}

}

public classtest {public static voidmain(String args[]){

Student s= new Student("男","zhangsan",10);

System.out.println(s.sex);

System.out.println(s.name);

System.out.println(s.age);

}

}

上面的System.out.println(s.name);会报错,因为name是private属性,如需访问,采用get方法:

System.out.println(s.getName())

输出结果为:

zhangsan10

示例

如果派生类定义了和基类一样的属性或方法,将覆盖基类的属性和方法。如将student改为如下代码:

public class Student extendsHumans{publicString sex;protected intage ;privateString name;

Student(String sex ,String name,intage){super(sex,name,age);

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

输出结果为:

null

null

0

因为只有基类的属性在构造时赋值了,派生类的没有,当访问这些属性时,访问的是派生类的属性,所以全为null或者0。

只有当派生类的属性也被实例化时,才会得到属性的值。代码改为如下:

public class Student extendsHumans{publicString sex;protected intage ;privateString name;

Student(String sex ,String name,intage){super(sex,name,age);this.sex =sex;this.name =name;this.age =age;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

输出结果为:

zhangsan10

要注意的是,super必须在构造器的最前面,不然会报错

### 回答1: 在Java中,我们可以通过使用extends关键字来创建派生类基类则是指派生类所继承的父。因此,如果要根据派生类写出基类,我们需要先确定派生类的父。 例如,如果我们有一个名为Dog的派生类,它继承了Animal,那么Animal就是Dog基类。因此,我们可以根据Dog写出Animal作为基类。 Animal的代码可能如下所示: ``` public class Animal { private String name; private int age; public Animal(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void eat() { System.out.println("Animal is eating"); } public void sleep() { System.out.println("Animal is sleeping"); } } ``` 这个Animal包含了一些属性和方法,例如name和age属性,以及eat()和sleep()方法。这些属性和方法可以被Dog所继承和使用。 当我们创建Dog时,可以使用extends关键字来指定它的父为Animal,例如: ``` public class Dog extends Animal { private String breed; public Dog(String name, int age, String breed) { super(name, age); this.breed = breed; } public String getBreed() { return breed; } public void setBreed(String breed) { this.breed = breed; } public void bark() { System.out.println("Dog is barking"); } } ``` 在这个Dog中,我们可以看到它继承了Animal,并且添加了一个新的属性breed和一个新的方法bark()。这些属性和方法可以在Dog中使用,同时也可以使用Animal中的属性和方法。 因此,根据派生类Dog写出的基类Animal就是上面所示的Animal。 ### 回答2: 在Java中,我们可以使用继承的概念来创建一个基类和一个或多个派生类基类是一种通用,它包含一些普通的属性和方法,而派生类可以从基类中继承这些属性和方法,并增加或修改它们来创建自己的独特功能。因此,根据派生类来写出基类是很常见的操作。 假设我们有一个派生类名为”Student”, 它继承自一个基类名为”Person”。 Person可能包含一些通用属性和方法,如姓名、年龄、性别、身高等,而Student则增加了学号和学校属性。因此,我们可以根据派生类Student来写出基类Person,在Java中的代码如下所示: ```java // 定义一个基类Person public class Person { // 成员变量 private String name; private int age; private char sex; private float height; // 构造函数 public Person(String name, int age, char sex, float height) { this.name = name; this.age = age; this.sex = sex; this.height = height; } // 成员方法 public void introduce() { System.out.printf("My name is %s, I'm %d years old, %c, %f m tall\n", name, age, sex, height); } } // 定义一个派生类Student public class Student extends Person { // 学号和学校属性 private int id; private String school; // 构造函数 public Student(String name, int age, char sex, float height, int id, String school) { // 调用基类的构造函数 super(name, age, sex, height); this.id = id; this.school = school; } // 成员方法 public void study() { System.out.printf("%s is studying at %s\n", super.name, school); } // 覆盖基类的成员方法 public void introduce() { super.introduce(); System.out.printf("My student ID is %d\n", id); } } ``` 在上述代码中,我们首先定义了一个基类Person,它包含了姓名、年龄、性别、身高四个成员变量和一个introduce()方法。接着,我们定义了一个派生类Student,它从基类Person中继承了四个成员变量和一个introduce()方法,并新增了两个成员变量id和school和一个study()方法。最后,我们在派生类中覆盖了基类的introduce()方法来增加对学号的输出。通过这种方式,我们可以根据派生类创建一个基类,方便其他人继续扩展我们的代码。 ### 回答3: 在Java中,派生类是指通过继承基类而创建出的新。每个派生类都继承了基类的属性和方法,同时也可以在基类的基础上添加新的属性和方法。因此,我们可以根据派生类来写出基类。具体的方法如下: 1. 创建派生类 首先,我们需要创建一个派生类。假设我们创建的是一个叫做“Student”的派生类: public class Student extends Person { // add new properties and methods } 2. 继承基类 在上面的代码中,我们使用了“extends”关键字来指定Student继承自Person。这意味着Student继承了Person中的所有属性和方法。 3. 创建基类 接下来,我们可以根据Student写出Person,作为它的基类。这样做的好处是,我们可以保证Person中的属性和方法是与Student相对应的。 public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } } 在上面的代码中,我们定义了一个叫做Person的。它有两个私有属性,name和age,以及一些公共的方法。这些方法包括构造方法、获取和设置属性的方法等等。 4. 继承关系 通过上面的步骤,我们建立了一个继承关系,如下所示: Person | Student Student继承自Person,Person就成为了Student基类。这个关系可以让我们在Student中重用Person的代码,同时还可以添加自己的属性和方法。 总之,根据派生类写出基类的过程中需要遵循继承关系的要求,保证基类的属性和方法与派生类相对应,这样可以有效提高代码的复用性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值