JAVA基础:封装、继承和多态(详讲)

news2024/11/24 15:58:23

1 封装

  • 面向对象的三大特征 : 封装, 继承, 多态 。

封装可以从三个层面理解

  1. 将属性和方法组合在一起(封闭在一起)

  2. 将属性隐藏起来, 对外提供可以间接操作属性的方法。(提高程序设计安全性)

    目前我们都是属性私有化, 并提供与之对应的get和set方法

  3. 封装应用工具,为其他的程序员提供功能帮助。

属性的get和set方法

  • 这是一种封装设计

  • 但不是语法要求,是一种约定俗称。

  • 一般的要求是,属性私有, 其对应的get和set方法就是在get和set后面连接属性名

class Goods{
    private String gname ;
    private String kind ;
    private int price ;
    private int count ;
    
    //可以间接的为kind赋值
	public void setKind(String kind){
		this.kind = kind ;
	}

	//可以间接获得kind属性值
	public String getKind(){
		return kind ;
	}
    
    public void setGname(String gname){
        this.gname = gname ;
    }
    
    public String getGname(){
        return gname ;
    }
    
}

class Test{
    main(){
        Goods g = new Goods();
        //g.gname ; 无法直接访问
        //g.kind ; 无法直接访问
        g.setGname("可乐");// g.gname = "" ;
        print( g.getGname() ) ; // print( g.gname ) ;   getGname(g)
    }
}

特殊的get和set方法

  • get和set方法的写法不一定完全一致。

class A{
    private int age ;
    public void setAge(String age){
       	this.age = Integer.parseInt(age) ;
    }
}

  • boolean类型的属性,其get方法有些特别,是以is开头

class A{
    private boolean flag ;
	public void setFlag(boolean flag){
		this.flag = flag ;
	}
	public boolean isFlag(){
		return flag ;
	}
}

2 继承

需要两个类才能实现继承的效果。 比如:类A 继承 类B

  • A类 称为 子类 , 衍生类,派生类

  • B类 称为 父类,基类,超类

继承的作用

  1. 子类自动的拥有父类的所有属性和方法 (父类编写,子类不需要再编写) 。 代码复用

    目前私有的属性和方法无法访问。

  2. 多态的基础。

继承语法

  • 先定义父类 (单独的类)

  • 在定义子类的同时,实现与父类的继承关系

class B{
    String name ;
    public void t1() {}
}

class A extends B{
    //String name ;
    //public void t1() {}
}

A a = new A();
a.name = "zs" ;
a.t1();

继承特点

  1. 继承具有传递性

    A extends B extends C

    A类中,既有B类的内容,又有C类的内容

  2. 基础具有不可逆性

    A extends B

    A类中,有B类的内容

    但B类中没有A类的内容。

  3. Java只支持单继承 (C++支持多继承)

    一个类只能继承一个父类。

    但可以连续继承 A extends B extends C

    A extends B A extends C 不可以的

3 子类对象的创建过程

  • 不存在父类对象这个概念

class A{
    String name ;
    public void t1(){}
}
class B extends A{
    int age ;
    public void t2(){}
}

new A(); //不算父类对象
new B() ;//这就是我们所说的子类对象

 

  • 尽管B对象中的name属性,是从A类中继承而来的

  • 但使用过程中,直接通过name名称就可以访问到。

  • 可以使用JOL工具来查看内存结果

4 super关键字

可以指定父类的内容 (属性,方法,构造方法)

一般情况下,在子类中,可以默认指定父类的内容。

  • 变量访问的顺序: 局部变量->类变量->父类变量->报错

class B{
    String name1 ;
}
class A extends B{
    String name1 ;
    public void t1(){
        String name1 ;
        print(name) ;
    }
}

但有些情况必须使用super来指定父类的内容

  1. 子类中写了与父类中同名的属性和方法 (重写)

  2. 在子类的构造方法中,指定要调用的父类的构造方法

    在创建子类对象时,不仅仅子类对象的构造方法会被调用,父类的构造方法也会被调用

    是在子类构造方法的第一行被调用的。 (先调用子类的构造器,先执行完父类的构造器)

    默认会在子类构造方法的第一行,执行super(),表示调用父类的无参构造器

class A{
    int a ;
    int b ;
    public A(int a , int b){
        this.a = a ;
        this.b = b ;
    }
    public void A(){}
}

class B extends A{
    int c ;
    int d ;
    public B(){}
    public B(int c , int d){}
    public B(int a , int b , int c, int d){
        //想将a和b交给父类的构造器
        //super()
        super(a,b);
        this.c = c ;
        this.d = d ;
    }
}

B b =  new B(10,20,30,40);

this和super关键字

  • 在使用上,this和super特点相似

  • 但本质上完全不同

  • this的本质,是一个参数变量,存储的是当前方法所属对应的地址。

  • super的本质,就是一个关键字,用来指定父类的内容。这个指定效果在编译后就没有了。

    而this是在运行时有所应用的。

5 多态

事物的多种表现形态。

人有多种表现形态:学生,老师,警察,医生等。

作用:在封装时,可以更灵活的切换具体的执行功能

多态的实现过程:

  1. 继承

  2. 重写

  3. 上转型

5.1 重写

发生在子父类关系中。

在子类中,重新编写与父类相同的属性和方法。 称为方法重写,属性重写

属性重写

  • 只需要在子类中定义父类同名的属性即可, 类型可以不同

  • 使用上: 类的内部的使用super指定使用的是子类的属性还是父类的属性

    类的外部使用时,默认使用的是子类重写的属性

    只有在上转型时,可以使用父类的属性。

    属性的重写又称为属性的隐藏。

方法重写

  • 子类中的方法与父类中的方法名称相同,参数列表相同,执行不同的操作

  • 一般情况下 访问权限,返回类型,异常声明 都建议相同。

  • 实际上

    • 子类重写方法的访问权限要大于等于父类方法的访问权限。

    • 子类重写方法的返回类型要小于等于父类方法的返回类型 (基于子父关系)

class A{}
class A1 extends A{}
class A2 extends A1{}

class B1{
    public A1 t1(){}
}
class B2 extends B1{
    public A2 t1(){}
}

  子类重写方法的异常声明类型或个数 小于等于父类方法

class E41 extends E4{}
class B1{
    public A1 t1()throws E1,E2,E3,E41{}
}
class B2 extends B1{
    public A2 t1()throws E4{}
}

  • 关于修饰符

    • static关键字修饰的方法不存在重写(概念)

    • final关键字修饰的方法不能被重写

    • abstract关键字修饰的方法必须被重写

  • 使用上:类的内部可以使用super指定父类的方法

    类的外部,只能使用子类重写的方法,无法使用从父类继承的方法,即使上转型也不行

    方法的重写又称为方法的覆盖

5.2 上转型

将子类对象的地址存储在父类型的变量中 , 将子类对象当成父类型对象来用(本质还是子类对象)

class A{}
class B extends A{}

B b = new B();
A a = b ;
----------
A a = new B();

 

  • 使用时,因为用的是A类型的变量, 所以以为用的是A类型的对象,所以只能用A类型中才有的属性和方法

  • 但实际上, a变量中存储的是B类型的对象, 所以调用的方法都是B类型的方法

  • 由于B类型的对象中,既包含B的属性,也包含父类A中的属性, 而使用时又以为使用的是A类型的对象,所以属性调用的就是从A中继承的属性,也就是父类的属性

5.3 下转型

在下转型之前,一定先存在上转型

所谓的下转型,是将之前因为上转型,存储在父类型变量中的子类型对象的地址重新存储在子类型的变量中。类似与强转一样,需要使用()来指定下转的类型。

class A{}
class B extends A{}

A a= new B();
B b = (B)a ;

几种情况:

  1. 两个类型不存在子父关系,无法下转型(不能强转),此时会出现语法编译错误

User u = new User();
Phone p = (Phone)u ;  //语法错误

 2.两个类型存在子父关系,但本质类型不相同。 此时语法编译通过,运行出错

class A{}
class A1 extends A{}
class A2 extends A{}

A a = new A1();
A2 a2 = (A)a ;  //运行错误 , 类型转化错误

 3.两个类型存在子父关系,本质类型也是相同的。此时可以正常编译运行

class A{}
class A1 extends A{}
class A2 extends A{}

A a = new A1();
A1 a1 = (A)a ;

6 final关键字

final关键字可以修饰变量, 方法 和 类

final修饰变量

  • 可以是局部变量,也可以是属性变量,也可以是静态变量

  • 表示常量,只能被赋值一次,之后不能被改变。

class A{
    final static int a = 10;
    final int b = 20;
    public void t1(final int d){
        final int c = 30;
    }
}

常量变量和常量值

  • 使用final修饰的变量,就成为常量变量

  • 在为变量赋值时,=右边那个具体的数值,就称为常量值 10 , 20 , "abc" , 'a' , true

final修饰方法

称为最终方法, 不能被重写

class A{
    public void t1(){}
    public final void t2(){}
}

class B extends A{
    public void t1(){}
    public void t2(){} //错误
}

final修饰类

称为最终类,不能被继承

7 Object类

是所有类的终极父类。

无论是jdk自带的类或数组,还是我们自定义的类,最终都会继承Object这个父类

而且不需要写出来。

Object类中的方法所有的类都具备

  • getClass() 后面反射时会讲

  • clone() 后面讲接口和异常时会讲

  • hashCode() 后面讲集合的时候会讲

  • finalize() 后面讲异常时会讲

  • wait() , wait(long) , wait(...) , notify() , notifyAll() 后面讲线程会讲

  • toString() 返回一个字符串,用来描述当前对象

  • equals() 用来比较当前对象与另一个对象是否相等

String toString()方法

  • 返回一个字符串,代表当前对象的一个文字描述

  • 默认toString方法返回的内容包括对象的类型及对象的地址

  • 在打印对象时,会默认打印对象的toString方法的返回值。

boolean equals(Object obj) 方法

  • equals用来比较两个对象是否相等。通过源码可知, 使用的是 == 比较。

    • == 可以比较基本类型 , 也可以比较引用类型。 比较基本类型比的是值,比较引用类型比较的是地址

    • equals只能比较引用类型,默认比较的是地址,但可以通过重写,改成比较内容. 像String就重写了equals方法,改为比较内容了

  • 比较哪两个对象是否相等呢?

    • 一个是this这个对象

    • 还有一个是以参数传递过来的对象 obj

    • obj的本质也是当前类型的对象。 目的就是比较两个相同类型的对象是否相等

    • 可以通过强转,将obj还原成最开始的类型, 并完成this与obj的属性内容比较

class G{
	String name = "zs" ;
	int age = 18 ;

	public String toString(){
		return "my name is "+ name + ", my age is " + age ;
	}

	public boolean equals(Object obj){
		if( this == obj){
			return true ;
		}

		G g = (G)obj ;

		if(this.name.equals(g.name) && this.age == g.age){
			return true ;
		}else{
			return false ;
		}
	}

}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2101067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CephFS使用

CephFS使用 一、CephFS架构二、部署CepfFS服务1、部署MDS服务2、创建CephFS metadata和data存储池3、创建cephFS并验证4、创建客户端账户5、安装ceph客户端并同步认证文件6、内核空间挂载ceph-fs6.1 客户端通过key文件挂载6.2 开机自动挂载 7、客户端模块挂载7.1 用户空间挂载c…

​​​​​​​《黑神话:悟空》—— 高科技点亮西游神话璀璨之路

《黑神话:悟空》作为一款以中国神话为背景的西游题材单机游戏,自诞生起便备受瞩目。它以中国古典名著《西游记》为蓝本,文化内涵深厚,承载着无数国人的童年回忆和文化情感。凭借高科技打造出美轮美奂的画面——细腻逼真的环境场景…

代理服务器详解(proxy server)

什么是代理服务器 (proxy server) 代理服务器(Proxy Server)是一个中间服务器,位于客户端和目标服务器之间。它代表客户端向目标服务器发送请求,并将目标服务器的响应返回给客户端,其模型如下图所示: 客户…

2024年“羊城杯”粤港澳大湾区网络安全大赛Misc 部分解析

2024年“羊城杯”粤港澳大湾区网络安全大赛Misc 部分解析 前言:数据安全:不一样的数据库_2:Misc - hiden:Misc - miaoro: 前言: 本次 解析是后期复现 当时没时间打 用于交流学习,感谢支持&…

代码随想录算法训练营第三十二天(动态规划 一)

前几天有点忙加上贪心后面好难QWQ 暂时跳过两天的贪心,开始学动归 动态规划理论基础: 文章链接:代码随想录 文章思维导图: 文章摘要: 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题&…

运动耳机哪个牌子的好?五大口碑爆棚的骨传导运动耳机全方位分析

随着健康意识的提高和运动文化的普及,越来越多的人开始注重运动时的舒适度和体验感。在众多运动装备中,耳机作为不可或缺的一部分,其选择对运动体验有着直接的影响。传统的入耳式耳机在运动时可能会因为汗水、滑落等问题影响使用体验&#xf…

‘聊天不要太正经,越调戏对方越爱你的搞笑句子’

01 02 03 04 05 06 07 免费小程序《字形绘梦》上线啦! 欢迎大家体验!

自动驾驶技术软件教学平台

1、基本介绍 自动驾驶技术软件教学平台是中智讯公司开发的一款面向人工智能相关专业自动驾驶方向的综合型实验平台,主要满足:机器人控制技术、机器人操作系统、机器视觉技术、机器语言技术、智能边缘计算、人工智能中间件、机器人协作、SLAM导航等课程的…

餐饮行业的数字化转型——霸王餐API接口对接

霸王餐API接口对接对餐饮行业的数字化转型具有显著的推动作用,其关键优势和特点包括: 提升运营效率:通过自动化管理,减少人工操作,提高工作效率和减少错误。优化消费者体验:提供实时的菜品信息、下单和支付…

《软件工程导论》(第6版)第9章 面向对象方法学引论 复习笔记

第9章 面向对象方法学引论 一、面向对象方法学概述 1.要点 面向对象方法学已经成为人们在开发软件时首选的范型。面向对象技术已成为当前最好的软件开发技术。 (1)基本原则 面向对象方法学的出发点和基本原则,是尽可能模拟人…

NPDP|如何在传统行业中做好产品管理的策略与建议

在当今这个快速变化的数字时代,传统行业面临着前所未有的挑战与机遇。产品管理作为连接市场需求与企业生产的核心环节,其重要性不言而喻。对于传统行业而言,做好产品管理不仅意味着保持竞争力,更是实现转型升级、拥抱未来的关键。…

MATLAB进行天线阵列方向图综合

摘要:本次推文将介绍如何利用MATLAB的Sensor Array Analyzer进行天线阵列的方向图综合。 1. 阵列方向图综合理论 对于均匀平面阵列而言,其阵因子公式可以写成 当阵列是三角网格布置或者圆环阵时,《ANTENNA THEORY ANALYSIS AND DESIGN》等相…

前端跨域问题详解与解决方案指南

什么是跨域问题 跨域问题通常是由浏览器的同源策略(Same-OriginPolicy,SOP)引起的访问问题 同源策略是浏览器的一个重要安全机制,它用于限制一个来源的文档或脚本如何能够与另一个来源的资源进行交互 同源策略的定义 同源策略要…

【MySQL_JDBC】Day23-Day28 数据库基础、JDBC基础、聊天室3.0

数据库 数据库基本概念 数据库DataBase 定义: 保存数据的仓库就称为数据库 例如 编写一个用户管理系统,可以让用户在我们编写的系统上进行注册等操作,此时就涉及到了保存用户数据的操作,目前我们的做法可以将一个用户信息以一个User对象…

【精选】大型体育场管理系统的设计与实现(全网最新定制,独一无二)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

Unity(2022.3.41LTS) - UI详细介绍-Dropdown(下拉列表)

目录 零.简介 一、基本功能与用途 二、组件介绍 三、使用方法 四、优化和注意事项 五.代码实例 零.简介 在 Unity 中,下拉列表(Dropdown)是一种常用的 UI 组件,用于提供一组选项供用户选择。 一、基本功能与用途 选项选择…

【出行计划 / 2】

题目 思路 暴力 O ( m ⋅ n ) O(m \cdot n) O(m⋅n) \;\;\;\;\; 不可行 树状数组差分 O ( m ⋅ l o g ( 5 e 5 ) ) O(m \cdot log(5e^{5})) O(m⋅log(5e5)) \;\;\;\;\; 可行 具体思路: t [ i ] ∈ [ q k − c [ i ] 1 , q k ] t[i] \in [qk-c[i]1, \;qk…

stm32的内部时钟源 | RC震荡电路

文章目录 前言学习了解 前言 了解到 内部高速RC振荡器(HSI)就是RC震荡器实现的,故想对RC震荡做些了解与分析。 学习了解 【不需要晶振,也可产生时钟脉冲!RC振荡器的工作原理,维恩电桥振荡器!…

电脑连接公司服务器记住了账户密码,怎么换账户呢?

今天,有同事找到我,说共享连不上去了,我去试了下,知道了原因:由于我将之前使用这台电脑的人的账户在后台禁用了,所以这台电脑连不上服务器了,也不是连不上,而是之前是记住了账户密码…

基于vue框架的超市商品管理系统m9o29(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:商品信息,商品分类,进货入库,员工,销售出库 开题报告内容 基于Vue框架的超市商品管理系统开题报告 一、研究背景与意义 在快速变化的零售市场中,超市作为商品销售的重要渠道,其商品管理效率直接影响到顾客满意…