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高级类特性(一) 的相关文章

  • Java常用类:System类

    文章目录 System类概述 1 arraycopy 方法 概述 语法 举例 2 currentTimeMillis 方法 概述 语法 举例 3 gc 方法 概述 语法 举例 4 exit int status 方法 概述 语法 举例 Sy
  • Java中的String的一些常用方法

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

    一 Map常用方法 1 Map集合在 java util Map 包下 Map集合以键值对 key和value 的方式存储数据 key和value都是引用数据类型 都是存储对象的内存地址 2 Map接口中常用方法 V put K key V
  • Java String总结

    文章目录 创建String 字符串比较 字符串常量池 直接赋值 构造方法 理解字符串不可变 反射 特殊手段 char 和String StringBuffer和StringBuilder String API 创建String 常见的构造方
  • 值传递与引用传递的区别

    一 值传递 是指在调用函数时将实际参数复制一份传递到函数中 这样在函数中如果对参数进行修改 将不会影响到实际参数 代码在内存中的执行流程 1 首先加载main方法 2 接下来int number 100 3 输出调用前的number 结果为
  • Java中ASCII码与字符之间的相互转换

    ASCII码转字符 char word char 97 强制转换 字符转ASCII码 int value a 加
  • 3.5安装ideay、快捷键

    注册账号 网址 https www jetbrains com 绑定激活码 网址 https www jetbrains com store redeem Alt Enter 快速补全 Ctrl shift O 清理导包 去除无用的包 Ct
  • 日志-Log4J

    日志 程序中的日志可以用来记录程序在运行的时候点点滴滴 并可以进行永久存储 日志和输出语句的区别 输出语句 日志技术 取消日志 需要修改代码 灵活性比较差 不需要修改代码 灵活性比较好 输出位置 只能是控制台 可以将日志信息写入到文件或者数
  • Eclipse报错-The selection cannot be launched,and there are no recent launches

    Eclipse报错 报错 The selection cannot be launched and there are no recent launches 怎么解决 解决办法 1 检查分号 2 检查main函数 3 检查main函数后面括
  • Scanner中nextInt()和nextLine()详解(秒懂)

    直接上代码 输出结果 结果分析 nextInt 和nextLine 顺序互换代码如下 输出结果 结果分析 解决方法 可以将nextLine 用next 替换 两者nextLine 执行之前再加一个空nextLine 让这个空的清楚掉回车符再
  • JAVA字符串的两种定义方式的区别

    关于JAVA中两种字符串定义方式的区别 第一次写 就当复习总结一下 希望能帮到需要的人吧 我们知道在JAVA中 对于字符串的实例化方式有两种 直接赋值 String str Hello World 构造方法实例化 String str ne
  • Java关键字--------final关键字

    final关键字 final关键字表示最终的 不可修改的 final关键字可以用来修饰类 方法和属性 1 final关键字修饰属性 被final关键字修饰的属性的值和类型都不能再改变 就属于常量 只能做一次赋值 被final修饰的属性通常与
  • jmeter实战案例

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

    关于引用的进一步理解 交换值 因为Java方法在传递参数的时候都是值传递 那么如何通过方法实现2个数的值交换 明确 在传引用的时候 到底拿引用干了个啥 class Value public int a public class Test p
  • Java字符串分析器

    package StruingTokenizer import java util StringTokenizer public class StringTokenizer public static void main String ar
  • JAVA高级类特性(一)

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

    之前就说过我们的数据结构分为两种 分别是线性结构和非线性结构 我们今天要学的第一种线性结构就是树型结构 1 树型结构 树型结构并非我们熟悉的重点 所以在这里只做了解 概念 树是一种非线性的数据结构 它是由n n gt 0 个有限结点组成一个
  • java Socket 简单实现客户端与服务器间通信(仿聊天室)

    java Socket TCP协议简单实现客户端与服务器间的通信 打赏 执行效果 启动服务器和3个客户端 进行群聊和私聊 执行过程 服务端 首先创建服务器套接字ServerSocket对象并绑定端口 启动服务器 然后ServerSocket
  • System.out.println()影响系统运行效率!!!

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

    csdn是全球知名中文IT技术交流平台 创建于1999年 包含原创博客 精品问答 职业培训 技术论坛 资源下载等产品服务 提供原创 优质 完整内容的专业IT技术开发社区 官网 https www csdn net 经常打错顺序 cnds c

随机推荐

  • 华为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 子类继承父类后 父类中声明的属性 方法 子类都可以获取到 明确 当父类中有私有的属性或方法时 子类同样可以获