java 父类与子类 extends

2023-02-18 00:00:00 extends java 子类

继承:子承父业。
  在一些类中拥有一些共性内容(相同的内容),我们把这些共性内容抽取到一个新的类中。这些类通过extends关键字类继承这个拥有共性内容的类,就可以拥有该类的所有内容。这个拥有共性内容的类称为父类(基类、超类)。继承父类的类称为子类。

单根继承:
在java中,类只支持单根继承。一个类只有一个直接父类。
多重继承:
java中,支持多重继承,爷爷..爸爸..儿子..
继承是java中代码重用的重要手段之一,所有的类都直接或间接的继承Object。

继承通常会有 is-a的关系:如:dog is a pet

 

语法:
 class 子类 extends 父类{
 }
 当前类为子类。
—–>属性关系
1.子类继承父类可以拥有父类的所有属性。
2.子类同样可以拥有父类的private修饰的属性,但是private修饰的内容类外无法访问。子类依然会继承来该特性,需要setget方法进行取值和赋值。
3.父类有一个属性,子类也有。使用子类对象调用该属性,调用的是子类的属性。父类有一个属性,子类也有。使用父类的方法获取该属性属性值,获取的是父类的。就近原则!!
4.如果父子类有有同名属性,在子类方法中想要使用父类的属性值,使用super。
 
———–this 和 super
this:当前对象。
      1>区分同名的局部变量和属性。
      2>调用其他构造方法。this(参数)。
super:代表当前类父类的对象的引用。
      !!!:
       super不是对象。只是子类对象有一个区域可以
       指向父类的对象成员。
      1>区分同名的子类属性和父类属性。
      2>区分同名的(覆盖的)父子类相同方法。
      3>子类中调用父类的构造方法。
        super(实参列表);
    在子类构造方法中调用父类构造方法必须在第一句,而且只能有一个。

this和super在使用的时候,是一样的。
但是两者意义完全不同,this代表当前对象,super只是子类对象有一块内存空间可以执行父类的对象成员罢了,super不是对象。

this和super都不可以在静态方法中使用。
————-
this:当前对象。
super:代表当前类父类的对象的引用。

—–>方法
1.子类继承父类可以拥有父类的所有方法。
2.覆盖、重写。
  方法的重载Overload:
  1>同一类中
  2>方法名相同
  3>参数列表不同
  4>与返回值无关。
 
  方法的重写(覆盖)Override:
  1>父子类中。
  2>方法名相同
  3>参数列表相同
  4>返回值相同或者子类方法的返回值是父类方法返回值的子类。(子类返回儿子,父类返回爹)
  5>访问权限相同,或者子类访问权限高于父类。 (子类更大方)
  6>子类不能抛出比父类更多的异常。

  当子类方法覆盖父类方法后,子类对象调用该方法调用的是子类重写后的。
3.当子类方法覆盖了父类方法。想在子类中调用父类方法,使用super关键字,调用父类方法。

—–>构造方法
1.当没有自定义的情况下,jvm会默认分配一个无参构造方法
  public 类名(){
    super();
  }

  所有的构造方法第一句都默认调用父类的无参构造

  当一个类没有声明直接父类的时候默认继承Object,也就是构造方法中的super()代表Object中的无参构造。
  public Object(){}
2.
 1>在构造方法中,没有调用任何其他构造方法(this()|super()) 默认调用父类的无参构造方法。
 2>如果父类没有无参构造方法,子类中的构造方法也没有调用其他构造方法,编译会报错。所以,需要子类调用父类的其他有参构造方法。
 3>使用super(参数)调用父类的构造方法,必须在第一句。只能有一个。
 4>在构造方法中,调用其他构造方法(this()|suepr())只能调用一个。而且必须在第一句。
 5>子类的构造方法中一定会调用父类的某个构造方法(间接)。一个类中至少有一个构造方法直接调用父类的构造方法。不允许同一类中构造方法1调2,2调3 ,3调1,–>递归构造器,编译不通过!

—–>静态方法
1.父类有一个静态方法,子类没有,用子类对象调用该方法,调用的是父类的。
2.当父类中有一个静态方法,子类也有,用子类对象调用的该方法调用的是子类自己的!
 不是因为覆盖,是就近原则。
  静态方法不存在覆盖!!!
3.静态方法使用类名去调用。

多态:
事物的多种表现形态。
方法的重载、方法的重写都是多态性的体现。

父类类型 指向子类对象
父类类型 对象 = new 子类();

使用父类类型作为方法的参数和返回值,都是多态中的重要应用。

向上转型的对象,是无法调用子类特有的内容!!
—>属性
1.当父类有一个属性,子类没有,调用该属性,调用的是父类的。
2.当父类有一个属性,子类也有,调用该属性,调用的是父类的。
3.当子类有一个属性,父类没有,调用该属性,编译报错!!!

—>方法
1.当父类有一个方法,子类没有,调用该方法,调用的是父类的。
2.当父类有一个方法,子类也有,调用该方法,调用的是子类的。
  因为子类方法给父类方法覆盖了!
3.当子类有一个方法,父类没有,调用该方法,编译报错!!!

—->静态方法
1.父类有一个静态方法,子类没有,调用该方法,调用的是父类的。
2.父类有一个静态方法,子类也有,调用该方法,调用的是父类的。
   静态方法不存在覆盖!!!
3.子类中有一个静态方法,父类中没有,调用该方法,编译报错!!!
  静态方法使用类名去调用。

  父类类型对象 转为子类类型:向下转型
  类型的强转。
  子类类型 对象 = (子类类型)父类类型对象;

  判断一个父类类型对象是否可以转换为某个子类类型:
  可以使用运算符,关键字:instanceof
  父类对象名 instanceof 子类类型–>boolean

  向下转型本身应该是在向上转型的基础上,才有向下转型。

 

 

 

    原文作者:Peter_S
    原文地址: https://blog.csdn.net/Peter_S/article/details/85281291
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章