Java——深入分析类与对象(封装性、构造方法与匿名对象、简单Java类开发原则)

举报
Winter_world 发表于 2021/09/28 23:39:11 2021/09/28
【摘要】 目录 1、封装性 2、构造方法与匿名对象 2.1、构造方法 2.2、匿名对象 3、简单Java类开发原则 1、封装性 Java中所有面向对象的概念都是以类与对象的关系为主,下面用一个程序说明为什么要提供有封装性。 protected void onCreate(Bundle savedInstanceState...

目录

1、封装性

2、构造方法与匿名对象

2.1、构造方法

2.2、匿名对象

3、简单Java类开发原则


1、封装性

Java中所有面向对象的概念都是以类与对象的关系为主,下面用一个程序说明为什么要提供有封装性。


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. Person person = new Person();
  4. person.name = "张三";
  5. person.age = -20;
  6. person.printOut();
  7. }
  8. class Person{
  9. String name;
  10. int age;
  11. public void printOut(){
  12. System.out.println("name="+name+"age="+age);
  13. }
  14. }

以上程序语法上OK,但是实际上属于业务错误,年龄不应该是负数。造成这种错误的原因是什么?

最大的错误在于,当前类中的属性可以直接被类外部的对象直接调用,所以,这样的操作是不安全的操作。

最需要解决的问题是将内部的属性保护起来,不允许外部直接操作,可以使用private 关键字,加入后,name 和age使用范围只能是在Person这个类中,类的外部不能直接访问,安全性最高。


  
  1. class Person{
  2. private String name;
  3. private int age;
  4. public void printOut(){
  5. System.out.println("name="+name+"age="+age);
  6. }
  7. }

现在若想通过对象操作类中的属性,在Java中的明确要求,使用setter、getter方法设置或取得封装属性内容,eg:


  
  1. class Person{
  2. private String name;
  3. private int age;
  4. public void printOut(){
  5. System.out.println("name="+name+"age="+age);
  6. }
  7. public String getName() {
  8. return name;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. public void setAge(int age) {
  17. this.age = age;
  18. }
  19. }

开发原则:类中的属性全部使用private封装,封装后的属性必须严格按照要求编写setter与getter方法。

2、构造方法与匿名对象

2.1、构造方法

构造方法的定义,要求方法名称与类名称相同,且没有返回值类型声明。构造方法只有在使用关键字new实例化对象的时候才会被调用,如下程序所示。


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. Test test =null;//不输出*
  4. test = new Test();//输出*
  5. }
  6. class Test{
  7. public Test(){
  8. System.out.println("**********");
  9. }
  10. }

Java在编译过程中,系统会自动加入一些代码,如果你的类中没有定义构造方法,系统自动帮助用户提供一个无参的构造方法,以此包装每个类中至少有一个构造方法。构造方法的作用是什么?

使用关键字new实例化时才会调用构造方法,实例化时属于堆内存空间的开辟,即是属性的初始化过程。但默认情况下属性初始化的内容都是对应数据类型的默认值,所以,在实例化时若想传递属性的内容,可以靠构造方法完成,省略了一系列的setter调用,实际开发中应用较多。

【举例】:构造有参构造方法


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. Person per = new Person("张三",10);
  4. per.printOut();
  5. }
  6. class Person{
  7. private String name;
  8. private int age;
  9. public Person(String name, int age) {
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public void printOut(){
  14. System.out.println("name="+name+"age="+age);
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public int getAge() {
  23. return age;
  24. }
  25. public void setAge(int age) {
  26. if(age >=0){
  27. this.age = age;
  28. }
  29. }
  30. }

注意:构造方法没有返回值,为什么没有使用void声明?构造方法在实例化对象时只调用一次,而普通方法可以利用对象调用多次,没有加void,这就是与普通方法加以区分。

构造方法本身还是属于方法,所以其是可以进行重载的。但是需要注意,按照参数的个数顺序,降序或升序排列,养成一个好的编程习惯。类中的基本属性就是属性、构造方法、普通方法,编程时也按照这个顺序。

对象的构造过程中涉及很多步骤:加载类,为对象开辟空间、属性赋值操作,构造方法在过程的最后一步,这一步是留给用户处理的。属性在声明时设置了具体的内容,这些内容是构造完成后才赋值的,构造之前都是默认值。

2.2、匿名对象

匿名对象指的是没有名字的对象,对象的名字都保存在了栈中。

如:Person per = new Person("张三",10); 就是有名对象,per是对象的名。

整个对象操作中,真正有用的不是栈内存,因为栈内存指向堆内存,真正用的是堆内存,堆内存靠new开辟,所以可以直接用new Person("张三",10)调用类中方法。

new Person("张三",10).printOut();
 

但是对象没有名字,使用一次后就自动成为了垃圾。

3、简单Java类开发原则

  • 1)类名称必须具备实际意义,可明确描述某一类实体,eg:学生、雇员、工人等。
  • 2)类中所有属性必须使用private封装;
  • 3)所有封装的属性必须编写setter、getter方法;
  • 4)类中可以构造若干构造方法,但是必须有一个明确的无参构造方法;
  • 5)类中不允许有输出操作,所有输出必须将数据返回给调用处输出;
  • 6)类中应该提供有一个可以取得对象完整信息的方法;

 

作于202003242240,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。

原文链接:winter.blog.csdn.net/article/details/105059117

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。