Java基础(三)对象与类

  1.类的概念:类是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。

  2.封装的概念:封装(有时称为数据隐藏)是与对象有关的一个重要概念。对象中的数据称为实例域,操纵数据的过程称为方法。对于每个特定的类实例(对象)都有一组特定的实例域值。这些值的几个就是这个对象的当前状态。无论何时,只要向对象发送一个消息,它的状态就有可能发生改变。实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域。程序仅通过对象的方法与对象数据进行交互。封装给对象赋予了“黑盒”特征,这是提高重用性和可靠性的关键。这意味着一个类可以全面地改变存储数据的方式,只要仍旧使用同样的方法操作数据,其他对象就不会知道或介意所发生的变化。

  3.对象的三个主要特性:

  • (1)行为--可以对对象施加哪些操作,或可以对对象施加哪些方法
  • (2)状态--当施加那些方法时,对象如何响应
  • (3)标识--如何辨别具有相同行为与状态的不同对象

  4.类之间的关系:

  • 依赖(uses-a):如果一个类的方法操纵另一个类的对象,就说一个类依赖于另一个类。
  • 聚合(has-a):聚合关系意味着类A的对象包含类B的对象。
  • 继承(is-a):如果类A扩展类B,类

  5.封装的优点

  如果需要获得或设置实例域的值,应该提供下面三项内容:

  • 一个私有(private)的数据域
  • 一个公有的(public)域访问器方法(get())
  • 一个公有的(public)域更改器方法(set())

  这样做的好处是,私有的数据域一旦在构造器中设置完毕,就只能通过公有的域访问器方法对这个私有域进行访问,同时也只能通过公有的域更改器对这个私有域进行修改。一旦这个域值出现了错误,只用调试这个方法就可以了,如果域是public的,破坏这个域的捣乱者可能会出现在任何地方。

  6.私有方法

  如果希望将一个计算代码划分成若干个独立的辅助部分,通常,这些辅助方法不应该成为公有接口的一部分,这是因为它们往往与当前的实现机制非常紧密,或者需要一个特别的协议以及一个特别的调用次序。最好将这样的方法设计为private的,因为private方法只能当前类的方法调用,而外部类无法调用。

  对于私有方法,如果改用其他方法实现相应的操作,则不必保留原有的方法。只要方法是私有的,类的设计者就可以确信:它不会被外部的其他类操作调用,可以将其删去。如果方法是公有的,就不能将其删去,因为其他的代码很可能依赖它。

  7.final实例域

  将实例域定义为final时,在构造对象时必须初始化这样的域。也就是说,必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能够再对它进行修改。

  8.静态域

  如果将域定义为static,每个类中只有一个这样的域,而每一个对象对于所有的实例域却都有自己的一份拷贝。

class Employee{
private static int nextId = 1private int id; }

  例如,每一个雇员对象都有自己的id域,但这个类的所有实例将共享一个nextId域。也就是说,如果有1000个Employee类的对象,则有1000个实例域id。但是,只有一个静态域nextId。即使没有一个雇员对象,静态域nextId也存在。它属于类,而不属于任何独立的对象。

  9.静态常量

public class Math{public static final double PI = 3.14159265358979323846;...
}

  如果关键字static被省略,PI就变成了Math类的一个实例域。需要通过Math类的对象访问PI。并且每一个Math对象都有它自己的一份拷贝。如果使用了static,PI就属于Math类,也就是说,任何调用Math类中PI的值都是唯一的,只有一个。也不用通过Math类的对象才能访问。同时,前面提到过,最好将实例域设计为private,但是公有常量(final域)设置为public却没有问题,因为PI被声明为final为不可变,所以,不允许再将其他值赋给PI。

  10.静态方法

  静态方法是一种不能向对象实施操作的方法。使用静态方法时不需要任何类的对象。

public static int getNextId(){return nextId;  
}

  Employee类的静态方法不能访问Id实例域,因为它不能操作对象。但是,静态方法可以访问自身类中的静态域。

  可以通过类名调用这个方法。如果省略了static,那么需要通过Employee类对象的引用调用这个方法。

int n = Employee.getnextId();

  在下面的两种情况下使用静态方法:

  • 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供的。(例如,Math.pow(x,a))
  • 一个方法只需要访问类的静态域(例如,Employee.getnextId())

  11.静态代码块

29    // 静态初始化块
30    static
31    {
32       Random generator = new Random();
33       // 设置nextId为0到9999的随机数
34       nextId = generator.nextInt(10000);
35    }

  在类的构造方法之前,如果对类的静态域进行初始化的代码比较复杂,那么可以使用静态的初始化块。将初始化代码放在一个块中,并标记关键字static。

  这样,在类第一次加载的时候,将会对静态域进行初始化。与实例域一样,所有的静态初始化代码块都将依照类定义的顺序执行。

  12.包作用域

  • 标记为public的类、方法或常量可以被任意的类使用。
  • 标记为private的类、方法或常量只能被定义它们的类使用。
  • 如果没有指定public或private,这个类、方法或常量可以被同一个包中所有方法访问。

  13.类设计技巧

  • 一定要保证数据私有

  绝对不要破坏封装性。有时候需要编写一个访问器或修改器方法,但是最好还是保持实例域的私有性。数据的表示形式很可能会改变,但它们的使用方式却不会经常发生变化。当数据保持私有时,它们的表示形式的变化不会对类的使用者产生影响,即使出现bug也易于检测。

  • 一定要对数据初始化

  最好不要依赖于系统的默认值,而是应该显示地初始化所有的数据。具体的初始化方式可以是提供默认值,也可以是在所有构造器中设置默认值。

  • 不要在类中使用过多的基本类型

  即用其他的类代替多个相关的基本类型的使用,这样会使类更加易于理解且易于修改。

  例如:Customer类中包括很多实例域,其中有实例域street,city和state,可以将这三个实例域拿出来用一个Address的新的类替换,从而可以减少Customer类中的实例域个数。

  • 不是所有的域都需要独立的域访问器和域修改器

  如果有一些不希望别人访问或者修改的域,就不要设置域访问器或域修改器。要根据实际情况和实际需求来设置。

  • 将职责过多的类进行分解

  一种情况是将实现很多功能的类分解成几个不同的类,这些类分担原来的类的所有的职责。

  • 类名和方法名要能够体现它们的职责
  • 优先使用不可变的类

  更改对象的问题在于,如果多个线程试图同时更新一个对象,就会发生并发更改。其结果是不可预料的。如果类是不可变的,就可以安全地在多个线程间共享其对象。

  

          

转载于:https://www.cnblogs.com/BigJunOba/p/9320719.html

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

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

相关文章

mac系统如何进入系统偏好设置_MacOS Big Sur 系统偏好设置无法解锁Bug解决

前不久,MacOS推送正式版Big Sur,我满怀期待的更新。更新的过程很平缓,一切都很顺利。但在使用时,出现了一个问题,系统偏好设置的锁无法解除,导致有些软件需要权限,却不能正常允许通过&#xff0…

English trip -- VC(情景课)2 D Reading

Xu言: 业精于勤,荒于嬉;行成于思,毁于随 Before you read 阅读准备 Talk about the picture, what do you see?看图说话,你看到了什么? Listen and read 听并读 Sue, Have fun at sc…

VLAN访问控制列表(VACL)的配置方法

VLAN访问控制列表(VACL)的配置方法同普通的访问控制列表不同,VACL是用在VLAN内对数据进行过滤的,而前者是用在第三层接口对出入的数据包进行过滤,例如:在同一个VLAN内部,我们可能不允许其他主机对另一台主机进行访问,此时我们可以使用VLAN来实现,其配置方法如下:1.创建VACL(是以…

事务嵌套问题_注意Spring事务这一点,避免出现大事务

背景本篇文章主要分享压测的(高并发)时候发现的一些问题。之前的两篇文章已经讲述了在高并发的情况下,消息队列和数据库连接池的一些总结和优化,有兴趣的可以在我的公众号中去翻阅。废话不多说,进入正题。事务,想必各位CRUD之王对…

js规范

一个js文件中&#xff0c;包含多个函数&#xff0c;应该只有一个调用&#xff0c;例如: var fun function(x) {if (x < 1) {return x;} else {return -x;} }function ensure(condition, message) {if (!condition) {console.log(message)} }function testFun() {ensure(fun…

原来嵌套个网页的技术是这样的

一开始被其他技术说的似乎很难实现一样&#xff0c;以前自己学过点开发的技术&#xff0c;不过都是皮毛&#xff0c;本想走开发的&#xff0c;没走成&#xff0c;呵呵&#xff0c;还是走到了自己的本专业。 页面一、 <html> <head> <meta http-equiv"Conte…

多布局怎么搭建_怎么制作网页?网页制作基本步骤

怎么制作网页?网页制作基本步骤&#xff0c;互联网时代&#xff0c;各行各业的企业为了适应时代的发展&#xff0c;纷纷从线下转移至线上来拓展自己的业务。若想让更多人了解自己的企业&#xff0c;拥有一个专属网站至关重要。网站不仅可以详细介绍企业信息&#xff0c;更重要…

git github

今日内容&#xff1a;git 1. 版本管理工具 - git - svn https://git-scm.com/downloads 2. 大表哥创业故事&#xff1a;北京热 a. 初次创建版本 git init git config --global user.email "youexample.com" git config --global user.name "Your Name"…

系统的常用安装方法

原装系统安装1、 开机看屏幕提示进入BIOS设置引导顺序&#xff0c;First Boot设置为CD-ROM。一般是按Delete键进入&#xff0c;或者是F12直接进入引导菜单选择CD-ROM&#xff08;现代新的主板会有引导菜单&#xff09; 2、 设置光驱引导&#xff08;主板不同可能设置有所不同&a…

C++重载运算符

其实在C中&#xff0c;运算符也是一种函数&#xff0c;有自己的类型&#xff0c;有自己的参数&#xff0c;有自己的返回值。 下面就是重载的方法&#xff1a; struct vec {int x;int y; }; vec operator(const vec &a,const vec &b) //括号里面的是参数 {vec temp;temp…

能运行shell吗_terminal, shell, bash, zsh

##秋天的第一杯奶茶梗?Terminal: shell运行在里面。A terminal refers to a wrapper program that runs a shell.Shell:The shell is the program that actually processes commands and returns outputs. Most shells also manage foreground and background processes, comm…

ROJECT SERVER如何与OUTLOOK集成使用

最近一直挺忙&#xff0c;换了个工作环境&#xff0c;接手一个project server的管理。公司项目挺多&#xff0c;企业资源、wbs 、视图&#xff0c;管理类别很多要定义。项目成员使用习惯是个问题&#xff0c;就整理了project协作使用说明。 登陆WPA站点<?xml:namespace pr…

python制作点亮图片_MicroPython拼插编程实例:点亮心形8x8点阵

一、什么是TPYBoard开发板TPYBoard是以遵照MIT许可的MicroPython为基础的一款MicroPython开发板&#xff0c;它基于STM32F405单片机&#xff0c;通过USB接口进行数据传输。该开发板内置4个LED灯、一个加速传感器&#xff0c;可在3V-10V之间的电压正常工作。TPYBoard开发板让用户…

OSPF的虚链路配置

OSPF的虚链路配置<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />OSPF多区要求普通区域必须和骨干区域&#xff08;area 0&#xff09;相连&#xff0c;如果一个区域不能和骨干区域直接相连&#xff0c;可以使用虚链路把该区域逻…

webmvcconfigurer配置跨域_为什么加了 Spring Security 会导致 Spring Boot 跨域失效呢?...

点击上方 IT牧场 &#xff0c;选择 置顶或者星标技术干货每日送达作者&#xff1a;欧阳我去链接&#xff1a;https://segmentfault.com/a/1190000019485883作为一个后端开发&#xff0c;我们经常遇到的一个问题就是需要配置 CORS&#xff0c;好让我们的前端能够访问到我们的 AP…

[jQuery]3D效果的标签云

刚才看了篇园友关于如何自定义标签云的文章&#xff0c;心痒痒自己也想弄一个&#xff0c;其实原理非常简单&#xff0c;就是动态load标签页里的标签&#xff0c;按需要的格式重新动态生成DOM结构&#xff0c;再通过第三方的js插件(他们用的是Google Visualization API Gallery…

远程登录的几种方式对比

1&#xff0c;telnet  Telnet是进行远程登录的标准协议&#xff0c;它把用户正在使用的终端变成网络某一远程主机的仿真终端&#xff0c;使得用户可以方便地使用远程主机上的软、硬件资源。  但telnet有一个致命的缺陷&#xff0c;就是Telnet协议使用明文的方式传送所有的数…

1071svm函数 r语言_R语言机器学习之核心包e1071 - 数据分析

R语言有很多包可以做机器学习(Machine Learning)的任务。机器学习的任务主要有有监督的学习方式和无监督的学习方式。有监督学习&#xff1a;在正确结果指导下的学习方式&#xff0c;若是正确结果是定性的&#xff0c;属于分类问题&#xff1b;若正确结果是定量的&#xff0c;属…

申请实习生,你准备好了吗?

转自校内看到的一篇别人分享的文章。自己也马上就要大三了&#xff0c;又不想考研&#xff0c;所以就面临着这样的问题&#xff0c;觉得写得不错&#xff0c;所以拿来分享下。前 言&#xff1a;这篇文章&#xff0c;是我和茄子皮晚上再次聊起来的一个总结&#xff0c;总结了茄子…

重装系统失败后怎么用好系统U盘启动解决?

很多朋友在第一次重装电脑系统时都会出现这样或那样的错误&#xff0c;导致重装系统后进不去系统&#xff0c;非常的被动。那么当我们遇到这种情况该怎么办呢&#xff1f;其实我们可以使用好系统U盘启动来解决重装系统后进不去的问题。 好系统U盘启动解决重装系统后进不去的方法…