当前位置: 首页 > news >正文

13.java面向对象:面向对象的三大特征

java面向对象:面向对象的三大特征

  • 面向对象的三大特征
    • 1.封装
      • get和set
      • 规范属性的合法化
    • 2.继承
      • 类继承
      • 子类调用父类方法
      • super的用法
        • 通过super调用父类public的属性
        • super注意点
        • super对比this
      • 方法重写
        • 静态方法中奇怪的现象
        • 非静态方法
    • 3.多态
      • 多态存在的条件
      • 多态中成员访问特点
      • 多态的好处和弊端
      • 多态中的转型
        • 向上转型
        • 向下转型

面向对象的三大特征

1.封装

我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
封装(数据的隐藏)通常应用于禁止直接访问一个对象中数据的实际表示,而应用通过操作接口来访问,这称为信息隐藏。

记住这句话就够了:属性私有,get/set

get和set

public class Student {//private属性私有private String name;private int age;private char sex;//get获取这个数据public String getName() {return name;}public int getAge() {return age;}//set 给这个数据设置值public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}//idea快捷键:alt+insert
}public class StudentDemo {public static void main(String[] args) {Student s1 = new Student();s1.setName("刘德华");   //使用set设置值为刘德华s1.setAge(50);System.out.println(s1.getName()+"今年"+s1.getAge()+"岁了"); //刘德华今年50岁了}
}

规范属性的合法化

如果这里age我们输入999

public class StudentDemo {public static void main(String[] args) {Student s1 = new Student();s1.setName("刘德华");   //使用set设置值为刘德华s1.setAge(999);System.out.println(s1.getName()+"今年"+s1.getAge()+"岁了"); //刘德华今年999岁了}
}

很明显没有人能活到999岁,所以这里我们必须做一些限制。

public class Student {//private属性私有private String name;private int age;private char sex;//get获取这个数据public String getName() {return name;}public int getAge() {return age;}//set 给这个数据设置值public void setName(String name) {this.name = name;}public void setAge(int age) {//输入的年龄超过范围则显示0if (age > 120 || age < 0 ){this.age = 0;} else {this.age = age;}}//快捷键:alt+insert
}

所以从某种意义上说,它可以规范属性的合法化。

2.继承

继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
extands的意思是“扩展”。子类是父类的扩展。
注意:JAVA中类只有单继承,没有多继承!

  • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
  • 继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。
  • 子类继承父类,使用关键字extends来表示。
  • 子类和父类之间,从意义上讲应该具有"is a"的关系

类继承

修饰符extends

//人
public class Person {
}//学生也是人,所以他是Person子类
public class Student extends Person {
}//老师也是人,所以他是Person子类
public class Teacher extends Person {
}

子类调用父类方法

//人
public class Person {public void say(){System.out.println("说话");}
}//学生
public class Student extends Person {
}public class test {public static void main(String[] args) {Student student = new Student();student.say();  //说话}
}//查询继承关系快捷键:Ctrl+H

子类集成父类,就会拥有父类的全部方法,之所以这样是因为我们所用的修饰符是public,同样的修饰符还有下面几个:

修饰符意思常用程度
public公开的重点最常用
protected受保护的
default默认的
private私有的重点最常用

在java中所有的类默认直接或间接的集成了object类。

super的用法

这里的super要和this一起说,我们可以对比。

通过super调用父类public的属性
//父类,人
public class Person {private String name ="kuangshen";
}//人的子类,学生类
public class Student extends Person {private String name = "qingjiang";public void test(String name){System.out.println(name);   //对象传入的nameSystem.out.println(this.name); //当前类的name,结果为”qingjiang”System.out.println(super.name);   //父类中的属性,结果为”kuangshen”}}

当父类的属性或者方法是私有时super也是无法调用的。

super注意点
  • super调用父类的构造方法,必须在构造方法的第一行;

  • super必须只能出现在子类的方法或者构造方法中;

  • super和this不能同时调用构造方法,因为他们都需要放在第一行,所以不能同时!

super对比this
对比代表的对象不同前提构造方法
this本身调用者是对象没有继承也可以使用本类的构造
super代表父类对象的应用只能在继承条件才可以使用父类的构造

方法重写

静态方法中奇怪的现象
//父类
public class B {public static void test(){System.out.println("B=>test()");}
}//子类
public class A extends B {public static void test(){System.out.println("A=>test()");}
}//演示
public class ceshi {public static void main(String[] args) {A a = new A();  a.test();		//A=>test()B b = new A();b.test();       //B=>test(),我new的是A为何会结果是B=>test()???//而且可以看到,方法的调用跟等号右边没什么关系,因为右边都是new A(),但是却跟左边数据的定义有很大的关系;//父类的引用指向了子类,因为这和多态有关,我们先这么简单的理解。}
}

感觉方法的调用跟等号右边没什么关系,因为右边都是new A(),但是却跟左边数据的定义有很大的关系。

非静态方法

现在我们把上面A和B类中的static去掉

//父类
public class B {public void test(){System.out.println("B=>test()");}
}//子类
public class A extends B {@Override   //重写修饰符public void test(){System.out.println("重写方法");}
}//演示
public class ceshi {public static void main(String[] args) {A a = new A();  a.test();		//A=>test()B b = new A();  //子类重写了父类的方法b.test();       //重写方法}
}

注意:方法重写只跟非静态方法有关,和静态方法没有任何关系

3.多态

即同一方法可以根据发送对象的不同而采用多种不同的行为方式,一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多

举例:一只猫

  • 我们可以说猫是猫 cat=new 猫();
  • 我们也可以说猫是动物animal=new 猫();
  • 这里的猫在不同时刻表现出了不同的形态,这就是多态。

多态存在的条件

  • 有继承关系
  • 子类重写父类方法
  • 父类引用指向子类对象

注意:多态是方法的多态,属性没有多态性。

多态中成员访问特点

成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右边

为什么成员变量和成员方法的访问不一样呢?因为成员方法有重写,而成员变量没有


package com.pokes001;public class Person {public void run() {System.out.println("run");}
}package com.pokes001;public class Student extends Person {@Overridepublic void run(){System.out.println("run");}public void eat(){System.out.println("eat");}
}package com.pokes001;public class Application {public static void main(String[] args) {//一个对象的实际类型是确定的//new Student();//new Person();//父类的引用指向子类Student s1 = new Student();  //Student能调用自己的方法和继承父类的方法Person s2 = new Student();  //父类型,可以指向子类,但是不能调用子类独有的方法Object s3 = new Student();  //同上s1.eat(); //子类重写了父类的方法,执行子类方法//s2.eat();这个是直接报错,因为父类无法调用子类独有的方法}

多态的好处和弊端

多态的好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作

多态的弊端:不能使用子类的特有功能

多态中的转型

向上转型

父类为Animal,有一个eat()方法,打印:动物吃东西

子类为Cat,有两个方法,其中一个是重写了父类的eat()方法,打印:猫吃鱼。另一个方法为playGame方法,打印:猫捉迷藏

public class AnimaDemo{public static void main(String[] args){//向上转型,等号左边是动物类Animal,右边是猫对象Animal a = new Cat(); a.eat();  //猫吃鱼,调用了子类重写父类的方法//可以直接调用父类Animal的eat方法和子类重写父类的eat方法,但是不能调用子类独有的方法playGame,否则会报错。 }
}

可以直接调用父类Animal的eat方法和子类重写父类的eat方法,但是不能调用子类独有的方法playGame,否则会报错。

向下转型

根据上面的例子我们是无法调用playGame方法,但是有时候必须要调用,这个时候我们需要将Animal a = new Cat()向下转型

public class AnimaDemo{public static void main(String[] args){Animal a = new Cat(); //向下转型Cat c = (Cat)a;   //可以这样理解:将动物类强制转为猫类,并赋值给cc.eat();	//猫吃鱼	c.playGame() //猫捉迷藏}
}

相关文章:

13.java面向对象:面向对象的三大特征

java面向对象&#xff1a;面向对象的三大特征 面向对象的三大特征1.封装get和set规范属性的合法化 2.继承类继承子类调用父类方法super的用法通过super调用父类public的属性super注意点super对比this 方法重写静态方法中奇怪的现象非静态方法 3.多态多态存在的条件多态中成员访…...

【VUE】Vue中的内置组件

Vue2中的内置组件&#xff1a; <component>&#xff1a;动态组件&#xff0c;可以根据传递的 is 属性值渲染不同的组件。<transition>&#xff1a;过渡动画组件&#xff0c;可以在元素插入、更新或移除时添加动画效果。<transition-group>&#xff1a;过渡动…...

若依框架篇-若依框架搭建具体过程、后端源代码分析、功能详解(权限控制、数据字典、定时任务、代码生成、表单构建、接口测试)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 若依框架概述 1.1 若依构建 1.2 后端项目搭建 1.3 前端项目搭建 2.0 利用若依框架生成前后端代码案例 3.0 功能详解 3.1 功能详解 - 权限控制 3.1.1 使用权限控制…...

恢复已删除文件的 10 种安卓数据恢复工具

由于我们现在在智能手机上存储了大量重要文件&#xff0c;因此了解数据恢复工具变得很重要。您永远不会知道什么时候需要使用 安卓 数据恢复工具。 由于不乏 Windows 数据恢复工具&#xff0c;因此从崩溃的计算机中恢复文件很容易。但是&#xff0c;当涉及到从 安卓恢复数据时…...

Internet Download Manager2025快速下载,新功能解锁!

&#x1f31f;下载界的“速度与激情”&#xff1a;Internet Download Manager超燃体验&#xff01;&#x1f525; 嘿&#xff0c;各位小伙伴们&#xff01;&#x1f44b;今天我要来给你们安利一个让我上网冲浪效率翻倍的神奇软件——Internet Download Manager&#xff08;简称…...

传感器应用注意事项

一、通断型传感器 多数活动部件可直接作为导电材料的传感器为通断型传感器&#xff0c;在受力的条件下&#xff0c;其两个引脚的通断状态会发生改变。 常见通断型传感器 单通道按键多通道按键拨码开关接线帽磁力开关轻触开关… 通断型传感器无需供电&#xff0c;其控制环路…...

PayPal美区账号注册指南

PayPal作为一种便捷的在线支付方式&#xff0c;受到了广大用户的青睐。特别是对于那些需要在美国购物或者进行交易的人来说&#xff0c;注册并正确使用美国地区的PayPal账户显得尤为重要。本次小编会教大家如何注册和使用美区PayPal账户&#xff0c;并讨论是否需要“养号”的问…...

《鸟哥的Linux私房菜基础篇》---1 Linux的介绍与如何开启Linux之路

目录 一、Linux的简单介绍 1、Linux的简介 2、Linux的起源与发展 3、主要特点 4、应用场景 二、开启Linux之路 1、学习Linux的相关知识 2、正规表示法、管线命令、数据流重导向 前言 整体大纲预览 一、Linux的简单介绍 1、Linux的简介 &#xff08;1&#xff09;Linu…...

选择排序,插入排序,快速排序的java简单实现

代码功能 以下Java代码包含了三个排序算法的实现&#xff1a; 选择排序&#xff08;Selection Sort&#xff09;&#xff1a;通过不断选择剩余元素中的最小值来排序数组。 插入排序&#xff08;Insertion Sort&#xff09;&#xff1a;通过构建有序序列&#xff0c;对于未排序…...

数据库中,超出范围和溢出问题的一些处理方法

在数据库中&#xff0c;超出范围和溢出问题通常与数据类型、索引、以及数据存储的容量限制有关。以下是处理这些问题的一些方法&#xff1a; ### 1. 数据类型超出范围 **原因**&#xff1a; - 当尝试将超出数据类型范围的值插入到列中时&#xff0c;会发生错误。 **解决方法…...

Re75 读论文:Toolformer: Language Models Can Teach Themselves to Use Tools

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;Toolformer: Language Models Can Teach Themselves to Use Tools 论文下载地址&#xff1a;https://arxiv.org/abs/2302.04761 这篇文章是介绍tool learning的&#xff0c;大概来说就是…...

Android App系统签名

1.在AndroidManifest中添加 android:sharedUserId"android.uid.system" 2.获取系统签名 把以下所有文件放入同一个文件夹命名为sign 在Android系统源码中的\build\target\product\security目录下找到platform.x509.pem 和 platform.pk8两个文件&#xff1b; 在out/…...

Shiro认证(Authentication)

Shiro简介&#xff1a;特性和架构 Apache Shiro是一个功能强大且易于使用的Java安全&#xff08;权限&#xff09;框架&#xff0c;提供了认证、授权、会话管理、加密、与Web集成、缓存等功能。Shiro不仅可以在JavaSE环境中使用&#xff0c;也可以在JavaEE环境中使用。 特性 …...

Qt和c++面试集合

目录 Qt面试 什么是信号&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;&#xff1f; 什么是Meta-Object系统&#xff1f; 什么是Qt的MVC模式&#xff1f; 1. QT中connect函数的第五个参数是什么&#xff1f;有什么作用&#xff1f; 3. 在QT中&#xff…...

Spark 3.3.x版本中的动态分区裁剪(DPP,Dynamic Partition Pruning)的实现及应用剖析

文章目录 Dynamic Partition Pruning&#xff08;DPP&#xff09;的作用DPP生效的一些要点DPP生效的简单SQL示例DPP生效SQL的解析示例Deduplicate Correlated SubqueryRewrite Predicates as JoinRewrite Join With Dynamic SubqueryRewrite Dynamic Subquery as Dynamic Expre…...

Android 各国语言value文件夹命名规则

中文 values-zh英语values-en 阿拉伯语 values-ar 保加利亚语 values-bg加泰罗尼亚语values-ca 捷克语 values-cs 丹麦语 values-da 德语 values-de 希腊语 values-el 西班牙语 values-es 芬兰语 values-fi 法语 values-fr 希伯来语 values-iw 印地语 values-hi 克罗里亚语 …...

深入理解Redis锁与Backoff重试机制在Go中的实现

文章目录 流程图Redis锁的深入实现Backoff重试策略的深入探讨结合Redis锁与Backoff策略的高级应用具体实现结论 在构建分布式系统时&#xff0c;确保数据的一致性和操作的原子性是至关重要的。Redis锁作为一种高效且广泛使用的分布式锁机制&#xff0c;能够帮助我们在多进程或分…...

uniapp-小程序开发0-1笔记大全

uniapp官网&#xff1a; https://uniapp.dcloud.net.cn/tutorial/syntax-js.html uniapp插件市场&#xff1a; https://ext.dcloud.net.cn/ uviewui类库&#xff1a; https://www.uviewui.com/ 柱状、扇形、仪表盘库&#xff1a; https://www.ucharts.cn/v2/#/ CSS样式&…...

Go语言数据库操作深入讲解

go操作MySQL 使用第三方开源的mysql库: github.com/go-sql-driver/mysql (mysql驱动)github.com/jmoiron/sqlx (基于mysql驱动的封装) 命令行输入 &#xff1a; go get github.com/go-sql-driver/mysqlgo get github.com/jmoiron/sqlx Insert操作 登录后复制 // 连接Mysql data…...

搜维尔科技:SenseGlove Nova 2触觉反馈手套开箱测评

SenseGlove Nova 2触觉反馈手套开箱测评 搜维尔科技&#xff1a;SenseGlove Nova 2触觉反馈手套开箱测评...

步步精科技诚邀您参加2024慕尼黑华南电子展

尊敬的客户&#xff1a; 我们诚挚地邀请您参加即将于2024年10月14日至10月16日在深圳国际会展中心 &#xff08;宝安新馆&#xff09;举办的慕尼黑华南电子展(electronica South China)。本届将聚焦人工智能、数据中心、新型储能、无线通信、硬件安全、新能源汽车、第三代半导…...

OPC UA与PostgreSQL如何实现无缝连接?

随着工业4.0的推进&#xff0c;数据交换和集成在智能制造中扮演着越来越重要的角色。OPC UA能够实现设备与设备、设备与系统之间的高效数据交换。而PostgreSQL则是一种强大的开源关系型数据库管理系统&#xff0c;广泛应用于数据存储和管理。如何将OPC UA与PostgreSQL结合起来&…...

C语言[斐波那契数列2]

本篇文章讲述前一篇文章的细节&#xff0c;方便大家进行代码的运算。 本次代码题为: 输出斐波那契数列的前20位数&#xff0c;每行4位数。 详细解释: 在 main 函数中&#xff0c;首先定义了循环变量 i 和用于存储斐波那契数列项的三个长整型变量 f1 、 f2 和 temp 。其…...

八、Linux之实用指令

1、指定运行级别 1.1 基本介绍 运行级别说明 0 &#xff1a;关机 1 &#xff1a;单用户【找回丢失密码】 2&#xff1a;多用户状态没有网络服务&#xff08;用的非常少&#xff09; 3&#xff1a;多用户状态有网络服务&#xff08;用的最多&#xff09; 4&#xff1a;系统未使…...

2024_E_100_连续字母长度

连续字母长度 题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。 输入描述 第一行有一个子串(1<长度<100)&#xff0c;只包含大写字母。 第二行为…...

清空redo导致oracle故障恢复---惜分飞

客户由于空间不足,使用> redo命令清空了oracle的redo文件 数据库挂掉之后,启动报错 Fri Oct 04 10:32:57 2024 alter database open Beginning crash recovery of 1 threads parallel recovery started with 31 processes Started redo scan Errors in file /home/oracle…...

VAE(与GAN)

VAE 1. VAE 模型概述 变分自编码器&#xff08;Variational Autoencoder, VAE&#xff09;是一种生成模型&#xff0c;主要用于学习数据的潜在表示并生成新样本。它由两个主要部分组成&#xff1a;编码器和解码器。 编码器&#xff1a;将输入数据映射到潜在空间&#xff0c;…...

【高等数学】多元微分学(二)

隐函数的偏导数 二元方程的隐函数 F ( x , y ) 0 F(x,y)0 F(x,y)0 推出隐函数形式 y y ( x ) yy(x) yy(x). 欲求 d y d x \frac{d y}{d x} dxdy​ 需要对 F 0 F0 F0 两边同时对 x x x 求全导 0 d d x F ( x , y ( x ) ) ∂ F ∂ x d x d x ∂ F ∂ y d y d x ∂ F…...

.NET 中的 Web服务(Web Services)和WCF(Windows Communication Foundation)

一、引言 在当今数字化时代&#xff0c;不同的软件系统和应用程序之间需要进行高效、可靠的通信与数据交换。.NET 框架中的 Web 服务和 WCF&#xff08;Windows Communication Foundation&#xff09;为此提供了强大的技术支持。它们在构建分布式应用程序、实现跨平台通信以及…...

Linux小知识2 系统的启动

我们在上文中介绍了文件系统&#xff0c;提到了Linux的文件系统存在一个块的概念&#xff0c;其中有一个特殊的块&#xff1a;引导块。这和我们这里要讲的系统启动有关。 BIOS 基本输入输出系统&#xff0c;基本上是一个操作系统最早实现也是最早运行的第一个程序。是一个比较…...