Java中的继承
我们已经了解了继承的基本概念,Java中继承是一种对象机制,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类继承父类的属性和方法并且可以覆盖父类的方法,也可以添加新的属性和方法。
class Animal {
public void eat() {
System.out.println("Animal is eating");
}
}
class Dog extends Animal {
public void play() {
System.out.println("Dog is playing");
}
}
public class Main {
public static void main(String args[]) {
Dog dog = new Dog();
dog.eat();
dog.play();
}
}
那么子类到底可以继承父类的哪些内容呢?
首先父类的构造方法不能被子类继承,但子类可以通过super来调用,子类中所有的构造方法默认都会访问父类中的无参构造方法。
```java
public class Fu{
public Fu() {
System.out.println("fu类构造方法");
}
}
public class Zi extends Fu {
public Zi() {
super();
System.out.println("zi类构造方法");
}
}
public class test{
public static void main(String[] args){
Fu s = new Zi();}
}
fu类构造方法
zi类构造方法
其次,父类中的成员变量如果是非私有的,子类中可以直接访问,要访问父类中的私有成员变量,可以在父类中提供公共的get/set方法。
成员变量访问特点:编译看父类,运行看父类
public class Parent {
protected String name;
public Parent(String name) {
this.name = name;
}
}
public class Child extends Parent {
public Child(String name) {
super(name);
}
}
public class test{
public static void main(String[] args){
Child child = new Child("张三");
System.out.println(child.name);}
}
然后子类可以继承父类的成员方法。
成员方法访问特点:编译看父类,运行看子类
public class Fu{
public static void MethodFu{
System.out.println("父类的方法");
}
public static void Method{
System.out.println("父类同名的方法");
}
}
public class Zi extends Fu{
public static void MethodZi{
System.out.println("子类的方法");
}
public static void Method{
System.out.println("子类同名的方法");
}
}
public class test{
public static void main(String[] args){
Zi z=new Zi();
z.MethodFu();
z.MethodZi();
z.Method();
}
}
父类的方法
子类的方法
子类同名的方法
在继承中我们可以看到很多关于多态的运用,我以前一直不清楚继承和多态有怎样的区别和关系,感觉它们很像。但其实继承和多态是面向对象编程中的两个概念,但有着紧密的联系和关系。继承和多态紧密联系,子类可以继承父类的属性和方法,并可以重写父类方法,从而实现多态的效果。而多态可以提高代码的灵活性和可扩展性,使得代码可以适应不同的运行环境和需求。
总的来说,子类可以继承父类中所有非私有的成员,也可以添加新的属性和方法。那么我就在想,子类是选择继承还是全部继承呢?子类的内存是不是总是比父类要大呢?
查了资料,知道了在Java中,子类可以选择继承父类的部分属性和方法,也可以选择全部继承。这取决于子类的需求和目的。当子类选择全部继承时,子类会继承父类的所有非私有成员,包括属性、方法和构造器。这种方式适用于子类需要完全继承父类的功能,并且没有额外的需求。当子类选择部分继承时,子类可以根据需要选择性地继承父类的方法和属性。通过重写父类的方法或者增加自己的特定方法来覆盖父类的默认实现,以实现子类特有的功能。
在Java中,子类不一定比父类占用更多的内存。子类继承了父类的属性和方法,但是子类也可以新增自己的属性和方法。如果子类没有新增任何属性或方法,那么子类的内存大小和父类是一样的。但如果子类新增了属性或方法,则子类的内存大小会比父类大。此外,如果子类重写了父类中的方法,那么在调用时要用到的内存也会有所不同。