继承是面向对象编程中的一种重要概念,它可以用来实现代码的复用和封装。继承是指一个类可以继承另一个类的所有属性和方法。在Java中,继承使用关键字extends。
通过继承,子类能够获取父类的所有属性和方法,并且可以扩展或修改它们。当一个子类继承自父类时,它会继承父类的公有(public)和受保护(protected)属性和方法,并且可以按需扩展和修改这些属性和方法。从而减少编写重复代码的工作量。
例子:一个简单的类继承关系:
public class Animal { // 定义一个Animal类
private String name; // 动物名称
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + "正在吃东西");
}
}
public class Dog extends Animal { // 继承Animal类定义一个Dog类
public Dog(String name) {
super(name); // 通过super关键字调用父类构造方法
}
public void bark() {
System.out.println("汪汪!");
}
}
// 在另一个类中使用Dog类
public class Test {
public static void main(String[] args) {
Dog dog = new Dog("小狗");
dog.eat(); // 调用从父类继承过来的方法
dog.bark(); // 调用自身的方法
}
}
//在上述示例中,我们定义了一个Animal类,具有一个name属性和一个eat()方法。
//另外定义了Dog类继承自Animal类,通过super(name)调用Animal类的有参构造器初始化父类属性name,
//并新增了一个bark()方法。
//在创建Dog对象后,通过调用eat()和bark()方法,可以调用父类继承的方法和自身的方法。
注意:
子类继承父类后,父类的私有属性不会被直接继承。这是因为,父类的私有属性只能被父类自身的方法调用,无法被子类访问。因此,子类也无法直接获取或修改父类的私有属性。
一般情况下,我们需要使用公有的getter和setter方法来获取和修改父类的私有属性。getter和setter方法是一种常见的访问和修改私有属性的方式,它们可以通过方法访问私有属性,从而实现对私有属性的使用,并且可以对属性进行一定的控制和封装,提高代码的安全性和可维护性。
示例:
public class Parent {
private String name;
public Parent(String name) {
this.name = name;
}
public String getName() { // getter方法
return name;
}
public void setName(String name) { // setter方法
this.name = name;
}
}
public class Child extends Parent {
public Child(String name) {
super(name);
}
public static void main(String[] args) {
Child child = new Child("小明");
String name = child.getName(); // 使用getter方法获取父类的私有属性
System.out.println(name); // 输出:小明
child.setName("小华"); // 使用setter方法修改父类的私有属性
name = child.getName(); // 再次使用getter方法获取父类的私有属性
System.out.println(name); // 输出:小华
}
}
在上述示例中,我们定义了一个Parent类,其中的name属性为私有属性,使用getter和setter方法来访问和修改该属性。然后定义了Child类继承自Parent类,并通过super(name)语句调用了父类构造方法完成父类的初始化。在Child类中,可以使用getter和setter方法来访问和修改父类的私有属性。
注意:
1:子类继承了父类所有的属性和方法,非私有的方法和属性可以在子类中直接访问,但是私有的方法和属性不能在子类中直接访问,需要通过父类提供公共的方法去访问。
2,子类调用构造器的时候默认第一个语句是super() ,(可不用写出, 默认调用父类的无参构造器)
3.当创建子类对象时,不管使用子类的那个构造器,默认情况下总会调用父类的无参构造器,
如果父类没有提供无参构造器(或有个有参构造器),则必需在子类的构造器中用super指定使用父类的那个构造器完成对父类的初始化,否则,编译不会通过。
(但要是父类当中没有无参构造器,那必须使用super(, ,…);去指定一个父类当中的其他构造器)
4,如果想 调用父类的某个构造器,可以显示的调用一下:super(参数列表)
5,super()在使用的时候要放在构造器第一行,即优先调用父类的构造器
( 在Java中,如果子类没有显式地调用父类的构造器,则编译器会默认在子类的构造器中添加super()语句,以调用父类的无参构造器。这是因为如果不调用父类的构造器,父类的属性不会被初始化,可能会导致程序出错。
如果子类需要调用父类的有参构造器,则必须使用super()语句来显式调用父类的构造器,并传入必要的参数。该语句必须放在子类构造器的第一行,这是因为在Java中,构造器的执行顺序是从父类到子类,也就是说,子类的构造器在执行之前先调用了父类的构造器。)
6.对于super(),this(),并不是super.内容,this.内容,后两者是可以在成员方法中调用的,而前两者只能在构造器的首行(由于super()和this()都只能在首行,故不能同时出现在构造其中)
7.java所有类都是Object类的子类,Object是所有类的基类
8.父类构造器的调用不限于直接父类,将一直往上追溯到Object类(顶级父类),即可以一层层调用
9.一个子类只能继承一个父类(直接父类),即java是单继承机制
10.不能滥用继承,子类和父类必须满足is-a的关系(满足逻辑关系,才能继承):如:Cat extents Animal
当子类对象创建好后,就建立好查找的关系
属性:
方法: