面向对象-继承-Object-final关键字-包和访问权限(个人复习)

tech2023-11-19  93

文章目录

面向对象一、继承1.类与类之间常见关系2.继承(1)为什么要继承(2)继承的语法(3)继承的术语(4)java中继承的规定(5)方法重写(覆盖override)(6)重载与重写区别(7)super关键字(8)构造方法的特殊性(9)instanceof关键字 二、Object1.Object类型概述2.Object的常见方法(1)hashCode方法(2)toString方法(3)equals方法(4)==和equals方法的区别 三、fianl关键字1.final概述2.final修饰变量3.final修饰方法4.final修饰类5.final修饰局部变量6.final修饰形参四、包和访问权限1.包(1)包的概念(2)基本用法(3)JDK中的包(4)import语句 2.访问权限

面向对象

一、继承

1.类与类之间常见关系

继承关系 继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。

实现关系 实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性。在UML类图设计中,实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。

2.继承

(1)为什么要继承

继承是为了重用父类的代码,为了更简略地定义类的行为 继承是为了获得多态的效果作准备(多态是面向对象的灵魂)

(2)继承的语法

格式

修饰符 class 类名 extends 父类{ 新属性; 新方法; 重载的方法; 覆盖的方法; }

(3)继承的术语

被继承的类 父类fatherclass 、超类superclass、基类Base class 继承类 子类subclasses、衍生类/导出类Derived class

(4)java中继承的规定

只能从一个父类继承(单继承) 默认是从Object继承 Object类提供了很多有用的方法

(5)方法重写(覆盖override)

子类重写父类方法。 子类继承父类的目的是重用父类的代码,简化代码。子类中也可以添加自己新的成员变量和方法,起到扩展的作用。但是,子类中也可以定义和父类相同的方法,起到修正父类方法的作用

重写细节 1.方法名必须相同 2.参数列表必须相同 3.子类重写父类方法的时候,方法的访问权限必须大于等于父类的方法的访问权限否则编译报错 4.子类重写父类方法的时候,返回值类型必须是父类方法的返回值类型或该返回值类型的子类。不能返回比父类更大的数据类型。 5.子类重写父类方法的时候不能比父类抛出更多的异常。

(6)重载与重写区别

(1)重载(overload) 前提:所有重载方法必须在同一个类中 特点:方法名相同,参数列表不同,与其他无关

(2)重写(override) 前提:有继承关系 特点:方法名必须相同,参数列表必须相同 子类返回值类型要等于或者小于父类的返回值

(7)super关键字

super关键字的作用 在子类中调用父类成员(非private修饰的) 在子类中的构造方法中调用父类构造方法(必须放在子类构造方法的第一句)

(8)构造方法的特殊性

与普通方法相比较,构造方法很特殊。 如果没有继承 创建对象,一定会调用构造方法,我们可以选择是调用哪一个(当有多个构造方法重载时) 在对象的其它生命阶段,我们无法去调用构造方法。 一个对象的一生中必需调用一次构造方法。

若有继承关系,创建一个对象的时候,必须先要初始化父类的构造方法 子类构造方法执行前,必须先调用父类的构造方法。但子类可以选择调用父类的哪个构造方法。 用super(xxx)的格式来选择。 构造方法不能重写。

(9)instanceof关键字

instanceof是什么 1:属于比较运算符: 2:instanceof关键字:该关键字用来判断一个对象是否是指定类的对象。 3:用法: 对象 instanceof 类; 该表达式是一个比较运算符,返回的结果是boolean类型 true|false 注意:使用instanceof关键字做判断时,两个类之间必须有关系。

二、Object

1.Object类型概述

Object类是所有类型的顶层父类,所有类型的直接或者间接的父类;所有的类型中(包括数组)都含有Object类中的所有方法。

随意定义一个类型,不手动显式定义其父类,那么这个类的父类就是Object类。

Object类的构造方法:Object() 1、可以自己创建对象 2、让子类访问,所有子类都会直接或者间接的访问到这个顶层父类的构造方法 3、Object类在执行构造方法时,不去访问自己的父类,因为没有父类了

2.Object的常见方法

(1)hashCode方法

哈希码: Java语言中,Object对象有个特殊的方法:hashcode(), hashcode()表示的是JVM虚拟机为这个Object对象分配的一个int类型的数值,JVM会使用对象的hashcode值来提高对HashSet 、HashMap、Hashtable哈希表存取对象的使用效率。

生成数字的原则: 同一个对象多次调用hashCode方法,【必须】返回相同的整数(程序多次运行不要求哈希码值保证一致) 使用equals方法判断相同的两个对象,【必须】返回相同的整数(equals方法是用于决定两个对象是否相同的方法)

(2)toString方法

返回当前对象的字符串表示。

1、Object类型中,这个方法的实现:全类名 + @ + 哈希码值的十六进制表示 简称这个内容为:对象的地址值 2、对象返回这样一个地址值的字符串,没有什么意义,因此对于子类而言,需要重写父类的这个方法。

(3)equals方法

用于比较两个对象是否相等的方法,比较的就是“调用者”和“参数”这两个对象 boolean equals(Object obj)

**性质:** 自反性:自己和自己相等 对称性:A和B相等,那么B就和A相等。A.equals(B)为true,那么B.equals(A)也为true 传递性:A.equals(B)为true,并且B.equals(C)为true,那么A.equals(C)也为true 一致性:A多次调用equals方法用于和B对象比较,应该返回相同的判断结果

在Object类型中,比较的是两个引用是否指向了同一个对象。如果是,才返回true。相当于是在比较两个对象的地址值是否相同。

实际应用中,比较两个对象的内存地址,没有什么意义。因此在自定义的子类中,都要重写这个方法。

(4)==和equals方法的区别

参考此文

三、fianl关键字

1.final概述

final是个修饰符 final的含义是“终极版本” final可以修饰变量,方法,类,方法参数。

2.final修饰变量

被final修饰的变量此时转换为常量 变量在被final修饰式必须赋值 此变量在第一次被赋值后,再无法修改它的值

成员常量一般做成static类型,因为没有必要为每个实例提供一份根本不会变化的变 量空间

常量的定义规则 public static final double PI=3.14; 1:public :访问权限最大 2:static :内存中只有一份 3:final :是一个常量 4:常量名大写,多个单词用下划线(_)分隔 5:必须初赋值,赋值后,不能重新赋值。

3.final修饰方法

该方法是最终方法,不能被子类重写

class A{ public final void sayHello(){ System.out.println("你好"); } } class B extends A{ public void sayHello(){ // 编译报错——不能重写父类中被final修饰的方 } }

4.final修饰类

该类是最终类,不能被继承

final class AA{ } class BB extends AA{ // 编译报错——被final修饰的类,不能被继承 jdk中的String类就是不能被继承的 }

5.final修饰局部变量

final修饰的局部变量不能重新赋值

class X{ // final修饰局部变量 public void hello(){ final int x = 100; x = 200; //final修饰的局部变量,不能重新赋值 } }

6.final修饰形参

1: 当形参被修饰为final,那么该形参所属的方法中不能被篡改(重新赋值)。 2: 项目中主要用于一些只用来遍历未知数据的方法。将未知变量声明为final的。增强数据的安全性。

public class TestFinal { /* * 用final修饰方法的形参 * */ public static void printStudentName(final Student s){ //s.setName("yyy"); // 这句不是为形参重新赋值 //s = new Student(2,"李四"); // 因为final修饰了形参,所以不能重新赋值 System.out.println(s.getName()); } public static void add(final int x, final int y){ /* 因为final修饰了 形参,所以在方法中不能为 形参重新赋值 x = 10; y = 10; */ System.out.println(x+y); } public static void main(String[] args) { Student s = new Student(1,"xxx"); printStudentName(s); add(100, 100); } }

四、包和访问权限

1.包

(1)包的概念

包是Java程序组织文件的一种方式,实质就是文件夹。 包的作用: 1、方便管理大型软件系统中数目众多的类。 2、相同名称的类可以放到不同的包中解决了命名冲突的问题。

(2)基本用法

Java语言用package语句表示建立一个包,该语句必须放到源文件的非注释第一句,package语句下声明的类存放到该包(文件夹)中,语法如下: package pkg1[.pkg2…]; 例如:package com.offcn.test 系统自动建立三个文件夹,结构如下: -com —offcn ----test 该文件中所定义的类都在test文件夹下。

package com.offcn.finaltest;

(3)JDK中的包

1、java.lang包含一些Java语言的核心类,如String、Math、Integer 、System和Thread,提供常用功能。 2、java.util包含一些实用工具类,如集合、日期等。 3、java.io 包含能提供多种输入/输出功能的类。 4、java.net包含执行与网络相关的操作的类。 5、java.awt包含构成抽象窗口工具集的多个类,这些类用来创建和管理应用程序的图形用户界面(GUI)。

(4)import语句

如果将一个类放入包中,则使用该类时,必须使用该类的全名 (例如com.offcn.Student),Java编译器才能找到该类。如果在文件中多次使用Student,则每次都要使用类全名,比较麻烦。 解决方式:使用import语句

使用import语句应该注意的几点: 1、import语句定义在package语句后 2、java.lang包是默认被导入的,该包下所有类都可以直接使用。 3、包的导入不是迭代的,也就是当使用com.offcn.*时只会导入该包下的所有类,如果该包下有文件夹a,则a下的所有类不会被导入。 4、同一个包下的类,不需要导入。

2.访问权限

Java通过访问控制修饰符对类和类中的成员进行访问权限的控制。

private(私有的) default(默认的) 注意:并不是使用default关键字,而是省略访问控制符。 protected(受保护的) public(公共的)

各个访问控制符的访问权限控制如下:

最新回复(0)