1. 多态

1.1 多态

​ 多态是指同一种行为具有多种不同的表现形式。

前提

  • 有继承或者实现关系
  • 有方法重写(没有重写多态就没有意义)
  • 父类引用指向子类对象

格式

  1. 父类类型 变量名 = new 子类/实现类构造器;
  2. 变量名.方法名();

运行特点

  • 调用成员变量时:编译看左边,运行看左边
  • 调用成员方法时:编译看左边,运行看右边

弊端

​ 如果子类有独有的功能,多态的写法无法访问子类独有的功能。

1.2 引用类型转换

​ 想要访问子类独有的功能,需要进行引用类型转换。

1.2.1 向上转型(自动转换)

​ 多态本身就是子类类型向父类类型向上转换的过程,这个过程是默认的。

​ 父类类型相对于子类类型来说是大范围的类型,所以范围小的子类可以直接自动转换为范围大的父类。

1.2.2 向下转换(强制转换)

​ 父类类型向子类类型向下转换的过程,这个过程是强制的。

1.2.3 instanceof关键字

​ 转型的过程中一不小心就会引发ClassCastException,即类型转换异常。

如下:

  1. public class Test {
  2. public static void main(String[] args) {
  3. // 向上转型
  4. Animal a = new Cat();
  5. a.eat(); // 调用的是 Cat 的 eat
  6. // 向下转型
  7. Dog d = (Dog)a;
  8. d.watchHouse(); // 调用的是 Dog 的 watchHouse 【运行报错】
  9. }
  10. }

​ 这段代码可以通过编译,但是运行时,却报出了 ClassCastException ,类型转换异常!这是因为,明明创建了Cat类型对象,运行时,当然不能转换成Dog对象的。

为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验,格式如下:

  1. 变量名 instanceof 数据类型
  2. 如果变量属于该数据类型或者其子类类型,返回true
  3. 如果变量不属于该数据类型或者其子类类型,返回false

instanceof新特性

JDK14的时候提出了新特性,把判断和强转合并成了一行

  1. //先判断a是否为Dog类型,如果是,则强转成Dog类型,转换之后变量名为d
  2. //如果不是,则不强转,结果直接是false
  3. if(a instanceof Dog d){
  4. d.lookHome();
  5. }else if(a instanceof Cat c){
  6. c.catchMouse();
  7. }else{
  8. System.out.println("没有这个类型,无法转换");
  9. }

2. 包

  1. 什么是包?包的作用是什么?

    • 包就是文件夹,用来管理各种不同功能的类
  2. 包名的书写规则?
    • 公司域名反写+包的作用,需要全部英文小写,见名知意,如:com.kuaicode.test
  3. 什么是全类名?
    • 包名+类名 如:java.lang.String

使用其他类的规则:

  • 使用同一个包中的类时,不需要导包。
  • 使用java.lang包中的类时,不需要导包。
  • 除以上两种情况外都需要导包
  • 如果同时使用两个包中的同名类,需要使用全类名

3. final

final的作用:

  • 修饰方法:表明该方法是最终方法,不能被重写

  • 修饰类:表明该类是最终类,不能被继承

  • 修饰变量:被修饰的变量叫做常量,只能被赋值一次

    细节:

    final修饰的变量是基本数据类型:变量存储的数据值不能改变

    final修饰的变量是引用数据类型:变量存储的地址值不能改变,对象内部的数据可以改变

常量

  • 实际开发当中,常量一般作为系统的配置信息,方便维护,提高可读性。
  • 常量的命名规范:
    • 单个单词:全部大写
    • 多个单词:全部大写,单词之间用下划线隔开

3. 权限修饰符和代码块

3.1 权限修饰符

在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限。

  • public:公共的,所有地方都可以访问。

  • protected:本类、本包以及其他包中的子类可以访问。

  • 默认(不写修饰符):本类和本包可以访问。

  • private:本类可以访问。

    public > protected > 默认 > private

public protected 默认 private
同一类中
同一包中的类
不同包的子类
不同包中的无关类

权限修饰符的使用规则:

​ 实际开发中一般只使用privatepublic

  • 成员变量私有
  • 方法公有

注意:如果方法中的代码是抽取其他方法中共性的代码,这个方法一般也私有。

3.2 代码块

分类

  • 局部代码块
  • 构造代码块
  • 静态代码块

作用

  • 局部代码块:提前结束变量的生命周期(已淘汰)。
  • 构造代码块:抽取构造代码中的重复代码(不够灵活)。
  • 静态代码块:数据的初始化(重点)。

Java学习笔记09的更多相关文章

  1. java学习笔记06--正则表达式

    java学习笔记06--正则表达式 正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证.拆分.替换等操作. 例如:现在要去判断一个字符串是否由数字组成,则可以有以下的两种做法 不使用正则 ...

  2. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  3. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  4. Java学习笔记(04)

    Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...

  5. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  6. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  7. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  8. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

  9. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  10. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

随机推荐

  1. Q:oracle 日期筛选

    一.oracle where条件日期筛选 两种方法:tochar和todate todate:将字符串按照指定的格式输出,得到的是日期类型. to_date('2019-12-01','yyyy-MM ...

  2. Sublime Text3汉化好的绿色免安装版使用和破解教程+下载链接

    这个资源是我从官网上面下载好的Sublime Text3绿色版,然后通过网上的教程汉化之后再压缩的.理论上下载完之后,解压就可以用了,不过由于是绿色版,可能需要调一下默认打开方式.才好直接双击打开.绿 ...

  3. nRF52832起来之后测试是上电还是休眠唤醒的方法

    void fu_state_machine_init(void) { /* NRF_POWER_RESETREAS_SREQ_MASK JLINK DOWNLOAD / POWER ON can ca ...

  4. Tomcat总体架构和启动流程

    Tomcat大家都知道,这个没什么好描述的,我们先看Tomcat的总体架构 1.总体架构 架构一步一步增加组件,先来个最原始的 === Server:Tomcat的整体服务,负责接收和处理请求.其拥有 ...

  5. beamforming源码标记

    p:各阵元的声压信号矩阵 R:接收数据的自协方差矩阵 Pcbf:交叉谱矩阵

  6. git 强制拉取远程到本地

    git fetch --all git reset --hard origin/master git pull

  7. Switch问题

    package com.company;public class Main { public static void main(String[] args) { Income[] incomes = ...

  8. python内置函数open()

    open()函数 介绍 open()函数用于打开文件并创建文件对象. open()函数的语法格式: file = open(filename, mode='r', buffering=-1, enco ...

  9. 网络安全(中职组)-B模块:服务远程控制

    任务四:服务远程控制任务环境说明:服务器场景名:20200609(关闭链接)服务器场景操作系统:未知服务器场景用户名:root服务器场景密码:Admin123 1.    通过本地PC中渗透测试平台K ...

  10. Cocos 引擎生态部负责人李阳:己之所欲,可施于人,希望通过生态促进国内引擎技术发展

    前言 "小小的身体,大大的能量,这个应该是我对大表姐最直接的感觉,在她娇小的身躯里蕴含了无限的精力和潜力,很像漫威里的神奇女侠,作为一个具备冒险精神的非典型程序员,大表姐热爱的体育活动都是很 ...