深入分析类与对象

1,成员属性封装

在类之中的组成就是属性与方法,一般而言方法都是对外提供服务的,所以是不会进行封装处理的,而对于属性需要较高的安全性,所以往往需要对其进行保护,这个时候就需要采用封装性对属性进行保护。

在默认的情况下,对于类中的属性是可以通过其他类利用对象进行调用的。

·范例:属性封装情况下的问题

1 classPerson{2 String name;3 intage;4 public voidtell(){5 System.out.println("姓名:"+this.name+",年龄:"+this.age);6 }7 }8 public classMain {9 public static voidmain(String[] args) {10 Person person1 = new Person();//声明对象

11 person1.name="张三";12 person1.age=18;13 person1.tell();14 }15 }

·范例:对属性进行封装此时在Person类中提供的name与age两个属性并没有进行封装处理,但是有可能所设置的数据是一个错误的数据。如果想要解决这样的问题就可以利用private关键字进行封装处理。

1 classPerson{2 privateString name;3 private intage;4 public voidtell(){5 System.out.println("姓名:"+this.name+",年龄:"+this.age);6 }7 }

·【setter、getter】设置或取得属性可以使用setXxx()、getXxx()方法,而属性一旦封装之后外部将不能够直接访问,即:外部不可见,但是对类的内部可见,如果想要外部的程序访问封装的属性,则在Java开发标准中提供有如下要求:

1 classPerson{2 privateString name;3 private intage;4 publicString getName() {5 returnname;6 }7 public voidsetName(String name) {8 this.name =name;9 }10 public intgetAge() {11 returnage;12 }13 public void setAge(intage) {14 this.age =age;15 }16 public voidtell(){17 System.out.println("姓名:"+this.name+",年龄:"+this.age);18 }19 }

·范例:实现方法

1 public classMain {2 public static voidmain(String[] args) {3 Person person1 = new Person();//声明对象

4 person1.setName("张三");5 person1.setAge(-18);6 person1.tell();7 }8 }

在以后任何类定义的时候一定要记住,类中的所有属性都必须要使用private封装(98%),并且属性如果要进行访问必须要提供setter、getter方法。

2,构造方法与匿名对象

现在的程序在使用类的时候一般都按照了如下的步骤进行:

·声明并且实例化对象,这个时候实例化对象中的属性并没有任何的数据存在,都是其对应数据的默认值;

·需要通过一系列的setter的方法进行为类中的属性设置内容。

等于现在想要真正活动一个可以正常使用的实例化对象,必须经过两个步骤才可以完成。

但是如果按照这样的方式来进行思考的话就会发现一个问题:假设类中的属性很多个,那么按照上述方法,就需要调用很多次setter的方法进行内容设置。这样的调用实在是太啰嗦了。所以在Java里面为了考虑到对象的初始化问题,专门提供有构造方法,即:可以通过构造方法实现实例化对象中的 属性初始化处理,只有在关键字new的时候才使用构造方法。

在Java程序里面构造方法的定义要求如下:

·构造方法名称与类名称保持一致;

·构造方法不允许设置任何的返回值类型,即没有返回值定义;

·构造方法是在使用关键字new实例化对象的时候自动调用的。

·范例:构造方法

1 classPerson{2 privateString name;3 private intage;4 public Person() {//无参构造

5 }6 public Person(String name, int age) {//有参构造

7 this.name =name;8 this.age =age;9 }10

11 }

·之前的对象实例化格式:①Person②per=③new④Person();下面针对当前的对象实例化格式与之前的对象实例化格式做一个比较:

·当前的对象实例化格式:①Person②per=③new④Person("张三",18);

①【①Person】主要是定义对象的所属类型,类型决定了你可以调用的方法;

②【②per】实例化对象的名称;

③【③new】开辟一块新的堆内存空间;

④【④Person("张三",18)】调用有参构造、【④Person()】调用无参构造。

在Java的程序里面克绿道程序结构的完整性,所以所有的类都会提供有构造方法,也就是说如果现在你的类中没有定义任何构造方法,那么一定会默认提供一个无参,什么都不做的构造方法,这个构造方法是在程序编译的时候自动创建的。如果你先已经在类中明确的定义有一个构造方法的时候,那么这个默认的构造方法将不会被自动创建。

结论:一个类至少存在有一个构造方法,永恒存在。

疑问:为什么构造方法上不允许设置返回值类型???

既然构造方法是一个方法,那么为什么不让它定义返回值类型呢?

既然构造方法不会返回数据,为什么不使用void定义呢?

分析:程序编译器是根据代码结构来进行编译处理的,执行的时候也是根据代码结构来处理的。

如果在构造方法上使用void,那么此结构就与普通方法相同了,这样编译器会认为此方法是一个普通方法,普通方法与构造方法最大的区别:构造方法是在类对象实例化的时候调用的,而普通方法是在类对象实例化产生之后调用的。

既然构造方法本身是一个方法,那么方法就具有重载的特点,而构造方法重载的时候只需要考虑参数的类型及个数即可。

·范例:构造方法重载

1 classPerson {2 privateString name;3 private intage;4 public Person(){//无参构造

5 }6 public Person(String name){//1参构造

7 super();8 this.name=name;9 }10 public Person(String name,int age){//2参构造

11 this.name=name;12 this.age=age;13 }14 public voidtell(){15 System.out.println("姓名:"+this.name+",年龄:"+this.age);16 }17 }

经过分析我们知道,setter与构造方法都可以进行的对象的属性设置,这个时候一定要清楚构造方法只在对象实例化的时候起作用,setter本身就是修改数据的功能。在进行多个构造方法定义的时候强烈建议大家有一些定义的顺序,例如:可以按照参数的个数降序或升序排列。

·定义对象的名称:类名称 对象名称 = null;

·实例化对象:对象名称 = new类名称();

如果这个时候通过实例化对象来进行类的操作也是可以的,而这种形式的对象由于没有名字就称为匿名对象。

·范例:观察匿名对象

1 public classMain {2 public static voidmain(String[] args) {3 new Person("万雨",25).tell();//匿名对象,没有引用名称!!!

4 }5 }

1 classMessage{2 privateString title;3 publicMessage(){}4 publicMessage(String title){5 this.title=title;6 }7

8 public void setTitle(String title) {//数据修改

9 this.title =title;10 }11

12 public String getTitle() {//数据获取

13 return this.title;14 }15 }16

17 classPerson{18 privateString name;19 private intage;20 publicPerson(){}21 publicPerson(String name){22 this.name=name;23 }24 public Person(String name,intage){25 this.name=name;26 this.age=age;27 }28 public Person(Message msg,int age){//方法重载,构造方法也是方法

29 this.name=msg.getTitle();30 this.age=age;31 }32 public voidsetName(String name) {33 this.name =name;34 }35 public void setAge(intage) {36 this.age =age;37 }38 publicString getName() {39 return this.name;40 }41 public intgetAge() {42 return this.age;43 }44 publicMessage getInfo(){45 return new Message(this.name+":"+this.age);46 }47 public voidtell(){48 System.out.println("【姓名】"+this.name+"【年龄】"+this.age);49 }50 }51 public classMain {52 public static voidmain(String[] args) {53 Message msg=new Message("Mufasa");54 Person person=new Person(msg,25);//声明对象、实例化对象

55 msg=person.getInfo();56 System.out.println(msg.getTitle());57 }58 }

此时依然通过了对象进行了类中tell()方法的调用,但是由于此对象没有任何的引用名称,所以该对象使用一次之后就变成了垃圾,而所有的垃圾都将被GC回收与释放。

java类 举例分析_Java深入分析类与对象相关推荐

  1. java 自定义异常实例分析_Java自定义异常类的实例详解

    Java自定义异常类的实例详解 为什么要自己编写异常类?假如jdk里面没有提供的异常,我们就要自己写.我们常用的类ArithmeticException,NullPointerException,Ne ...

  2. java date格式化输出_Java Date类以及日期的格式化输出

    Java中的Date类用于表示日期时间,在java.util包中.虽然Date类在设计之初没有考虑到国际化,很多方法都已经被定义为过时,但是Date却是程序设计过程中经常用到的一个类.本文将说说Dat ...

  3. java 反射 私有成员_Java对类私有变量的暴力反射技术讲解

    Java对类私有变量的暴力反射 假设有一个类,他有一个私有变量: package com.howlaa.day04; public class ReflectPoint { private int p ...

  4. java继承孙子类_Java:类与继承

    Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态 这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关 ...

  5. java定义类属性方法_java定义类、属性、方法

    Java是面向对象的程序设计语言,Java语言提供了定义类.定义属性.方法等最基本的功能.类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将会引用到类的对 ...

  6. java设计复数类报告总结_java复数类

    1 编写一个完整的 Java 程序,包括 Complex 和 TestComplex 两个类. 使用复数类 Complex 验证两个复数 1+2i 和 3+4i 相加产生一个新的复数 4+6i . . ...

  7. java修饰符默认_Java的类,方法,变量等等的默认修饰符是什么

    访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权限. 默认的,也称为default,在同一包内可见,不使用任何修饰符. 私有的,以pr ...

  8. java biginteger 取模_Java BigInteger类

    其实除了Python,Ruby外,Java也自带高精,只不过被封装在类里.Java有两个高精类:BigInteger和BigDecimal,分别是高精度整数和高精度小数.本文来简单介绍一下BigInt ...

  9. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

  10. 不能将brassplus类型的值分配到brass类的实体_Java 基础 - 类与对象

    类.对象和引用的关系 类和对象的关系 类是对象的模版,对象是类的一个实例,一个类可以有很多对象 一个Java程序中类名相同的类只能有一个,也就是类型不会重名 一个对象只能根据一个类来创建 引用和类以及 ...

最新文章

  1. 【c语言】蓝桥杯算法训练 大小写转换
  2. java datetime和date_Java 8时间接口localDateTime和Date的对比
  3. 触摸屏Sensor叠构实例学习记录(一)
  4. .net VS Java 到底谁吃香?
  5. 保护你的DLL和Code不被别人使用。
  6. Homework-201521410028
  7. Cramer_rule克莱姆法则讲解
  8. 52 个有用的机器学习与预测接口盘点
  9. 搭建机器人电控系统——通信协议——IIC通信原理及其实例(库函数+模拟IO口)
  10. Unity Bounds的理解
  11. 从零搭建Spring Boot脚手架:增加通用的功能2
  12. 【多模态】多模态摘要简述
  13. 信息化,不只是技术-某公司局域网改造实例(转)
  14. Ubuntu-离线安装基本依赖(gcc、make、dkms等)
  15. 我的Spring入门
  16. OATS和配对测试应该如何选择? 如何确定正交选择的强度?
  17. 整机压力测试_app的压力测试怎么做呢?
  18. 如何安装husky_Husky Chat 2.1.1
  19. Java项目:网吧计费管理系统(java+SSM+HTML+JS+jsp+mysql)
  20. oracle存储过程不退出,oracle 存储过程不结束

热门文章

  1. 蒙大拿大学计算机,2020年药学专业世界大学排名【USNEWS】
  2. 用户界面设计有效的人机交互策略_学习笔记
  3. 全国计算机等级考试二级Python(2021年9月)备考笔记 第六天
  4. vc程序大小优化最佳方案(转)http://blog.sina.com.cn/s/blog_4c50333c0100gjs3.html
  5. 【数学建模】微分方程求解 | dsolve函数 | ode45函数
  6. Tungsten Fabric如何增强Kubernetes的网络性能
  7. --随笔--带你轻松理解TCP中的三次握手
  8. WinRAR 密码 模板的秘密:
  9. {ResponseInfo:com.qiniu.http.Response@144f47b,status:401, reqId:uwcAAKdVRC2bnUoV, xlog:UP/401, xvia:
  10. android 点击事件失效,安卓手机微信自带浏览器点击事件失效解决