java继承详解

java继承是java四大特性(继承、多态、封装、抽象)之一,可以减小代码重复的被引用,提升代码的维护性。
优点:
1、降低代码的重复性,可以使用父类中已有的方法和属性。
2、提高了代码的可扩展性,子类可以有自己的方法,也可复写父类中的方法。
3、提升了代码的可维护性。当公共方法发生改变时,只需维护父类中的方法就可以。
缺点:
1、增加了代码的耦合性,父类中的常量、方法被修改时,也应考虑子类中的方法和常量的修改,对继承的子类造成影响,减少了子类的独立性。
2、破坏了父类的封装,父类向子类暴露了实现细节。

一、类的继承

在java中定义的类是可以用关键字extends继承的
如:
在这里插入图片描述

类的继承有如下规则和注意事项
1、一个类可以被多个其他的子类继承,而只能继承一个父类。
2、子类可以继承或重写父类的公共属性和方法,重写的方法必须和父类中方法的参数一致
3、子类在创建对象的时候首先默认调用父类的构造方法再调用子类的构造方法
4、子类在继承父类时,调用子类的属性和方法时可以用this关键字调用,调用父类的属性和方法时可以用super关键字调用
5、子类可以访问父类的公共属性和方法、受保护的属性和方法、在相同包下的默认属性和方法

二、类的权限修饰

类的权限修饰包含四种:

  1. 公共修饰(public)
  2. 私有修饰(private)
  3. 保护修饰 (protected)
  4. 默认修饰
    按被访问权限的范围进行排序有:pulic>protected>默认>private

1、公共修饰(public)

(1)被public所修饰的类、属性、方法可以在不同包,不同类中被访问。
下面用内部类做举例
同一个文件中只能有一个被public修饰的类,内部类除外。
被public修饰的内部类
可以在同一包下的不同类中被访问。
例如在com.zhao.test01 包下的类Student的内部类

package com.zhao.test01;

public class Student  {
	//内部类Student1
    public class Student1{
        public int age = 1;
    }
}

可以在com.zhao.test01 包下的demo类中访问

package com.zhao.test01;

public class Demo {
    public static void main(String[] args) {
        Student.Student1 student1 = new Student().new Student1();
        System.out.println(student1.age);
    }
}

输出结果
在这里插入图片描述

也可以在com.zhao.test02 包下的demo类中访问

package com.zhao.test02;

import com.test01.Student;

public class Demo {
    public static void main(String[] args) {
        Student.Student1 student1 = new Student().new Student1();
        System.out.println("包test02age="+student1.age);
    }
}

输出结果
在这里插入图片描述

2、私有修饰(private)

(1)被private修饰的内部类、属性、方法只能在类的内部被类的其他成员访问,而不能在其他类中被访问。
下面用Student类中属性举例
在Student类中存在private修饰的整形属性age可以在print()方法中被访问

package com.zhao.test03;

public class Student {
    private int age;

    public void print(){
        System.out.println("age="+age);
    }
}

而在Demo类中可不被访问,这里涉及到了类的封装。
在这里插入图片描述
在这里private 设计到了java的封装特性,我们在封装类的属性和特定方法时常用到private。

3、保护修饰(protected)

(1)被protected修饰的内部类、属性、方法可以在相同包下被访问或在不同包的子类中被访问。
下面用Person类中属性举例
有如下Person类,在包com.zhao.test04中,类中有受保护的整形属性height

package com.zhao.test04;

public class Person {
    protected int height = 55;
}

在相同包com.zhao.test04的Demo类中访问
在这里插入图片描述

在不同包com.zhao.test03的Demo01类中访问
在这里插入图片描述
在不同包com.zhao.test03的子类Student类中访问
在这里插入图片描述

4、默认

(1)在不加任何修饰符的情况下的内部类、属性和方法只能在类的内部和同包下被访问,即便是子类在不同包下也不可被访问。
下面用Person类中属性举例
有如下Person类,在包com.zhao.test04中,类中有默认的整形属性height

package com.zhao.test04;

public class Person {

     int height = 55;
     
}

在同包com.zhao.test04中的Demo类中访问
在这里插入图片描述
在不同包com.zhao.test03中的Demo01类中访问
在这里插入图片描述
在不同包com,zhao.test03中的子类Student中访问
在这里插入图片描述

三、类的构造方法

分类:

  • 无参构造方法
  • 有参构造方法

以Person类为例,有整形属性age

public Person{
	public int age;
}

无参构造方法的定义:

public Person(){}

有参构造方法的定义:

public Person(int age){
	this.age = age;
}

构造方法的作用:
为类的实现做初始化。通常为封装的属性或方法做初始化。

四、子类中方法的重写

1、什么情况下需要重写父类的方法?

在子类需要父类的方法,并且子类需要在父类方法的原有功能上做拓展时,才需要重写父类的方法。

2、重写父类的方法的有哪些注意事项?

  1. 重写父类的方法,名称和参数应当与父类相同。
  2. 在重写的方法中应当在结束时使用super调用父类的方法。
  3. 重写的方法要有@Override注解,@Override注解可以检测是否正确的重写了父类的方法。
  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值