java有继承吗_java 继承

java三大特性:封装,继承,多态。

继承:继承在本质上是特殊-一般的关系,即常说的is-a关系。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。

指 在现有类的基础上产生一个新的类,产生的类叫做子类,现有类叫做父类。子类会自动拥有父类的属性和方法。

关键字extends

如果一个类中没有extends关键字明确标识继承另一个类,那么这个类就默认继承Object类。Object类是所有类的父类,该类中的方法 适用于所有子类,其中常用的方法有toString()方法和hashCode()方法。

注意:

(1)在java中,类值支持单继承,不允许多重继承,也就是说一个类只能有一个直接父类。

(2)多个类可以继承一个父类。

(3)在java中,多层继承是允许的,即一个类的父类可以再继承其他的父类。

重写父类方法:

在继承关系中,子类会继承父类中定义的方法,但子类也可以在父类的基础上拥有自己的特征,即对父类方法进行重写。需要注意的是,在子类中重写的方法必须与父类被重写的方法具有相同的方法名、参数列表以及返回值类型。子类重写父类方法时,不可以使用比父类中被重写方法更严格的访问权限。

1 public classAnimal {2 public voidcall(){3 System.out.println("动物叫");4 }5 public voidsleep(){6 System.out.println("动物在睡觉");7 }8 }

1 public class Cow extendsAnimal{2 public voidcall(){3 System.out.println("牛叫...");4 }5 }

1 public classexample {2 public static voidmain(String[] args) {3 Cow c = newCow();4 c.call();5 c.sleep();6 }7 }

牛叫...

动物在睡觉

super关键字

当子类重写父类的方法后,子类对象不能在访问父类被重写的方法。

Java中提供了super关键字用于访问父类的成员变量、成员方法和构造方法。

super.成员变量 //访问成员变量

super.成员方法([参数1,参数2,参数2...]) //访问成员方法

super([参数1,参数2...]) //访问构造方法

继承关系下的构造方法:

(1)在子类的构造方法中调用某一父类的构造方法时,调用语句必须出现在子类构造方法的第一行,可以使用super()关键字。

(2)如果子类构造方法的声明没有明确调用父类的构造方法,则系统在执行子类构造方法时会自动调用父类的默认构造方法(即无参数构造方法)。

(3)如果想调用一个带参数的父类构造方法,就必须用关键字super显示地编写构造方法语句。

继承中的初始化阶段:

从类的结构上而言,其内部可以有如下四种形态:属性(包括类的属性和实例属性)、方法(包括类方法和实例方法),构造器和初始化块(包括类的初始化块和实例的初始化块)

用static修饰的方法。

由于类方法是属于整个类的,所以类方法的方法体中不能有与类的对象有关的内容。

即类方法体有如下限制:1.类方法中不能引用对象变量;2.类方法中不能调用类的对象方法;3.在类方法中不能调使用super,this关键字;4.类方法不能被覆盖。

当一个类创建了一个对象后,这个对象就可以调用该类的方法(对象方法)。1.实例方法中可以引用对象变量,也可以引用类变量;2.实例方法中可以调用类方法;3.对象方法中可以使用super,this关键字。

对于继承中的初始化顺序,又具体分为类的初始化和对象的初始化。

类初始化:在JVM装载类的准备阶段,首先为类的所有类属性和类初始化块分配内存空间,并在类首次初始化阶段中为其进行初始化,类属性和类初始化块之间的定义顺序决定其初始化的顺序。若类存在父类,则首先初始化父类的类属性和类初始化块,一直上溯到Object类最先执行。

对象初始化:在new创建对象时,首先对对象属性和初始化块分配内存,并执行默认初始化。如果存在父类,则先为父类对象属性和初始化块分配内存并执行初始化,然后执行父类构造其中的初始化块程序,接着才开始对子类的对象属性和初始化块执行初始化。

1 public classDemo1 {2 int a = 1;3 {4 System.out.println(a);5 }6 publicDemo1() {7 System.out.println("父类构造器");8 }9 static{10 System.out.println("父类静态初始化块");11 }12 {13 System.out.println("父类实例初始化块");14 }15 public voidmethod() {16 System.out.println("父类方法");17 }18 }

1 public class Demo2 extendsDemo1{2 int a = 2;3 {4 System.out.println(a);5 }6 publicDemo2() {7 System.out.println("子类构造器");8 }9 static{10 System.out.println("子类静态初始化块");11 }12 {13 System.out.println("子类实例初始化块");14 }15 public static voidmain(String[] args) {16 newDemo2().method();17 }18 }

父类静态初始化块

子类静态初始化块1父类实例初始化块

父类构造器2子类实例初始化块

子类构造器

父类方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值