Java_继承
继承
注意事项
-
实例变量和静态变量被统称为域。类中的域、方法和嵌套类/接口被统称为类成员
-
一个子类最多只能继承一个父类,而一个父类可以同时被多个子类继承,但是却可以多层继承(即存储在祖父类)
-
子类继承父类除了private修饰的所有成员变量和方法,且继承过来的成员变量和方法的访问权限保持不变
-
子类可以继承或覆盖父类的方法,前提是这些方法不是private方法
_在子类中重写父类中已有的方法,会覆盖掉父类中的同名方法(方法头一模一样)可实现既延用父类的功能,又拥有自己特有的功能
-
使用super关键字访问父类的方法或构造函数;使用this关键字访问当前类的方法或构造函数
-
final方法不能被覆盖;final类不能被继承
继承的利弊
好处
-
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
-
提高了代码的维护性(若方法中的代码需要修改,修改一处即可)
弊端
- 继承让类与类之间产生了关系,类的耦合性增强,父类发生变化时,子类也不得不发生改变,削弱了子类的独立性
权限修饰符
-
Java中的权限修饰符有 public、protected、default(缺省,什么都不写)、private,可以用来修饰成员变量及成员方法。
-
修饰类(不包括内部类)的话,只能用public和default(缺省)来修饰。 public修饰的类可以被任意其它类访问,而default(缺省)只能被同一个包中的其他类访问
-
访问权限由高到低排序为:public=>protected=>default=>private
-
在一个类中,任何权限修饰的变量和方法都可以被访问;
-
在同一个包中的类,可以访问到其它类的除了private修饰的所有变量和方法;
-
在不同的包中的类,只可以访问到另一个类的public修饰的成员变量和方法
-
父类中的private修饰的成员变量和方法虽然不能被继承或直接访问,但可以通过set/get方法间接访问
-
修饰符 同一个类中 同一个包中,子类无关类 不同包中的子类 不同的无关类 private √ default(缺省) √ √ protected √ √ √ public √ √ √ √
-
修饰符
final
-
final关键字是最终的意思,可以修饰成员方法、成员变量、类
-
final修饰特点:
- 修饰方法:表示为最终方法,不能被重写
- 修饰变量:表示该变量为常量,不能被再次赋值
- 修饰类:表示该类是最终类,不能被继承
-
final修饰局部变量:
- 变量是基本类型:final修饰指的是基本类型的数据值不能发生改变
- 变量是引用类型:final修饰的指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的
static
- static关键字是静态的意思,可以修饰成员方法、成员变量
- static修饰的特点:
- 静态成员方法只能访问静态成员
- 被类的所有对象共享,也是判断是否使用静态关键字的条件
- 可以通过类的对象访问,也可以直接通过类名访问,多建议后者
继承中变量访问特点
若在子类中访问一个变量
- 子类局部范围找
- 子类成员范围中找
- 父类成员范围中找
- 若都没有找到将报错(不考虑父类的父类)
super
super 关键字跟 this 关键字用法相似
-
this代表本类对象的引用
-
super代表父类存储空间的引用标识
关键字 访问成员变量 访问构造方法 访问成员方法 this this.成员变量 this(…)访问本类构造方法 this.成员方法(…)访问本类成员方法 super super.成员变量 super(…)访问父类构造方法 super.成员方法(…)访问父类成员方法
构造方法特点
- 构造方法必须与定义它的类完全同名,无返回值,无类型 (void也没有! )
- 构造方法主要用于完成初始化任务,调用时需用new
- 当该类中已存在构造方法,则默认的无参构造会消失,若要使用,必须自行声明
继承中构造方法特点
-
子类中所有的构造方默认都会访问父类中的无参构造
-
为什么子类new出来的对象会访问到父类无参构造?子类会继承父类中的数据,可能会使用到父类的数据。进而,子类初始化之前都要完成一次父类的数据初始化
-
为什么new了子类的带参构造还会访问到父类的无参构造?每一个子类构造方法的第一条语句默认有一个super();
-
父类中没无参构造方法,子类访问不到会报错怎么办?(1)通过使用super关键字显式调用父类的带参构造;(2)通过手动声明父类的无参构造
继承中成员方法特点
通过子类对象访问一个方法
- 子类成员范围中找
- 父类成员范围中找
- 若都没有找到将报错(不考虑父类的父类)
方法重写注意事项
-
父类中的private方法、变量不可以被子类重写(可以在重写时,在方法头上加一个注解(@Override)以验证是否实现子类重写父类
-
子类重写父类的方法时,访问权限不能低于父类的访问权限(public=>protected=>default=>private)
-
方法的重写只针对实例方法,父类中的静态方法,子类只能继承、重载和隐藏
-
子类重写的方法不能比父类中被重写的方法声明抛出更多的异常
-
父类的静态方法不能被子类重写为非静态的方法。同样,父类中的实例方法也不能被子类重写为静态方法
-
class A{ public /*static*/ void test(){ System.out.println("A==>test()"); } } class B extends A{ public /*static*/ void test(){ System.out.printlnl("B==>test()"); } } public class Test{ public static void main(String[] args){ //方法的调用类型取决于左边的方法名 A a = new A(); a.test(); B b = new B(); b.test(); //父类的引用指向了子类,必须保证父类跟子类的同名方法同时有或无static修饰,否则会编译错误! //当A类、B类都是由static修饰时,运行只看左边定义的类型即可,不考虑右边的new //当A类、B类都没有static修饰时,运行时指向子类,看右边的new的子类类型 A a = new B(); a.test(); } }
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)