Java笔记七(封装,继承与多态)

封装

该露的露,该藏的藏

程序设计追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用

封装(数据的隐藏)

通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问

属性私有

package com.oop.demo04;
//类 private:私有
public class Student {//属性私有private String name; //名字private int id;   //学号private char sex;    //性别
package com.oop.demo04;public class Application {public static void main(String[] args) {Student s1=new Student();s1.name//错误代码}
}

此时如果直接调用s1.name则会报错,因为属性私有

正确方法:

package com.oop.demo04;
//类 private:私有
public class Student {//属性私有private String name; //名字private int id;   //学号private char sex;    //性别//提供一些可以操作这个属性的方法//提供一些public的get.set方法//get获得这个数据public  String getName(){return this.name;}//set给这个数据设置值public void setName(String name){this.name=name;}}
package com.oop.demo04;public class Application {public static void main(String[] args) {Student s1=new Student();s1.setName("佳伟");System.out.println(s1.getName());}
}

快捷键alt+ins快速生成get和set方法

对用户的输入进行限制,以年龄为例:

package com.oop.demo04;
//类 private:私有
public class Student {//属性私有private String name; //名字private int id;   //学号private char sex;//性别private int age;//提供一些可以操作这个属性的方法//提供一些public的get.set方法//get获得这个数据public  String getName(){return this.name;}public int getAge() {return age;}public void setAge(int age) {//对输入不合法的年龄进行限制if (age>120||age<0){this.age=3;}else {this.age=age;}}//set给这个数据设置值public void setName(String name){this.name=name;}}
package com.oop.demo04;public class Application {public static void main(String[] args) {Student s1=new Student();s1.setName("佳伟");System.out.println(s1.getName());s1.setAge(999);System.out.println(s1.getAge());}
}

此时年龄便会输出不合法

封装的意义:

1.提高程序的安全性,保护数据

2.隐藏代码的实现细节

3.统一接口

4.系统可维护性

继承

继承的本质是对某一批类的抽象

extends的意思是“扩展”。子类是父类的扩展

JAVA中类只有单继承,没有多继承

继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。

假设Person是父类,Student与Teacher是子类

则可这样写

package com.oop.demo05;public class Person {
}
package com.oop.demo05;public class Student extends Person {
}
package com.oop.demo05;public class Teacher extends Person {
}

子类继承父类,就会拥有父类的全部方法

package com.oop.demo05;public class Person {public void say(){System.out.println("说了一句话");}
}
package com.oop.demo05;public class Application {public static void main(String[] args) {Student student=new Student();student.say();}
}

但是拥有父类的所有方法不代表可以使用父类的所有方法,例如使用封装的关键词private

package com.oop.demo05;public class Person {private int money=10_0000_0000;public void say() {System.out.println("说了一句话");}public int getMoney(){return money;}public void setMoney(int money){this.money=money;}}

则子类需使用父类设置的方法使用

package com.oop.demo05;public class Application {public static void main(String[] args) {Student student=new Student();student.say();System.out.println(student.getMoney());}
}

IDEA快捷键:

ctrl+H:查看程序树

super

调用父类,如下

package com.oop.demo05;public class Student extends Person {private String name="jiawei";public void print(){System.out.println("Student");}public void test(String name){System.out.println(name);System.out.println(this.name);System.out.println(super.name);//调用父类}
}
package com.oop.demo05;public class Person {protected String name="weiwei";public void print(){System.out.println("Person");}
}
package com.oop.demo05;
import com.oop.demo05.Person;
import com.oop.demo05.Student;public class Application {public static void main(String[] args) {Student student=new Student();student.test("佳伟");}
}

运行结果如下

调用父类方法:

package com.oop.demo05;public class Person {protected String name="weiwei";public void print(){System.out.println("Person");}
}
package com.oop.demo05;public class Student extends Person {private String name="jiawei";public void print(){System.out.println("Student");}public void test1(){print();//当前类this.print();//当前类super.print();//调用父类}public void test(String name){System.out.println(name);System.out.println(this.name);System.out.println(super.name);//调用父类}}
package com.oop.demo05;
import com.oop.demo05.Person;
import com.oop.demo05.Student;public class Application {public static void main(String[] args) {Student student=new Student();//student.test("佳伟");student.test1();}
}

运行结果如下

私有的东西同样无法被继承

注意调用父类的构造器必须放在子类构造器的第一行

super注意点

1.super调用父类的构造方法,必须在构造方法的第一个

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

3.super和this不能同时调用构造方法

与this对比

代表的对象不同

this:本身调用者这个对象

super:代表父类对象的应用

前提

this:没有继承也可以使用

super:只能在继承条件才可以使用

this():本类的构造

super():父类的构造

方法的重写

静态方法:

package com.oop.demo05;public class A extends B{public static void test() {System.out.println("A=>test()");}
}
package com.oop.demo05;public class A extends B{public static void test() {System.out.println("A=>test()");}
}
package com.oop.demo05;import com.oop.demo05.A;
import com.oop.demo05.B;public class Application {public static void main(String[] args) {//方法的调用只和左边,定义的数据类型有关A a=new A();a.test();//父类的引用指向了子类B b=new A();b.test();}
}

运行结果如下:

可以发现方法的调用只和左边,定义的数据类型有关

非静态方法的重写:

A与B同时去掉static

package com.oop.demo05;public class B {public void test() {System.out.println("B=>test()");}
}
package com.oop.demo05;public class A extends B{public void test() {System.out.println("A=>test()");}
}
package com.oop.demo05;import com.oop.demo05.A;
import com.oop.demo05.B;public class Application {public static void main(String[] args) {//方法的调用只和左边,定义的数据类型有关A a=new A();a.test();//父类的引用指向了子类B b=new A();//子类重写了父类的方法b.test();}
}

运行结果如下

alt+ins快捷键:快速重写方法

静态的方法与非静态的方法区别很大

此时子类才重写了父类的方法,才算重写

重写的关键词只能是public

重写:需要有继承关系,子类重写父类的方法!

1.方法名必须相同

2.参数列表必须相同

3.修饰符:范围可以扩大:public>Protected>Default>private

4.抛出的异常:范围,可以被缩小,但不能扩大:ClassNotFoundException——>Exception(大)

重写,子类的方法和父类必要一致;方法体不同!

为什么需要重写:

父类的功能,子类不一定需要或者不一定满足

多态

package com.oop.demo06;public class Application {public static void main(String[] args) {//一个对象的实际类型是确定的//new Student();//new Person();//可以指向的引用类型就不确定了//Student能调用的方法都是自己的或者继承父类的Student s1=new Student();//Person父类型,可以指向子类,但是不难调用子类独有的方法Person s2=new Student();//父类的引用指向子类//对象能执行哪些方法,主要看对象左边的类型,和右边关系不大s2.run();//子类重写了父类的方法,执行子类的方法s1.eat();}
}

.

package com.oop.demo06;public class Student extends Person {@Overridepublic void run() {System.out.println("son");}public void eat(){System.out.println("eat");}
}
package com.oop.demo06;public class Person {public void run(){System.out.println("run");}
}

运行结果:

子类能调用的方法都是自己的或者继承父类的

父类型可以指向子类,但是不能调用子类独有的方法

可以强制类型转换把s2从父类转换成子类

((Student)s2).eat();

多态注意事项:

1.多态是方法的多态,属性没有多态

2.父类和子类有联系 否则有类型转换异常 ClassCastException

2.存在条件:继承关系,方法需要重写,父类引用指向子类对象

不能重写的关键词:

1.static 方法,属于类,它不属于实例

2.final 常量

2.private方法

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

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

相关文章

Linux shell编程学习笔记8:使用字符串

一、前言 字符串是大多数编程语言中最常用最有用的数据类型&#xff0c;这在Linux shell编程中也不例外。 本文讨论了Linux Shell编程中的字符串的三种定义方式的差别&#xff0c;以及字符串拼接、取字符串长度、提取字符串、查找子字符串等常用字符串操作,&#xff0c;以及反…

【2023年11月第四版教材】第18章《项目绩效域》(合集篇)

第18章《项目绩效域》&#xff08;合集篇&#xff09; 1 章节内容2 干系人绩效域2.1 绩效要点2.2 执行效果检查2.3 与其他绩效域的相互作用 3 团队绩效域3.1 绩效要点3.2 与其他绩效域的相互作用3.3 执行效果检查3.4 开发方法和生命周期绩效域 4 绩效要点4.1 与其他绩效域的相互…

20231005使用ffmpeg旋转MP4视频

20231005使用ffmpeg旋转MP4视频 2023/10/5 12:21 百度搜搜&#xff1a;ffmpeg 旋转90度 https://zhuanlan.zhihu.com/p/637790915 【FFmpeg实战】FFMPEG常用命令行 https://blog.csdn.net/weixin_37515325/article/details/127817057 FFMPEG常用命令行 5.视频旋转 顺时针旋转…

System Generator学习——时间和资源分析

文章目录 前言一、目标二、步骤三、步骤 1 &#xff1a;系统生成器的时序分析1、时序分析2、解决时间违规问题 四、步骤 2 &#xff1a;系统生成器中的资源分析总结 前言 在本节实验中&#xff0c;你将学习如何通过在 Simulink 中进行仿真来验证设计的功能&#xff0c;以确保在…

力扣第226翻转二叉数 c++三种方法 +注释

题目 226. 翻转二叉树 简单 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&am…

常见的几种排序方式

常见的几种排序方式 1. 排序的概念2. 常见排序算法的实现2.1 插入排序2.1.1基本思想2.1.2 直接插入排序2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序2.2.1基本思想2.2.2 直接选择排序:2.2.3 堆排序 2.3 交换排序2.3.1冒泡排序2.3.2 快速排序 2.4 归并排序2.4.1 基本思想2.4.2 …

知识图谱小白入门(1):neo4j的安装与CQL的使用

文章目录 序一、安装neo4j1.1 下载neo4j1.2 安装JDK1.3 BUG&#xff1a;dbms failed to start 二、CQL语法2.1 CQL语法创建节点查询节点创建关系查询关系2.2 习题 习题答案 序 知识图谱&#xff0c;是一种实体间的信息与关系知识的网状结构&#xff0c;借用图论中点与边的概念…

阿里云服务器镜像系统Anolis OS龙蜥详细介绍

阿里云服务器Anolis OS镜像系统由龙蜥OpenAnolis社区推出&#xff0c;Anolis OS是CentOS 8 100%兼容替代版本&#xff0c;Anolis OS是完全开源、中立、开放的Linux发行版&#xff0c;具备企业级的稳定性、高性能、安全性和可靠性。目前阿里云服务器ECS可选的Anolis OS镜像系统版…

【Java】猫和狗接口版本思路分析

目录 猫&#x1f431;和狗&#x1f415;&#xff08;接口版本&#xff09; 画图分析 案例代码 猫&#x1f431;和狗&#x1f415;&#xff08;接口版本&#xff09; 需求&#xff1a;对猫和狗进行训练&#xff0c;它们就可以跳高了&#xff0c;这里加入了跳高功能&#xff0…

Python常用功能的标准代码

后台运行并保存log 1 2 3 4 5 6 7 8 9 nohup python -u test.py > test.log 2>&1 & #最后的&表示后台运行 #2 输出错误信息到提示符窗口 #1 表示输出信息到提示符窗口, 1前面的&注意添加, 否则还会创建一个名为1的文件 #最后会把日志文件输出到test.log文…

阿里云服务器IP地址查询方法(公网IP和私网IP)

阿里云服务器IP地址在哪查看&#xff1f;在云服务器ECS管理控制台即可查看&#xff0c;阿里云服务器IP地址包括公网IP和私有IP地址&#xff0c;阿里云百科分享阿里云服务器IP地址查询方法&#xff1a; 目录 阿里云服务器IP地址查询 阿里云服务器IP地址查询 1、登录到阿里云服…

软件设计模式系列之二十五——访问者模式

访问者模式&#xff08;Visitor Pattern&#xff09;是一种强大的行为型设计模式&#xff0c;它允许你在不改变被访问对象的类的前提下&#xff0c;定义新的操作和行为。本文将详细介绍访问者模式&#xff0c;包括其定义、举例说明、结构、实现步骤、Java代码实现、典型应用场景…

卷积神经网络-卷积层

卷积神经网络 卷积神经网络&#xff08;convolutional neural network&#xff0c;CNN&#xff09;是一类包含卷积计算且具有深度结构的前馈神经网络&#xff0c;是深度学习的代表算法之一。卷积神经网络具有表征学习能力&#xff0c;能够按其阶层结构对输入信息进行平移不变分…

算法:强连通分量(SCC) Tarjan算法

强连通分量&#xff0c;不能再加任何一个点了&#xff0c;再加一个点就不是强连通了 vector<int>e[N]; int dfn[N],low[N],tot; bool instk[N]; int scc[N],siz[N],cnt; void tarjan(int x){//入x时,盖戳,入栈dfn[x]low[x]tot;q.push(x);instk[x]true;for(auto y:e[x]){i…

卷积神经网络-池化层和激活层

2.池化层 根据特征图上的局部统计信息进行下采样&#xff0c;在保留有用信息的同时减少特征图的大小。和卷积层不同的是&#xff0c;池化层不包含需要学习的参数。最大池化(max-pooling)在一个局部区域选最大值作为输出&#xff0c;而平均池化(average pooling)计算一个局部区…

新款UI动态壁纸头像潮图小程序源码

新款UI动态壁纸头像潮图小程序源码&#xff0c;不需要域名服务器&#xff0c;直接添加合法域名&#xff0c;上传发布就能使用。 可以对接开通流量主&#xff0c;个人也能运营&#xff0c;不需要服务器源码完整。整合头像&#xff0c;动态壁纸&#xff0c;文案功能齐全。 源码…

pyqt5使用经验总结

pyqt5环境配置注意&#xff1a; 安装pyqt5 pip install PyQt5 pyqt5-tools 环境变量-创建变量名&#xff1a; 健名&#xff1a;QT_QPA_PLATFORM_PLUGIN_PATH 值为&#xff1a;Lib\site-packages\PyQt5\Qt\plugins pyqt5经验2&#xff1a; 使用designer.exe进行设计&#xff1…

智慧公厕:将科技融入日常生活的创新之举

智慧公厕是当今社会中一项备受关注的创新项目。通过将科技融入公厕设计和管理中&#xff0c;这些公厕不仅能够提供更便利、更卫生的使用体验&#xff0c;还能够极大地提升城市形象和居民生活质量。本文将以智慧公厕领先厂家广州中期科技有限公司&#xff0c;大量的精品案例项目…

黑豹程序员-架构师学习路线图-百科:CSS-网页三剑客

文章目录 1、为什么需要CSS2、发展历史3、什么是CSS4、什么是SASS、SCSS 1、为什么需要CSS 作为网页三剑客的第二&#xff0c;CSS为何需要它&#xff0c;非常简单HTML只能完成页面的展现&#xff0c;但其做出来的页面奇丑无比。 随着网络的普及&#xff0c;人们的要求更高&…

cmip6数据处理之降尺度

专题一 CMIP6中的模式比较计划 1.1 GCM介绍全球气候模型&#xff08;Global Climate Model, GCM&#xff09;&#xff0c;也被称为全球环流模型或全球大气模型&#xff0c;是一种用于模拟地球的气候系统的数值模型。这种模型使用一系列的数学公式来描述气候系统的主要组成部分…