首页 > 编程语言 >Java面向对象:子类与继承

Java面向对象:子类与继承

时间:2022-12-29 21:11:28浏览次数:47  
标签:重写 Java 变量 继承 子类 面向对象 父类 方法

今天听java课程感觉难度突然增加,因此注意上课记录关键笔记,提醒自己回顾。

JAVA 子类与继承

image-20221229180846503

子类与父类

问题:哪些父类的变量与方法可被子类继承?与访问权限有关

前提知识:java中一个子类只可以继承一个父类。

  • private变量/方法:子类不可继承

  • 友好型(默认的)变量/方法:同package里的子类可以继承

  • protected/public:子类均可继承

以包的角度来看:

  1. 子类、父类在同一个包中:子类可以继承除了private以外的所有成员变量/方法。(如果子类中定义的实例方法访问不了父类变量/方法,则说明没继承过来)

  2. 子类、父类不在同一个包中:子类可以继承父类public、protected的变量、方法。友好和private都不行。

对protected的说明:一个类A的protected成员变量和方法都可被子类和孙类C继承。但是访问呢?对于孙类C在自己方法内创建的对象,可以访问变量和方法。但是对于另外一个类other里创建的该孙类对象,想过通过孙类C访问C的protected变量和方法,则必须和C在同一个包;要是other类的对象创建孙对象C,想访问A的变量和方法,则必须要求其和A在同一个包里!

instanceof运算符

instanceof是双目运算符”是实例吗?“,左操作数是对象,右操作数是类。如果左边的对象是右边的类或该类的子类创建的对象,返回true。

子类对象特点

当创建子类对象时,子类的成员变量都会被分配内存,同时其父类的所有成员变量也都被分配内存空间,但是只有被继承的那一部分被分配给子类对象作为其变量。没有被继承的父类变量在内存中仍然有空间,这包括父类中的private、不与子类在一个包里的父类的protected变量

那么这些没有被继承的变量,怎么被子类访问呢?通过调用继承过来的父类的特定方法去操作这些变量

成员变量的隐藏与方法重写

变量隐藏:

如果子类声明了和继承来的变量同名的对象(类型可以不同),则子类就会隐藏掉被继承的这个父类变量,以后通过.操作该变量,都是在操作自己声明的子类同名变量。不过,仍然可以通过调用父类的特定方法去操作这些变量。

方法重写:

子类若从父类继承了一个方法,则子类可以使用相同的方法名、参数列表、返回值,来重写这个方法,此时原来父类继承来的方法被隐藏了。

注意

  • JDK1.5之后,重写方法时参数可以不一样,而可以是原来方法参数的子类。
  • 重写方法时,不可以缩小权限。如可以把protected重写成public,但不可以写private/友好

重写的目的:子类如果不想沿用父类的行为,就可定义自己的。

多态

当父类的某个实例方法被多个子类各自重写时,可以各自产生自己独特的行为。

super关键字

被子类隐藏的父类变量、重写的父类方法,都不再归属于子类实例化的对象,而是归属于super.

因此,子类可以通过super.访问被隐藏/重写的变量和方法:

image-20221229201829908

super与子类构造方法

子类的构造必须调用父类的构造方法:

  1. 使用super()调用父类构造方法
  2. 使用this()调用本类中另外的构造方法,其中包含父类构造
  3. 若没有做到,系统自动调用无参构造

image-20221229202538478

final关键字

  1. final类:不允许被继承的类。例如JAVA的String类对于编译器和解释器很重要,因此用final修饰。
  2. final方法:这是最终版本的方法,不允许子类重写该方法。
  3. final常量:被修饰的量是常量,不允许被修改。

对象的上转型对象

若A是B的父类,我们声明了一个父类对象a,用子类的构造方法实例化该对象a,用子类的构造方法再实例化一个子类对象b,则a是b的上转型对象。具有如下特点:

  1. a不可操作b新增的成员变量和方法。
  2. a可以操作、调用b继承的变量和方法,以及b隐藏变量和重写的方法。也就是说,若子类重写了父类某个实例方法,则a调用的是子类重写的方法,而不是父类的原方法,这也是上转型对象与父类对象的区别

标签:重写,Java,变量,继承,子类,面向对象,父类,方法
From: https://www.cnblogs.com/czy-blogs/p/17013544.html

相关文章

  • java中的字符串反转
    本文主要讲述java中的字符串反转示例代码如下:1publicclassHomeWork01{2publicstaticvoidmain(String[]args){3Strings="abcdef";4......
  • 数组方法 JavaScript
    //连接两个数组consta1=[1,2,3];consta2=[4,5,6];consta3=a1.concat(a2);console.log(a3);console.log("----------------------------------------......
  • JAVA02
    基本运算符算数运算符:+-*/%++--赋值运算符:=关系运算符:><>=<===!=(instanceof)逻辑运算符:&&||!位运算符:&|^~>><<>>>条件运算符:?:扩......
  • Java基础之面向对象——类、对象、方法
    类与对象    类的概念我们平时已经听过很多了。人类、鸟类、鱼类...所谓类,就是对一类事物的描述,是抽象的、概念上的定义,比如鸟类,就泛指所有具有鸟类特征的动物。比......
  • JavaScript基础入门
    一、基础入门1、引入JavaScript1.1内部标签<script>  //...</script>1.2外部引入x.js//...x.html<scriptsrc="x.js"></script>1.3测试代码<!DOCTYPEh......
  • 第一章《初学者问题大集合》第7节:编写第一个Java程序
    ​下载并安装好IDEA之后,就可以编写Java程序啦!前文曾经讲过,Java程序最初的存在形式是Java源文件,经过编译之后又会产生字节码文件。当今时代,软件项目的规模越来越大,因此软件项......
  • 坦克大战1.0,java时间处理机制
    1.java绘图坐标体系1.1坐标体系-介绍下图说明了Java坐标系。坐标原点位于左上角,以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个......
  • JavaScript如何实现多线程?
    我们都知道JS是一种单线程语言,即使是一些异步的事件也是在JS的主线程上运行的。像setTimeout、ajax的异步请求,或者是dom元素的一些事件,都是在JS主线程执行的,这些操作并没有......
  • java发送http请求
    java发送http请求有几种方法1、HttpURLConnection、URLConnection使用JDK原生提供的net,无需其他jar包;2、HttpClient3、Socket本文使用依赖于第三方jar包的HttpClient......
  • Java8接口关键字default
    java1.8以后可以在接口中使用关键字default来是定义变量和方法,解决接口增加新的功能,又不想修改所有实现类的方法interfaceA{publicdefaultvoidmethod(......