
- 博主简介:努力学习的预备程序媛一枚~
- 博主主页: @是瑶瑶子啦
- 所属专栏: Java岛冒险记【从小白到大佬之路】

write in the front:
如何理解封装?
试想:我们使用微波炉的时候,只用设置好时间,按下“开始”即可运作。作为一个产品的使用者,我们希望生产者能把最简单的接口暴露给我们,而至于微波炉按下开关后,内部是具体如何运作的,这些细节不用我们操心。“高内聚,低耦合”。节省使用者的学习成本和时间成本程序设计也是如此。同时,由于封装了内部细节,提供了对外的接口,作为使用者的我们无法直接随意对内部进行操作,保证了内部数据的安全.

封装是程序设计的第一原则,Java设计中有两种封装的体现:
接下来我们具体感受一下Java中的封装(主要是讲封装在类上的体现):
目录

类的实现者:实现类内部细节—微波炉内部设计者
类的调用者:调用已有的类—微波炉的使用者
封装的本质是不向类的调用者透露过多类的实现内容,只提供特定的接口,让类的调用者去使用类
我们在学习Java的时候经常会用到jdk-API文档,通过文档来查询某个类怎么使用:

此时我们的视角是:类的调用者,我们的目的是使用这个类,而不关注这个类的具体实现。这正是封装的体现。Java开发者实现了一些类,把这些类的具体实现内容(类的源码)封装,只向外提供一些(接口),方便类的调用者去直接使用(再不用看源码的情况下,能快速使用这个类)。
class Person{
public String myName;
public int age;
public String sex;
}
public class TestDemo {
public static void main(String[] args) {
Person person1=new Person();
person1.name=19;
}
}

class Person{
private String myName = "yaoyao"//修改
public int age;
public String sex;
}
public class TestDemo {
public static void main(String[] args) {
Person person1=new Person();
person1.myName=2000;//修改
}
}
🌇eg:
class Person{
private String myName = "yaoyao"//修改
private int age=19;
private String sex="femal";
public void show(){
System.out.println(myName+age+sex);
}
}
public class TestDemo {
public static void main(String[] args) {
Person person1=new Person();
person1.show();
}
}
class Person{
private String myName;
public void setMyName(String name){//对外提供访问属性方法
this.myName = name;
}
public String getMyName(){//对外提供获取属性方法
return this.myName;
}
}
public class TestDemo {
public static void main(String[] args) {
Person person1 = new Person();
person1.setMyName("yaoyao");
System.out.println(person1.getMyName());
}
}
📬Tips:
你可能会想,如果类的实现者修改了对外公开的属性/方法,这样不是同样会增加类的调用者的学习&使用成本嘛?
答: 一般类的设计都要求:类提供的 public 方法/属性能比较稳定–不频繁发生大的修改. 尤其是对于一些基础库中的类. 每次接口的变动都要仔细考虑兼容性问题
1. private修饰相应属性–属性私有化
2. 制作相对应公开的setter/getter方法
public void setXXX(参数列表){
//验证传参是否合理
...
//合理即可赋值:
属性 = 形参;
}
public void getXXX(){
//权限判断
return XXX;
}
public class Student(){
private String name;//名字
public static setName(String name){
//对数据进行验证合理性
if(name.length() >= 2 && name.length() <=10){
this.name = name;
}
else{
System.out.println("设置名字长度超过范围,未设置成功");
}
}
public static getName(){
return this.name;
}
}
class Demo{
public static void main (String[] args){
Student student = new Student();
//若传入这样不合理数据,则无法成功修改属性
student.setName("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
}
}
alt+insert



public class Student(){
private String name;//名字
public static setName(String name){
//对数据进行验证合理性
if(name.length() >= 2 && name.length() <=10){
this.name = name;
}
else{
System.out.println("设置名字长度超过范围,未设置成功");
}
}
public static getName(){
return this.name;
}
//构造器(本质:初始化数据)
public Student(String name){
setName(name);//直接在构造器内调用set方法
}
}
class Demo{
public static void main (String[] args){
Student student = new Student("HHHHHHHHHHHHHHHhhhhhhhhhhhhhhhh");
}
的确,我们谈到封装,可能最先想到的是类,并且封装在类上体现的学问、细节,确实很多。封装是一种思想,Java的函数和类本身是这种思想的明显体现。我的意思是,如果类中的属性都是public,我们仍然认为类是一种封装。但是如果只是单单的这样浅层次的封装,肯定会带来很多问题(如上文已经讲到的:安全性、使用成本…)
于是,我们需要更深层次的封装—上面Part所讲的,其实本质就是在类的基础上,再次封装(或许可以叫作套娃?)。
getter(),说明打开铅笔盒的操作是可以使用的。
虽然类体现封装的确占大头,但是,函数(就是Java中的方法),也体现了封装,既然此文是讲封装,怎么能少的了我们的函数老爷呢?
程序的构成
程序由数据和指令构成。大程序可以分为小程序,小程序可以再次细分—>子程序(分而治之)。
所有我们看到有些地方把函数也称为子程序。程序是数据,指令的集合。所以:函数也是封装的体现
通过上面,可以看到,其实程序本身就是封装,类、函数是封装中的封装…
总之,请记住:
封装是程序设计的第一原则, 类&方法是封装的不唯二体现。通过封装,我们才能站在更高层次思考问题。
我希望将Favorite模型添加到我的User和Link模型。业务逻辑用户可以有多个链接(即可以添加多个链接)用户可以收藏多个链接(他们自己的或其他用户的)一个链接可以被多个用户收藏,但只有一个所有者我对如何为这种关联建模以及在模型就位后如何创建用户收藏夹感到困惑?classUser 最佳答案 下面的数据模型怎么样:classUser:destroyhas_many:favorite_links,:through=>:favorites,:source=>:linkendclassLink:destroyhas_many:favor
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.