JAVA高级类特性(一)

2023-11-17

一、继承性


1)继承的使用:权限修饰符 class A extends B{};

2)子类:A     父类(基类 SuperClass):B

3)子类继承父类后,父类中声明的属性、方法,子类都可以获取到

        明确:当父类中有私有的属性或方法时,子类同样可以获取到,只是由于封装性的设计,使得子类不可以直接调用罢了。

4)子类除了通过继承,获取父类的结构之外,还可以定义自己的特有的成分。

    extends:子类是对父类功能的“拓展”,明确子类不是父类的子集

5)java中类的继承性只支持单继承,一个类只能继承一个父类,但一个父类可以有多个子类。

6)子父类是相对而言的概念。

7)子类继承父类,在创建子类的对象的时候会先调用父类的构造器再调用子类的构造器。

二、方法的重写

子类扩展(extends)了父类,子类是一种特殊的父类。子类可以获得父类所有的属性和方法,达到代码复用的目的。子类总以父类为基础增加新的属性和方法。但是有时候我们还需要重写(覆盖)父类的方法。

子类覆盖父类的方法遵循的是“两同两小一大”原则。两同指的是方法名和形参列表相同。两小指的是子类方法的返回值类型要小于或等于父类被覆盖方法的返回值,子类方法声明抛出的异常应比父类方法抛出的异常要小或相等。一大指的是子类方法的访问权限应该比父类方法要大或相等。尤其要注意的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法,否则回报编译错误。代码如下:


class SuperClass{

    public  void test(){}

    public void test1(){}
}

class  SubClass extends SuperClass{

    //注释掉了,编译时会报This static method cannot hide the instance method from SuperClass
    //public static void test(){}   

    @Override
    public void test1(){}
}

如果父类方法具有private访问权限,则该方法对子类是隐藏的,子类是不能访问到的,也不能覆盖该方法。如果子类定义了与父类private方法相同的方法名,则该子类只不过是新定义了一个方法而已。

//重写(覆盖)并不等于将父类的方法删除掉。

三、权限修饰符

1、Java中有四种访问权限,private、default(一般省略)、public、protected。

  1. private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
  2. default:即不加任何访问修饰符,通常称为“默认访问权限“或者“包访问权限”。该模式下,只允许在同一个包中进行访问。
  3. protected: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护访问权限”。被其修饰的属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
  4. public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包访问。

这里需要注意的是,所谓的访问,可以分为两种不同方式:第一,通过对象实例访问;第二,直接访问。 
比如说,某父类protected权限的成员,子类是可以直接访问的,换一种说话是子类其实继承了父类的除了private成员外的所有成员,包括protected成员,所以与其说是子类访问了父类的protected成员,不如说子类访问了自己的从父类继承来的protected成员。另一方面,如果该子类与父类不在同一个包里,那么通过父类的对象实例是不能访问父类的protected成员的

2、下面用表格来展示四种修饰符的访问权限范围:

权限 类内 同包 不同包子类 不同包非子类
private × × ×
default × ×
protected ×
public

四、super关键字的使用

package com.test.java;
/*
 * super可以用来修饰属性、方法、构造器
 * 
 * 1)当子类与父类中有同名的属性时,可以通过"super.属性"显式的调用父类中声明的属性。
 * 		用"this.属性"调用子类中声明的属性
 * 2)当子类重写父类的方法以后,在子类中想再显式的调用父类的被重写的方法,需要用"super.方法来调用"
 * 3)super修饰构造器:通过在子类中使用"super(形参列表)"来显式的调用父类的构造器
 * 		>在构造器内部,"super(形参列表)"必须要声明在首行
 * 		>在构造器内部,"this.(形参列表)"与"super(形参列表)"只能出现一个
 * 		>当构造器中,不显式的调用this()或者super()其中任何一个,默认调用的是父类的空参构造器
 * 			如果父类没有声明空参构造器,或者只声明了带参数的构造器(这时空参构造器自动作废),在子类
 * 			中会报错
 * 		建议:在设计一个类时,尽量提供一个空参构造器。
 */

public class Person {
	public String name;
	
	public Person() {//父类构造器
		this.name = "Father";
		System.out.println(this.name);
	}
	
	public void eat() {
		System.out.println("父类吃饭");
	}
}
class Student extends Person{
	public String name;
	
	public Student() {//子类构造器,经过main方法测试,调用子类构造器之前会自动调用父类构造器
		//相当于这里有一个 Super();
		this.name = "Son";
		super.name = "SuperFather";//在子类中调用父类的
		System.out.println(this.name+super.name);
	}
	public void eat() {
		System.out.println("子类吃饭");
		super.eat();//在子类中用super调用父类的重名方法,重写(覆盖)并不等于将父类的方法删除掉。
	}
}
五、子类对象实例化
class Creature{
       public Creature(){
	System.out.println("Creature无参数的构造器");	
       }
}
class Animal extends Creature{
       public Animal(String name){
	System.out.println("Animal带一个参数的构造器,该动物的name为" + name);
       }
       public Animal(String name , int age){
	this(name);
	System.out.println("Animal带两个参数的构造器,其age为" + age);
       }
}
public class Wolf extends Animal{
       public Wolf(){
	super("灰太狼", 3);
	System.out.println("Wolf无参数的构造器");
       }
       public static void main(String[] args){
	new Wolf();
       }    }

从创建Wolf对象开始,调用Wolf构造器,Wolf构造器调用父类Animal的两个参数的构造器,两个参数的构造器再调用一个参数的构造器,一个参数的构造器再调用父类Creature的构造器,Creature构造器调用Object类中的构造器,然后再逆向执行回来,最后一个被调用的构造器最先执行,依次向下执行构造器中的内容,像对象中的toString方法等就是再Object类中的某个方法,任何一个类调用构造器都会以最后一个Object类结束。

六、多态性

package com.xijian.java;
/*
 * 多态的应用举例
 * 总结:通过向上转型来引用父类方法(在子类未重写方法的前提下),通过向下转型来引用子类独有的方法
 * 向下转型实际就是在栈空间声明一个子类引用类型的变量指向栈空间的父类引用对象,通过父类引用对象进而指向堆空间,对对象进行操作。
 * 访问权限是由引用变量类型决定的。
 */
public class TestAnimal {
	public static void main(String[] args) {
		Animal a = new Dog();//可以扩大对象被调用的权限
		Animal b = new Cat();//可以扩大对象被调用的权限
		TestAnimal test = new TestAnimal();
		test.func(a);
		test.func(b);
	}
	public void func(Animal a) {
		a.eat();
		a.jump();
		
		if(a instanceof Dog) {
			Dog d = (Dog)a;//向下转型,用新的引用类型去引用子类存在而父类不存在的方法
			d.say();
		}
		if(a instanceof Cat) {
			Cat c = (Cat)a;//向下转型,用新的引用类型去引用子类存在而父类不存在的方法
			c.say();
			c.name = "1";
			System.out.println(a.name);//通过测试可以看出,向下转型使用新的引用类型可以对子类对象进行操作
		}
	}
}
class Animal{
	String name;
	int age;
	
	public void eat() {
		System.out.println("进食");
	}
	public void jump() {
		System.out.println("jump");
	}
	
}
class Dog extends Animal{
	public void eat() {
		System.out.println("狗进食");
	}
	public void jump() {
		System.out.println("狗急跳墙");
	}
	public void say() {
		System.out.println("狗叫");
	}
}
class Cat extends Animal{
	public void eat() {
		System.out.println("猫进食");
	}
	public void jump() {
		System.out.println("猫跳");
	}
	public void say() {
		System.out.println("猫叫");
	}
}

多态性:多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

1)如果我们定义了一个指向子类的父类引用类型,那么它除了能够引用父类的共性外,还可以使用子类强大的功能,这就是向上转型。

父类名称 引用对象名称 = new 子类对象名称();

指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

2)如果在向上转型之后想访问子类中独有的方法,需要向下转型,向下转型实际就是在栈空间声明一个子类引用类型的变量指向栈空间的类引用对象,通过父类引用对象进而指向堆空间,对对象进行操作。

子类名称 新引用对象名称 = (子类名称)需转型的对象名;

3)子类对象的多态性,并不适用于属性!

在调用属性的时候,只是看的是调用对象的引用类型,如果这个对象的引用类型是父类的,那么调父类的属性,如果是个子类的引用类型,则调子类对应的属性,并不存在多态性。

4)判断对象属于哪种类型的

if(obj instanceof class)
{
}

其返回true情况如下

1.obj是class类的对象

2.obj是class类子类的对象

七、object类及其equals方法

package com.xijian.java;

public class Testequals {
	public static void main(String[] args) {
		//==
		//1.基本数据类型:根据基本数据类型的值判断是否相等。相等返回true,否则返回false
		//注:两端数据类型可以不同,在不同的情况下也可以返回true
		int i = 12;
		int j = 12;
		System.out.println(i==j);//true
		char c = 12;
		System.out.println(i==c);//true
		float f = 12.0F;
		System.out.println(i==f);//true
		
		int k = 65;
		char a = 'A';
		System.out.println(k==a);//true
		//2.引用数据类型:比较引用类型变量的地址值是否相等。
		Object obj1 = new Object();
		Object obj2 = new Object();
		Object obj3 = new Object();
		obj3 = obj1;
		System.out.println(obj1==obj2);//false
		System.out.println(obj1==obj3);//true
		//equals():①只能处理引用类型对象,并且比较的是两个对象的地址值是否相等
		System.out.println(obj1.equals(obj2));
		System.out.println(obj1.equals(obj3));
		//像String类 包装类 File类 Date类重写了Object类里的equals方法
		//比较的是两个对象中的具体内容是否相同
		String str1 = new String("AA");
		String str2 = new String("AA");
		System.out.println(str1.equals(str2));//true
	}
}







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

JAVA高级类特性(一) 的相关文章

  • static静态代码块

    static静态代码块 public class Person 静态代码块 在类加载时候执行静态代码块 只会执行一次 static System out println Person static initializer 实例初始化块 每次
  • 【Java SE】基本数据类型

    大家好 我是保护小周 本期为大家带来的是 Java的基本数据类型 内容会与C语言的基本数据类型进行基本的比较 数据类型提示 整型提升 以及简单了解 String 类型 进一步感受Java 的安全性 C语言混不下去了 面向对象的编程太爽了 目
  • 【JavaSE系列】第八话 —— 继承和它的边角料们

    导航小助手 思维导图 一 引出继承 二 继承的概念 三 继承的语法 四 父类成员访问 4 1 子类中访问父类的成员变量 4 2 子类访问父类的成员方法 五 super 关键字 5 1 super 成员变量 5 2 super 成员方法 5
  • JavaSE——StringBuffer与StringBuilder拼接字符串详细解释

    目录 一 基本了解 1 1使用字符串频繁拼接会出现什么问题 1 2 了解StringBuffer 1 3 了解StringBuilder 1 4 StringBuffer与StringBuilder的区别 二 StringBuffer的使用
  • Java 基础进阶篇(十八):正则表达式匹配规则和应用

    文章目录 一 正则表达式概述 二 正则表达式的匹配规则 三 正则表达式在方法中的应用 3 1 校验手机号 邮箱和座机电话号码 3 2 字符串的内容替换和分割 四 编程题目 4 1 表示数值的字符串 4 2 非严格递增连续数字序列 一 正则表
  • 关于Java集合的一些技巧

    需要唯一吗 需要 Set 需要指定顺序吗 需要 TreeSet 不需要 HashSet 但是想要一个和存储一致的顺序 有序 LinkedHashSet 不需要 List 需要频繁增删吗 需要 LinkedList 不需要 ArrayList
  • eclipse上配置JavaFX完整教程

    1 选择菜单栏Help中的Install New Software 2 点击Add添加安装JavaFx环境 name e fx clipse Location http download eclipse org efxclipse upda
  • Java中的String的一些常用方法

    家人们好 目录 字符 字节与字符串 字符与字符串 获取指定位置的字符 字符串与字符数组的转换 给定字符串一个字符串 判断其是否全部由数字所组成 字节与字符串 实现字符串与字节数组的转换处理 字符串常见操作 字符串比较 不区分大小写比较 观察
  • 值传递与引用传递的区别

    一 值传递 是指在调用函数时将实际参数复制一份传递到函数中 这样在函数中如果对参数进行修改 将不会影响到实际参数 代码在内存中的执行流程 1 首先加载main方法 2 接下来int number 100 3 输出调用前的number 结果为
  • 3.5安装ideay、快捷键

    注册账号 网址 https www jetbrains com 绑定激活码 网址 https www jetbrains com store redeem Alt Enter 快速补全 Ctrl shift O 清理导包 去除无用的包 Ct
  • Java五子棋详细步骤及完整代码

    五子棋 1 定义声明一个二维数组做棋盘 import java util Scanner public class Main public static void main String args 定义声明一个二维数组作为棋盘 int ga
  • java中的异常

    异常 什么是异常 运行时异常和编译时异常 编译时异常 运行时异常 异常处理及其语法 异常的产生及处理 try catch语句 finally语句 抛出异常 throws关键字 throw关键字 自定义异常类 什么是异常 java中的异常是指
  • Java概述

    Java 简介 一个苦逼的建筑专业的Java小白 什么是 Java Java 是一门面向对象编程语言 不仅吸收了 C 语言的各种优点 还摒弃了 C 里难以理解的多继承 指针等概念 因此 Java 语言具有功能强大和简单易用两个特征 Java
  • XML语言

    XML XML是可扩展的标记语言 标记语言 通过标签来描述数据的一门语言 标签有时我们也将其称之为元素 可扩展 标签的名字是可以自定义的 XML文件是由很多标签组成的 而标签名是可以自定义的 xml学习网站https www w3schoo
  • Java的异常(分类、处理原则、应用实例、注意事项)

    学习笔记 异常 异常 是在运行时期发生的不正常情况 在java中用类的形式对不正常情况进行了描述和封装对象 描述不正常的情况的类 就称为异常类 以前 通常将正常流程代码和问题处理代码相结合 现在将正常流程代码和问题处理代码分离 提高阅读性
  • jmeter实战案例

    一 前言 以前做了个抽奖活动的需求 需要做压测 只是简单帮助测试去做过压测 但没有自己从头到尾做过 最近再次碰到需要做压测 百度了一下使用教程 现在做个记录 以便以后做压测 直接借鉴教程 二 流程 1 启动jmeter 下载jmeter后
  • java虚拟机+分隔符

    java 入门 java 虚拟机 1 java虚拟机的平台可移植性 只要将java虚拟机安装于不同平台 我们编译的 class 文件就可以运行 2 jdk java开发 3 jre java运行时环境 jdk jre 下载安装后必须在环境变
  • System.out.println()影响系统运行效率!!!

    在Java开发中 System out println 是一种常用的输出方式 可以将字符串输出到控制台 然而 这种输出方式在一定程度上会影响系统的运行效率 首先 System out println 的输出操作需要占用CPU和内存资源 因为
  • String类详解

    目录 一 创建字符串的四种方式 1 直接赋值 2 通过构造方法创建对象 3 通过字符数组创建对象 4 通过String类的静态方法valueOf 任意数据类型 gt 转为字符串 二 字符串比较相等 equals方法 equalsIgnore
  • Scanner类用法(学习笔记)

    Scanner类用法 学习笔记 后续会补充 1 next 用法 package com yushifu scanner import java util Scanner util java工具包 Scanner类 获取用户的输入 Scann

随机推荐

  • 华为OD机试 - 连续字母长度(Java)

    题目描述 给定一个字符串 只包含大写字母 求在包含同一字母的子串中 长度第 k 长的子串的长度 相同字母只取最长的那个子串 输入描述 第一行有一个子串 1 lt 长度 lt 100 只包含大写字母 第二行为 k的值 输出描述 输出连续出现次
  • 神经网络训练

    在数码管识别中 识别之前 字符归一化之后的大小是20 20个像素
  • 听说Python多线程和多进程有鸡肋?一起聊聊...

    听说是鸡肋 一直以来 关于Python的多线程和多进程是否是鸡肋的争议一直存在 今晚抽空谈谈我的看法 以下是我的观点 对于多线程 Python 的多线程库 threading 在某些情况下确实是鸡肋的 这是因为 Python 的全局解释器锁
  • CentOS7.X版本下安装MySQL5.7

    记录CentOS7 X版本下安装MySQL5 7数据库 设置rpm下载目录在 opt目录下新建一个目录存放mysql cd opt sudo mkdir mysql 下载MySQL的源 wget http repo mysql com my
  • [CTF/网络安全] 攻防世界 disabled_button 解题详析

    CTF 网络安全 攻防世界 disabled button 解题详析 input标签 姿势 disable属性 总结 题目描述 X老师今天上课讲了前端知识 然后给了大家一个不能按的按钮 小宁惊奇地发现这个按钮按不下去 到底怎么才能按下去呢
  • Centos7.4安装kvm虚拟机(使用virt-manager管理)

    原文链接 https www centos bz 2018 02 centos7 4 E5 AE 89 E8 A3 85kvm E8 99 9A E6 8B 9F E6 9C BA EF BC 88 E4 BD BF E7 94 A8vir
  • 2022年SQL经典面试题总结(带解析)

    一 选择题 1 基础题 1 要求删除商品表中价格大于3000的商品 下列SQL语句正确的是 A DELETE FROM 商品 WHERE 价格 gt 3000 B DELETE FROM 商品 WHERE 价格 gt 3000 C DELE
  • 【空间面板计量专题,举一反三,学通学透】

    重点内容 空间计量概念 空间权重矩阵 空间面板计量全套代码 前言 最近因为要写一篇关于环境规制的论文 需要用到空间计量的方法 于是开始从零学习这个模块的内容 在耗费大量精力以及微薄的财力之后 最终也是在实际操作方面能够得以初窥门径 不过回顾
  • 【模板】树状数组

    文章目录 1 概述 2 原理 3 实现 3 1 lowbit x 3 2 查询前缀和 3 3 单点增加 4 初始化 1 概述 树状数组 Binary Indexed Trees 其基本用途是维护序列的前缀和 对于给定的序列 a a
  • RT-Thread 框架下,GD32F450,串口DMA收发驱动 编写示例

    写在前面的话 RT Thread的软件包 BSP目录下 GD32F450 eval 串口驱动目前 2022 09 05 还不全 只能一个byte一个byte的接收 对于一个搞硬件的熟系MCU运行方式的强迫症来说 如此浪费CPU资源 这能忍
  • Flutter网络请求篇-dio-retrofit

    flutter retrofit plug网址 https pub dev packages retrofit 创建抽象类 RestApi baseUrl http www devio org abstract class Http fac
  • 一百人研发团队的难题:研发管理、绩效考核、组织文化和OKR

    什么是研发团队 简单的说 你熟悉的那帮穿格子衬衫 以程序员为核心组成的团队 就是研发团队 本来 你以为格子男们是很乖很闷骚的那种 管理和协作起来比销售和业务简单很多 而实际情况是 格子男们并不那么容易管理 面向代码世界的复杂度 可能远比面向
  • 微信小游戏使用three.js开发总结2023.9.12

    微信小程序开发总结 1技术选择 我这里使用的是three js 进行的开发 目前开发了 酒馆卡牌 3D决对 两款微信小游戏 其中 酒馆卡牌 模仿的是iphone 美区的游戏 注重看在游戏没有复杂的战斗 在没有服务器的情况下依旧可以运行 由于
  • 完美解决phpstrom 2018.1.6版本汉化后不能打开设置的问题

    网上很多phpstrom汉化后设置大不开 很苦脑 今天我花时间找到了完美解决方案1 下载后 看汉化说名 链接 https pan baidu com s 1RD7PJwWxfCST2ctELwCrSA 密码 jy43
  • 无人车

    1 无人车四大核心技术 自动驾驶实际包含三个问题 一是我在哪 二是我要去哪 三是如何去 第一个问题是环境感知和精确定位 无人车需要的是厘米级定位 厘米级定位是无人驾驶的难点之一 不光是车辆本身的语义级定位 还有一个绝对坐标定位 第二个问题是
  • VS2005中SetUnhandledExceptionFilter函数应用

    很多软件通过设置自己的异常捕获函数 捕获未处理的异常 生成报告或者日志 例如生成mini dump文件 达到Release版本下追踪Bug的目的 但是 到了VS2005 即VC8 Microsoft对CRT C运行时库 的一些与安全相关的代
  • jsonobject转java对象的方法

    将 JSONObject 转换为 Java 对象通常涉及几个步骤 首先是定义 java 类 然后解析 JSONObject 接着提取相应字段值 将其赋值给 Java 对象的属性 最后创建 java 对象 详细流程如下 1 定义 Java 类
  • CTF_ctfshow_web9_sql注入

    打开靶机 手工注了一下 发现没有注入点 然后查看了一下robots txt协议 提示了index phps 访问一下 下载下来了源码
  • 王怀民:推动中国开源创新从参与融入到蓄势引领

    作为数字时代的新趋势 开源正以 开放 共享 协同 商业模式 的新型生产方式 以 自由 的传播形式 成为推动全球科技发展的核心引擎 而在全世界开源大发展的背景下 近年来中国开源的发展速度已成为全球最快 支持数字技术开源社区等创新联合体发展 完
  • JAVA高级类特性(一)

    一 继承性 1 继承的使用 权限修饰符 class A extends B 2 子类 A 父类 基类 SuperClass B 3 子类继承父类后 父类中声明的属性 方法 子类都可以获取到 明确 当父类中有私有的属性或方法时 子类同样可以获