访问修饰符、常见的包以及包的权限和包的导入(inport关键字)、继承(super关键字)、多态(向上和向下转型)

2023-11-19

IDEA中快捷生成getter/setter的快捷键为 alt+inser(enter)

getter/setter命名规范:都是以gte/set单词开头+要操作的属性名称

一、访问修饰符

Java中有四个关于权限的关键字,权限从小到大为:

1.1.private(当前类内部可见)<default(不需要写这个单词,默认访问权限)包(文件夹)访问权限,当前包的内部可见(子包都不可见!!!!)<protected(继承访问权限),在不同包的父子类之间可见<public(公共访问权限),只要是public权限,随意使用,完全公开

包访问权限,同一个包中,当且仅当当前这个包中同级的所有类之间可见,其他包(包括子包)都不可见。

2.1protected修饰符(可以简单理解为protected权限比包权限多了个包外父子类的权限,就不再同一个包下的时候,protected权限也只有继承是可见)

继承修饰符,不同包(和父类不同包)的父子类可见

例1:protected的访问权限包括同包中的父子类吗?

不同文件夹的父子类之间使用protected都是可见的,更何况还是同一个包,这就更加可见了!!同一个包中,使用包权限都可见,更何况比它还大的protected!

例2:同包中不同类之间(没有继承关系)的protected是否可见?

一定可见===》包权限可见的权限和方法,protected一定具备。

例3:public能否修饰外部类?

不能,假设public class Text()=>Text类定义完之后,就消失不见了,Text的外部完全都不知道他的存在!矛盾!

包的命名规范:包的命名采用全小写,多个单词之间使用_分隔。

二、包权限

可以在不同的包中创建同名的类!==>类似在操作系统的同一个文件夹内不能创建多个同名同类型的文件,但是在不同的文件夹中,可以创建多个同名称同类型的文件。

因此在Java中类的全名称为  包名.类名来唯一的确定一个类。

三、包的导入

1.1、可以使用import关键字来告知编译器入包(inport关键字表示在Java中导入某个包中具体的类,无法直接导入一个文件夹)。

1.2、假设一个包中有多个其他类,我们可以使用通配符*来表示导入(import java.util.*;),此时util中的所有类都可以使用了,具体导入哪个就导入哪个。

1.3使用通配符也有个问题,就是当同一个类中使用多个不同包的同名类,就会产生冲突。(这时时还是显示导入某个具体类即可,不要使用通配符。即包名.类名)

1.4静态导入:要使用静态导入类下的所有静态方法就只需要调用方法名称即可,就好像这些方法是自己定义的一样。

四、JDK中常见的包

1.java.lang:系统常用的基础类:String,Object(万物之母),Math,这个包在JDK1.1之后自动导入。

2.java.lang.reflect:反射开发包,反射式是所有框架的基础。

3.java.util:java提供的工具开发包(所有集合ArrayList,Linkedlist,HashMap等都在这个包中)。

4.java.sql:java数据库开发相关的包。

5.java.io:io开发包(文件的操作)。

6.java.net:网络编程开发包 Socket。

五、继承

1.1将若干个不同的类之间相同的属性和方法抽象为一个共同的父类,子类只需要扩展自己类中独有的属性和方法即可,把当前这种编程属性,称之为“继承”。(代码的复用,方便进行子类的功能扩展,子类只需要实现自己额外的属性和功能即可,共有的特性以及行为放在父类中)

1.2要想使用“继承”,能发生继承的类之间必须满足is a原则!!!!!(例:dog is a aminal;cat is a aminal)

1.3在JAVA中使用extends表示继承一个父类,父类中的所有属性和方法都会被子类继承下来,子类只需要关心实现自己独有的属性和行为即可,大大减少了重复的代码,扩展新的子类就更加容易。

2、继承的使用规则:

2.1 在JAVA中,类的继承是单继承,一个类只能使用extends关键字继承一个父类!

2.2 Java中不允许多重继承,但是允许多层继承。一般多层继承最多不超过3层关系。

3.显示继承和隐式继承

3.1 隐示继承(父类中的某些方法和属性,子类继承下来了,但是无法直接使用)和显示继承(父类中的某些方法和属性,子类继承下来了,随意使用)

4、访问父类的属性

4.1 访问父类的属性:子类想要直接访问父类的属性,父类中的属性权限必须>=protected

若显示继承,使用父类的属性,可以直接使用(子类中没有和父类同名称的属性),若子类也定义了父类相同名称的属性,则遵从就近原则(先在方法中寻找->再到当前类的内部(即子类中)->最后向上去父类中寻找同名变量。)

例:若父类和子类变量名称相同,但是类型不同,那访问谁?

只要在子类中定义了和父类名称相同的属性,无关类型使用相同名称时,调用的都是子类中覆盖后的变量!

5、 super关键字

5.1 如果想要在子类中调用被覆盖的父类中同名属性,super修饰属性,明确表示从父类中寻找同名属性。

5.2 super.方法名称表示从父类中寻找方法属性。

5.3super调用父类中的构造方法

a、若调用的是父类的无参构造,则可以不用写。

b、若调用的时父类的有参构造,则必须显示使用super(参数列表),明确表示先调用父类的构造方法。

使用super关键字调用方法注意事项:1、在子类中调用父类的构造方法必须放在子类构造方法的首行。2、this(this的构造方法调用也得放在在首行)和super表示构造方法调用时,不能同时出现

5.4super和this关键字的不同与相同点

this可以表示当前对象的引用,但是super没有这个特点,只能引用父类的属性和方法,super在引用父类的构造方法时必须放在首行;this和super都表示成员域的属性,这俩关键字都不能在静态域中直接使用

6、 子类中调用父类的方法(重点

6.1 方法重写(override)发生在有继承关系的类之间,子类定义了和父类除了权限不同以外其他全部完全相同(名称,参数列表,返回值都相同)的方法,称之为重写。

6.2 子类重写后的方法权限>=父类的权限

6.3 在子类中调用被重写后的父类方法,使用super.方法名称()表示直接从父类中寻找同名方法。

7、关于父子类对象的产生

7.1 当调用子类构造方法产生子类对象时,JVM会首先调用父类的构造方法先产生父类对象而后在产生子类对象。

六、多态(依赖于继承与方法重写实现)

多态:同样的方法,在使用不同的对象调用时,表示出不同的行为称之为“多态”。

多态同样的一个方法的多种状态(在JAVA中多态依赖于继承+方法重写来实现多态性)。

1 final关键字

1.1、final修饰的属性-->a、final修饰基本数据类型数值在定义后无法修改。(final int a=10-->a就是一个常量,定义后无法修改,只能保存10);b、final修饰引用数据类型,值不能修改,这个值指的是引用保存的地址不能修改!地址中的内容还是可以修改的。

1.2、final修饰方法-->被final修饰的方法不能被重写!(不允许子类覆盖).

1.3被final修饰的类不能被继承,final修饰的类没有子类。

2.1、在类中定义常量时,一般搭配static(定义在方法区,共同使用,避免空间的浪费)一起使用(不强制,一般来说定义类中的常量,都是静态全局常量)

3.1、常量的命名规则:

常量使用全大写命名,多个单词使用_分隔,常量必须在定义时赋值(不存在默认值)。

final AGE=10;

final String STUDENT_NAME=“小明”;

七、向上转型

对象的向上转型其实有点类似于基本数据类型的小类型提升为大类型,自动提升。

向上转型,new子类实例,子类实例的天然就是父类的包含的范围之内,满足天然的is a原则。

向上转型的优点:

1、参数统一化,方便进行子类的扩展。(假设现在要实现一个方法,接受所有Aminal以及其子类的对象,没有向上转型,只能当前类型的引用指向当前类型,若现在Aminal有成百上千个。这个方法就的重载成百上千次,但有了向上转型,参数统一化,只需要在方法形参规定父类的引用,所有子类对象都能够使用父类引用来接受。)

2、向上转型可以方便进行子类的扩展。

1.1、对象向上转型发生在以下三个位置:

1.1直接赋值

父类名称  父类引用=new 子类实例();

父类引用.方法名称()=>若这个方法被new出来的子类重写,则调用的一定是重写后方法。

Aminal animal=new Dog();

1.2方法传参

1.3方法的返回值

八、向下转型

1.1.方法的重载:重载发生在同一个类中,方法名称相同,参数列表不同,与返回值无关。

2.1.方法重写override:发生在有继承关系的类之间,子类定义了和父类除了权限不同(子类权限>=父类权限),返回值可以为向上转型类的返回值之外,参数列表,方法名称完全相同的方法,就称之为方法重写(是对非privat修饰,非final修饰,非构造方法等的实现过程进行重写缩写)。

例1.:父类是private权限,子类是public权限,能否重写?

不能!!私有方法无法被重写(同时当一个方法被final(属性:final修饰的属性不能改;final修饰的方法不能重写;final修饰的类不能有子类)修饰,说明该方法也不能被重写)。

例2.static修饰的静态方法能否被子类重写???

不能!!因为静态方法是归属与某个类,与对象无关,因此静态方法不存在方法重写。

例3.构造方法能否被子类重写?

不能!!名字不同;构造方法是为了产生对象,无法在子类中修改父类对象如何产生的。

关于方法重写的返回值,必须相同(除了向上转型类的返回值之外,其他返回值,只要不相同都不能覆写)

3.1.父类名称 父类引用=new 子类实例();

3.2.通过父类引用.操作的属性和方法,要看父类中是否有这些属性和方法;若存在,判断当前调用的这个方法是否被子类重写,若重写,则调用的时子类重写后的方法。

3.3.可以使用注解@Override检查是否覆写成功。                ·

4.1.向下转型的两点说明:

1、要想发生向下转型,必须首先先进行向上转型。

2、类型转换有风险,不能将毫无关系的两个类之间进行强转。

可以使用关键字instanceof来协助进行向下转型,只要能进行向下转型的引用,instanceof关键字才会返回true。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问修饰符、常见的包以及包的权限和包的导入(inport关键字)、继承(super关键字)、多态(向上和向下转型) 的相关文章

  • 以编程方式将 PEM 证书导入 Java KeyStore

    我有一个由两个文件 crt 和 key 组成的客户端证书 我希望将其导入到 java KeyStore 中 然后在 SSLContext 中使用 以通过 Apache 的 HTTPClient 发送 HTTP 请求 但是 我似乎找不到一种以
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • 如何在Spring的applicationContext.xml中指定默认范围来请求范围?

    我想让所有 bean 请求默认作用域 但是 Spring 文档说默认作用域是 Singleton 第 3 4 1 和 3 4 2 节http static springsource org spring docs 2 5 x referen
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 如何在 OpenAPI 3.0 中定义字节数组

    我正在将 API 从 Swagger 2 0 迁移到 OpenAPI 3 0 在 DTO 中 我有一个指定为字节数组的字段 Swagger 对 DTO 的定义 Job type object properties body type str
  • Maven 多模块项目结构问题

    自从过去几周构建我的 Maven 多模块项目以来 这是我的一次有趣的经历 当我决定使用 Maven 进行构建生命周期管理时 我有几个原因希望选择 Maven A 大多数开发团队都是分开的 这样每个团队都可以在项目中的单独模块上工作 例如团队
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • java 属性文件作为枚举

    是否可以将属性文件转换为枚举 我有一个包含很多设置的属性文件 例如 equipment height equipment widht equipment depth and many more like this and not all a
  • 哪种 Java DOM 包装器是最好或最受欢迎的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 存储过程将多个表返回到 spring jdbc 模板

    我正在使用 JdbcTemplate 从 Spring DAO 类调用存储过程 我的问题是 存储过程返回多个表 有没有办法使用 Spring JdbcTemplate 访问多个表 如果我使用jdbcTemplate queryForList
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • 为什么在尝试使用 Java 连接到 RDS PostgreSQL 数据库时会收到 SocketTimeoutException?

    我有一个 Spring 应用程序 我试图在 AWS 上托管 几天来我一直在努力配置 我有一个 EC2 实例 并且能够通过 SSH 连接到它 我还在 AWS 中设置了 Postgres RDS 数据库 但我无法使用 IDE 中的代码连接到它
  • Mule/码头设置

    我有一个正在运行的 Mule 应用程序 我想在其上设置 Jetty 来响应 http 请求 以下配置
  • 将字符串中的字符向左移动

    我是 Stack Overflow 的新手 有一道编程课的实验室问题一直困扰着我 该问题要求我们将字符串 s 的元素向左移动 k 次 例如 如果输入是 Hello World 和3 它将输出 lo WorldHel 对于非常大的 k 值 它
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • JDK 7 的快速调试/调试构建

    我正在寻找 JDK 的调试 或者我猜他们称之为快速调试构建 以启用在运行时生成的打印程序集以及查找性能问题时所需的其他诊断 就目前情况而言 我似乎找不到可以直接使用的 现成的 快速调试构建二进制包 有人可以帮我提供下载链接 或者至少提供有关
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • 日期时间解析异常

    解析日期时 我的代码中不断出现异常错误 日期看起来像这样 Wed May 21 00 00 00 EDT 2008 这是尝试读取它的代码 DateTimeFormatter formatter DateTimeFormatter ofPat

随机推荐