Java面向对象(三)(抽象和封装)(自己学习整理的资料)

一.类的提炼过程

  • 从现实生活中归纳总结出,多种相同物种,具有的相同的特性(属性+行为)提炼到一个容器里,给这个容器起一个名字,名字就是类。

  • 步骤:

  1. 发现类(Dog)

  2. 发现类的属性(毛色,品种,姓名,年龄等)

  3. 发现类的方法(跑,叫等)

二.类图 

  • 我们可以使用类图描述类,进而来分析和设计类。

  • 使用类图描述类更加的形象和直观。

  • 类的形成
package lianxi;public class Dog {
//属性public String brand;public String name;public int age;//行为:方法public void run(){System.out.println("run");}public void bark(){System.out.println("bark");}
}

ps:图截取自视频老师讲解。在实际开发中,需求在需求文档中,需求文档一般都是文字描述的需求,从文字中提炼有效信息,将有效信息先设计成类图,然后再定义类。

三.构造方法

  • 构造方法主要完成对象的创建工作。
  • 基础语法

访问修饰符  构造方法名(){

//初始化代码

}

系统提供默认无参构造方法

public Dog(){

}

package lianxi;
//Dog类
public class Dog {
//属性public String brand;public String name;public String age;//构造方法:无参构造//我们自己定义了任何一款构造函数,那么系统都不再帮我们生成任何构造了。public Dog(){// System.out.println("1111");}//行为:方法public void run(){System.out.println("run");}public void bark(){System.out.println("bark");}public void show(){System.out.println("品种是:"+brand+",姓名是:"+name+",年龄是:"+age);}
}
package lianxi;public class To1 {public static void main(String[] args) {//1.本质上调用了无参构造方法.//2.构造方法可以创建对象。//3.手动写了构造,系统不会再提供构造。Dog dog = new Dog();dog.brand="柯基";dog.name="旺财";dog.age="3";dog.show();}
}

ps:较为复杂,写代码较慢,可用带参构造进行优化。

  • 自定义构造方法
  1. 构造方法和类名相同。
  2. 没有返回值。
  3. 注意:一旦自定义构造方法,系统将不再提供默认的构造方法。

ag:Dog dog = new Dog("柯基","旺财",3);

package lianxi;
//Dog类
public class Dog {
//属性public String brand;public String name;public int age;//构造方法:无参构造//我们自己定义了任何一款构造函数,那么系统都不再帮我们生成任何构造了。/** public Dog(){System.out.println("1111");}*///构造方法不能有任何任何放回类型,甚至连void都不能有。public Dog(String bread,String name,int age){//this后面跟的是成员变量
this.brand = bread;
this.name = name;
this.age = age;}
public Dog(String brand,String name){this.brand = brand;this.name = name;
}
public Dog(String brand){this.brand = brand;
}//行为:方法public void run(){System.out.println("run");}public void bark(){System.out.println("bark");}public void show(){System.out.println("品种是:"+brand+",姓名是:"+name+",年龄是:"+age);}
}
package lianxi;public class To1 {public static void main(String[] args) {//1.本质上调用了无参构造方法.//2.构造方法可以创建对象。//3.手动写了构造,系统不会再提供构造。
//        Dog dog = new Dog();
//        dog.brand="柯基";
//        dog.name="旺财";
//        dog.age= 3;
//        dog.show();Dog dog = new Dog("柯基","旺财",3);dog.show();}
}

ps:如此一来main函数中只用两行代码就解决了。

  • 方法重载
  1. 方法名相同,实现的功能相同。
  2. 参数列表不同:参数类型、参数个数、参数顺序不同
  3. 与返回值和访问修饰符无关。

ps:普通方法可以实现重载,构造方法也可以重载。

    public void test(String name,int num){}public void test(int num,String name){}
    int test(String name,int num){return num;}public void test(int num,String name){}

四.static的使用

  • 直接使用static修饰属性和方法
package lianxi;public class Cat {
static String name;
public static void show() {System.out.println("1");
}
}
package lianxi;public class T02 {public static void main(String[] args) {Cat.name = "小猫";Cat.show();}
}

ps:静态的变量是斜着的。静态成员占用的内存是静态存储区,而且一个成员一旦变成静态的,它就是类本身所有,只有一份,和对象就没有关系了。它会一直生存到程序结束。占用内存空间很大。所以不能把所有变量都定义成静态的。

  • static代码块
  • JVM加载类时,加载静态代码块。

  • 如果有多个静态块,按顺序加载。

  • 每个静态代码块只会被执行一次。

package lianxi;public class StaticTest {static int num=100;static {num+=100;System.out.println(num);}static{num+=500;System.out.println(num);}
}
package lianxi;public class T03 {public static void main(String[] args) {StaticTest st1 = new StaticTest();//由于类只会被加载一次,所有静态成员也只被加载一次。StaticTest st2 = new StaticTest();System.out.println(StaticTest.num);}
}
  • static变量

-类变量(静态变量)

  • 被static修饰的变量

  • 在内存中只有一个拷贝

  • 类内部,可在任何方法内直接访问静态变量

  • 其他类中,可以直接通过类名访问了

-实例变量

  • 没有被static修饰的变量

  • 每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响

  • static方法

-静态方法:可直接通过类名访问

  1. 不能直接访问所属类的实例变量和实例方法
  2. 可直接访问类的静态变量和静态方法

-实例方法:通过实例访问

  1. 可直接访问所属类的静态变量、静态方法、实例变量和实例方法

五、封装

封装的理解
  • 封装是面向对象的三大特性之一

  • 封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问

  • 封装的优点:

  1. 隐藏类的实现细节

  2. 只能通过规定方法访问数据

封装的过程
  1. 将属性的可见性设为private

  2. 创建公有的getter和setter方法

  3. 在getter和setter方法中加入判断语句

package lian;public class Dog {//public privateprivate String name;private int age;//alt+enter快捷键//给出一个访问方式//两个方法:都是公开的public//赋值public void setName(String name) {this.name = name;}//取值public String getName() {return name;}public int getAge() {return age;}public void setAge(int age) {if (age < 0) {//非法年龄age = 0;} else {this.age = age;}}
}
package lian;public class T05 {public static void main(String[] args) {Dog dog = new Dog();dog.setName("小黑");String name = dog.getName();System.out.println(name);dog.setAge(-100);System.out.println(dog.getAge());}
}
封装的两种体现
  1. 一个类中可以出现成员变量和成员方法

  2. 将私有的成员变量封装成公有的get和set方法。

六、this用法

  • 当参数名称和成员名称相同时,可以使用this关键字表示成员变量

七、导入包

  • 为了使用不在同一包中的类,需要在Java程序中使用import关键字导入这个类
  • import 包名.类名
导入包的注意事项
  • 一个类同时引用了两个来自不同包的同名类

        -必须通过完整类名来区分

  • package和import的顺序是固定的
  1. package必须位于第一行

  2. 只允许有一个package语句

  3. 其次是import

  4. 接着是类的声明

八、访问控制

  • 类的访问控制

        -public修饰符:公有访问级别

        -默认修饰符:包级私有访问级别

  • 类成员的访问控制
            作用域
修饰符
同一个类中同一个包中子类中任何地方
private可以不可以不可以不可以
默认修饰符可以可以不可以不可以
protected可以可以可以不可以
public可以可以可以可以
练习一
  • 运用面向对象的思想抽象出Car类,汽车有品牌,型号,生产年份,行驶里程数,对行驶里程数进行封装,保证数据的有效性。使用带参构造对属性赋值。
package lian;public class Car {//品牌String brand;//型号String model;//生产年龄int year;//行驶里程数private int mile;public Car(String brand, String model, int year) {this.brand = brand;this.model = model;this.year = year;}public int getMile() {return mile;}public void setMile(int mile) {if (mile<0){//证明行驶的公里数是0mile=0;}else {this.mile = mile;}}public void show(){System.out.println("汽车的品牌为:"+brand+",汽车的型号为:"+model+",汽车的生产年份为:"+year+",汽车的行驶里程数为:"+mile);}
}
package lian;public class T06 {public static void main(String[] args) {Car car = new Car("迈巴赫","S680",2023);car.setMile(-100);car.show();}
}
练习二
  • 模拟实现投票过程:每个网民只允许投一次票,并且当投票总数达到1000时,就停止投票。
package lian;public class Vote {//投票的次数static int count;public static final int MAX_COUNT = 1000;public String name;public Vote(String name){this.name=name;}//投票的方法public void voter(){//如果投票到达了上限,就提醒投票结束if (count==MAX_COUNT){System.out.println("活动已结束,停止投票");}else {count++;System.out.println("感谢"+name+"投票");}}public static void show(){System.out.println("目前"+count+"票");}
}
package lian;public class T07 {public static void main(String[] args) {Vote vote = new Vote("张三");Vote vote1 = new Vote("李四");Vote.show();vote.voter();vote1.voter();Vote.show();}
}

九、笔记

  • Ctrl+鼠标左键,可以在idea中转到相应的定义。

  • 方法重载:overload。

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

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

相关文章

亿佰特STM32MP13工业核心板【学习】

资料链接&#xff1a;ebyte.com/serchlist.aspx?keyECK10 加屏蔽罩的方法确实可以防EMC干扰防水防潮&#xff1a; 宽度: 16 位宽表示数据总线的宽度&#xff0c;意味着每次可以传输 16 位的数据。这在某些应用中可以提高内存带宽。电压: DDR3L SDRAM 的工作电压通常为 1.35V&…

32 类和对象 · 中

目录 一、类的默认成员函数 二、构造函数 &#xff08;一&#xff09;构造函数的特点 &#xff08;二&#xff09;使用例 1、Date类 2、Stack类 &#xff08;三&#xff09;总结 三、析构函数 &#xff08;一&#xff09;析构函数的特点 &#xff08;二&#xff09;使…

scrapy的xpath在控制台可以匹配,但是到了代码无法匹配(无法匹配tbody标签)

问题 使用xpath-helper可以匹配到,然后scrapy却无法 然后写入html来看看 发现根本就没有tbody,太可恶了 解决 方法1 不使用tbody就可以 方法2 使用或运算符 | big_list response.xpath("//div[classChannelClasssNavContent]/table/tbody/tr[1]/td/table/tbody/t…

Android OpenGL天空盒

在我们的项目学习过程中&#xff0c;我们从一片漆黑的虚空开始构建。为了给这个世界增添一些色彩&#xff0c;我们加入了三个粒子喷泉&#xff0c;但即便如此&#xff0c;我们的世界依然大部分被黑暗和虚无所笼罩。这些喷泉仿佛悬浮在无尽的黑暗之中&#xff0c;没有边界&#…

玫瑰花HTML源码

HTML源码 <pre id"tiresult" style"font-size: 9px; background-color: #000000; font-weight: bold; padding: 4px 5px; --fs: 9px;"><b style"color:#000000">0010000100000111101110110111100010000100000100001010111111100110…

unity学习-全局光照(GI)

在全局光照&#xff08;Lighting&#xff09;界面有两个选项 Realtime Light&#xff08;实时光照&#xff09;&#xff1a;在项目中会提前计算好光照以及阴影的程序&#xff0c;当你需要调用实时全局光照的时候会将程序调用出来使用 Mixed Light&#xff08;烘焙光照&#x…

Nova-Admin:基于Vue3、Vite、TypeScript和NaiveUI的开源简洁灵活管理模板

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和工作学习方法 Nova Admin是一个基于Vue3、Vite、TypeScript和NaiveUI的简洁灵活的管理模板。这个项目旨在为开发者提供一个现代化、易于定制的后台管理界面解决方案。无…

什么是3D模型?如何进行3D建模?应用领域有哪些?

3D模型是在计算机图形学中&#xff0c;为某个表面或物体在专用软件中创建的数字形象&#xff0c;它代表了一个物理实体在三维空间中的形态。以下是对3D模型的详细解释及实现方式的介绍&#xff1a; 一、3D模型的定义 概念&#xff1a;3D模型&#xff0c;即三维模型&#xff0…

springboot+vue的宠物医院管理系统(源码+lunwen)

基于vuespringboot的宠物医院管理系统&#xff0c;分为前台页面和后台管理端。 前台页面&#xff1a; 用户注册与登录&#xff1a;用户可以创建账户并登录系统&#xff0c;以便预约服务、查看个人信息等。宠物信息管理&#xff1a;用户可以添加、编辑和删除自己的宠物信息&am…

数字后端实现静态时序分析STA Timing Signoff之min period violation

今天给大家分享一个在高性能数字IC后端实现timing signoff阶段经常遇到的min period violation。大部分时候出现memory min period问题基本上都是需要返工重新生成memory的。这是非常致命的错误&#xff0c;希望大家在做静态时序分析时一定要查看min period violation。 什么是…

RabbitMQ 发布确认模式

RabbitMQ 发布确认模式 一、原理 RabbitMQ 的发布确认模式&#xff08;Publisher Confirms&#xff09;是一种机制&#xff0c;用于确保消息在被 RabbitMQ 服务器成功接收后&#xff0c;发布者能够获得确认。这一机制在高可用性和可靠性场景下尤为重要&#xff0c;能够有效防止…

数据结构——顺序表的基本操作

前言 介绍 &#x1f343;数据结构专区&#xff1a;数据结构 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》24~28页 补充 此处的顺序表创建是课本中采用了定义方法为SqList Q来创建&#xff0c;并没有使用顺序表指针的方法&#xff0c;具体两个…

TCL中环开工率下滑,员工集体要求解约赔偿

“ 尽管中环的市占率有所提高&#xff0c;但是高开工率也带来了巨量硅片库存&#xff0c;严重拖累了公司业绩。 ” 转载&#xff1a;科技新知 原创 作者丨依蔓 编辑丨蕨影 因大幅下调开工率&#xff0c;光伏硅片龙头TCL中环疑似遭遇员工“离职潮”&#xff1f; 近日&…

[云] 创建 Docker 镜像,将其推送到 Amazon Elastic Container Registry (ECR),并对已部署的应用程序进行负载测试

在此作业中&#xff0c;您将学习如何使用 AWS Lambda 和 API Gateway 将机器学习模型部署为无服务器应用程序。您将创建 Docker 镜像&#xff0c;将其推送到 Amazon Elastic Container Registry (ECR)&#xff0c;并对已部署的应用程序进行负载测试。此外&#xff0c;您还将分析…

【KEIL那些事 4】CMSIS缺失!!!!导致不能编译!!!!软件自带芯片下载缓慢!!!!!!快速下载芯片包!!!!!

安装了keli发现emmm&#xff0c;CMSIS缺失&#xff01;&#xff01;&#xff01;&#xff01;不能编译&#xff0c;&#xff0c;&#xff0c;自带下载芯片缓慢&#xff0c;&#xff0c;&#xff0c;官网下载emmm&#xff0c;竟然不带动的&#xff01;&#xff01;&#xff01;&…

数据库集群

主从复制 作用&#xff1a; 1.做数据的热备&#xff0c;作为后备数据库&#xff0c;主数据库服务器故障后&#xff0c;可切换到从数据库继续工作&#xff0c;避免数据丢失。 2.架构的扩展。业务量越来越大&#xff0c;I/O访问频率过高&#xff0c;单机无法满足&#xff0c;此…

基于node.js宜家宜业物业管理系统【附源码】

基于node.js宜家宜业物业管理系统 效果如下&#xff1a; 系统首页界面 业主登录界面 停车位页面 小区公告页面 管理员登录界面 管理员功能界面 物业管理员管理界面 缴费信息管理界面 物业管理员功能界面 研究背景 近年来互联网技术飞速发展&#xff0c;给人们的生活带来了极…

《云计算网络技术与应用》实训6-1:配置KVM虚拟机使用NAT网络

任务1、计算节点基础环境准备 1. 使用VMware安装CentOS 7虚拟机&#xff0c;安装时记得开启CPU虚拟化&#xff0c;命名为“KVMC6”。 2. &#xff08;网卡配置和之前的一样&#xff0c;都用100网段&#xff09;网关设置为192.168.100.1&#xff0c;地址段为192.168.100.10-25…

excel将文本型数字转变为数值型数字

问题导入&#xff1a;复制数字到excel表格中&#xff0c;但是表格中数字显示为文本&#xff0c;且无法通过常规方法转变为可进行四则运算的数字。例如&#xff1a;在i3单元格中输入常规的转换方法仍然报错。在j3单元格中输入ISTEXT(H3)显示h3单元格确实为文本。 解决办法&#…

Chrome DevTools 三: Performance 性能面板扩展—— 性能优化

Performance 性能 &#xff08;一&#xff09;性能指标 首次内容绘制 (First Contentful Paint&#xff0c;FCP)&#xff1a; 任意内容在页面上完成渲染的时间 最大内容绘制 (Largest Contentful Paint&#xff0c;LCP)&#xff1a; 最大内容在页面上完成渲染的时间 第一字节…