首页 > 编程语言 >学习笔记 - Java 面向对象_中

学习笔记 - Java 面向对象_中

时间:2023-08-20 18:55:25浏览次数:32  
标签:重写 调用 Java 子类 笔记 面向对象 构造 父类 方法

this 关键字

当形参名和属性名相同时,使用 this 关键字来区分,有 this 修饰的变量是属性,无 this 修饰的是形参。

this 可以调用的除了属性,还有方法、构造器。

所以,this 指的是当前对象(在方法调用时)或当前正在创建的对象(在构造器中调用时)。

在构造器中,使用 this(形参列表); 可以调用当前类中其它对应参数的构造器,但必须声明在首行(意味着只能声明一次)。

继承性

使用继承的原因

从代码的两个角度来考虑:

  • 自上而下:父类的内容与子类部分相同,但子类需要拓展,这时候就可以用继承来获得父类基本内容,子类再去拓展额外内容;
  • 自下而上:多个类拥有相同的内容,此时就可以抽取这部分相同的内容为父类,子类继承即可。

使用继承的好处

  • 减少代码冗余,提高代码复用性;
  • 继承有利于功能的拓展;
  • 继承使类之间产生了 is - a 的关系,使父类更通用,子类更具体,同时为多态的使用提供了前提。

补充及注意事项

  1. 继承性不可打破封装性,父类中私有的属性或方法在子类中无法使用;
  2. 不要仅为了获取某类中的某个功能来使用继承;
  3. Java 中的类如果没有显式的声明所继承的父类,则默认继承 java.lang.Object 类;
  4. Java 支持多层继承,区分直接父类和间接父类;
  5. Java 的单继承性:一个父类可以声明多个子类,但子类只能有一个父类;
  6. 子类继承父类时,不会继承父类的构造器。

方法重写

子类对从父类继承而来的方法进行覆盖、覆写的操作,就称为方法的重写。

格式

权限修饰符 返回值类型 方法名(形参列表) throws 异常类型{
	//方法体
}

规则

  • 子类中要重写的父类方法,必须与父类中原有方法的方法名和形参列表相同;
  • 子类中重写方法的权限修饰符应大于父类中原有方法的权限修饰符(父类中声明为私有的不可被重写);
  • 关于返回值类型:
    • 父类中原有方法的返回值类型为 void ,则子类中重写方法的返回值类型也必须是 void;
    • 父类中原有方法的返回值类型为基本数据类型,则子类中重写方法的返回值类型也必须与之相同;
    • 父类中原有方法的返回值类型为引用数据类型(例如类),则子类中重写方法的返回值类型也必须与之相同或者是其子类;
  • 子类中重写方法的异常抛出可以与父类中原有方法的异常抛出相同,也可以是其异常类的子类。

补充

可以使用 @Override 注解做方法重写校验,在添加了注解之后,如果方法名有误等会报错。

区分重载(overload)与重写(override \ overwrite):

  • 重载是指同一个类中因方法形参列表不同而重新编码;
  • 重写是继承父类方法后对父类方法进行重新编码。

super 关键字

何时使用 super

当子类继承父类以后,还想使用父类中的同名属性被重写方法或构造器,此时可以通过 super 关键字进行调用。

补充知识

  1. 调用父类中的同名属性被重写方法时通过 super.xx 来实现;

  2. 子类不会继承父类的构造器,所以需要调用父类构造器时要通过 super(形参列表) 来实现,且必须声明在子类构造器的首行

  3. 遵循首行原则,在子类的构造器中,this(形参列表)(重载构造器)和 super(形参列表)(调用父类构造器)只能二选一来使用;

  4. 如果子类构造器的首行没有显式的调用 this 关键字和 super 关键字,则该构造器默认调用 super() ,即调用父类中空参的构造器;

  5. 由 3 和 4 可得:子类的构造器中,只能是 调用本类中重载的构造器 或 调用父类构造器 两种情况之一;

  6. 由 5 可得:一个类中有 n 个构造器,则最多有 n-1 个构造器中使用了 this 关键字,剩下的一个使用了 super 关键字

多态性

概念

多态性是指一个事物的多种形态。

在 Java 中,体现在父类的引用指向子类的对象,例如:Person p = new Man();

虚拟方法调用

在多态的场景下调用方法(仅适用于方法,不适用于属性):

  • 编译时,认为方法是左边声明的父类中被重写的方法;
  • 执行时,实际执行的是子类重写父类之后的方法。

简称为:编译看左边,运行看右边。对于属性来说得到的还是父类中的属性。

前提及优缺点

使用前提

  1. 要有类的继承关系;
  2. 要有方法的重写

优缺点

优点:极大的减少了代码的冗余,不需要定义多个重载的方法。

缺点:在多态的场景下,创建了子类的对象,此时加载了子类的属性和方法。但是由于声明为父类的引用,所以无法调用子类特有的属性和方法。

向下转型

使用强转符进行转换,例如:

Person p1 = new Man();
Man m1 = (Man)p1;

向下转型时可能会出现类型转换异常(ClassCastException),所以可以在向下转型之前使用 instanceof 来进行判断,格式:a instanceof A ,判断对象 a 是否是类 A 的实例。如果返回 true ,则与 superA(A 的父类)的判断也将返回 true 。

Object 类

概述

java.lang.Object 是类层次结构的根类,即所有其它类的父类。每个类都使用 Object 作为超类。

Object 类中声明的结构具有通用性:

  • Object 类中没有声明属性;
  • Object 类中提供了一个空参的构造器。

equals() 方法

equals() 方法适用于引用数据类型。

  • 对于自定义的类,未重写时比较两个对象的引用地址是否相同;
  • 对于String、File、Date和包装类等,它们都重写了该方法,用于比较两个对象的实体内容是否相等。

区分 == 和 equals()

== 是一个运算符,可以对基本数据类型和引用数据类型使用。对于基本数据类型,判断其数据值是否相等;对于引用数据类型,判断其地址值是否相等。

equals() 是一个方法,只能对引用数据类型使用。

toString() 方法

  • 对于自定义的类,未重写时默认打印对象的类名和其地址值;
  • 对于String、File、Date和包装类等,它们都重写了该方法,调用时返回当前对象的实体内容。

clone() 方法

克隆一个已有对象。

finalize() 方法

当某个对象被垃圾回收器释放时,可以执行此方法。

标签:重写,调用,Java,子类,笔记,面向对象,构造,父类,方法
From: https://www.cnblogs.com/KoiC/p/17644390.html

相关文章

  • java基础类讲解
    一、Calendar类packagecom.qf.chapter_01;importjava.util.Calendar;publicclassTestCalendar{ publicstaticvoidmain(String[]args){ //创建Calendar对象 Calendarcalendar=Calendar.getInstance();//得到当前时间 System.out.println(calendar.getTime().......
  • 面向对象 详解方案
    什么是面向对象初始面向对象方法回顾和加深对象的创建与分析面向对象三大特性抽象类与接口内部类及OOP实战面向过程&面向对象面向过程思想步骤清晰简单,第一步做什么,第二部做什么....面对过程适合处理一些较为简单的问题面向对象思想物以类聚,分类的思维模......
  • 笔记本电脑主板的细微伤痕:一场与微观世界的舞蹈
    引言:微小的伤痕,巨大的影响有一天,我在检查一台笔记本电脑时,发现了一个微小的细节——主板上的绝缘层有一点被磨损了。这样一个微不足道的伤口,竟然引领了我走入了一个丰富多彩的微观世界。第一幕:一个小小的问题,隐藏的危机伤口的解剖学:细微的危险在我们的笔记本电脑的主板(Motherb......
  • CSS笔记-盒子模型
    CSS笔记-盒子模型1.盒子模型css开发中,常常会提到一个词叫做“盒子”,这里的盒子专业名词叫“盒子模型(BoxModel)”,这一术语是从来设计和布局时使用的。通俗的讲,所有的HTML元素都可以看做是一个盒子;那么,将页面中所有的元素都设置成一个矩形的盒子后,对页面的布局就可以理解成把不......
  • 基础面向对象
    面向对象基本概念面向对象三大特征:继承,封装,多态类就是设计图纸对象就是根据图纸造出来的实物类:对象共同特征的描述。一般一个代码文件里只写一个类对象:真实存在的具体实例类名对象名=new类名()创建对象时:类名对象名=new类名()等号左边是在给对象起名字、是在存对象的内存地址等......
  • Hadoop学习笔记、知识点搭建速过、包含Hadoop集群搭建、HDFS、IDE操作hadoop,DFSShell
    大数据概述......
  • 操作系统学习笔记
    Stanford:CS140使用操作系统概念CS162使用操作系统:设计与原理基础操作系统发展史原始操作系统在原始操作系统中,程序更多的是与硬件进行绑定,是一个无保护的标准服务库(为了方便用户或开发者使用而提供的一系列标准服务、函数或API)。系统一次只能运行一个程序多任务处理......
  • 学习Java的第17天
    Scanner进阶使用packagecom.yue.scanner;importjava.util.Scanner;publicclassDemo04{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);//**从键盘接收数据**inti=0;​floatf=0.0f;System.out.println("请输入整数:"......
  • c++ 丢失笔记 [运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符]
    运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符有一部分是学校的OJ里做题需要就提前学了,然后没记笔记,有一部分是笔记丢了。不打算补这些笔记。不过还是在这里mark一下++运算符的重载。因为++运算符可以前置也可以后置,所以这里需要注意一下,如果是后置++,需要一个in......
  • centOs8 安装JavaEE
    (1)安装linux版本的jdk步骤:先下载linux的jdk版本:下载网站:JavaDownloads|Oracle中国利用xshell:创建一个jdk文件夹:mkdir/opt/jdk利用xftp将步骤1中下载好的jdk版本安装包上传到jdk文件夹中;解压jdk文件夹中的jdk压缩包1.先进入jdk文件:cd/opt/jdk2.在jdk文件中......