深入分析类与对象

1,成员属性封装

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

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

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

 class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+this.name+",年龄:"+this.age);
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person();//声明对象
person1.name="张三";
person1.age=18;
person1.tell();
}
}

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

 class Person{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+this.name+",年龄:"+this.age);
}
}

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

 class Person{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void tell(){
System.out.println("姓名:"+this.name+",年龄:"+this.age);
}
}

·范例:实现方法

 public class Main {
public static void main(String[] args) {
Person person1 = new Person();//声明对象
person1.setName("张三");
person1.setAge(-18);
person1.tell();
}
}

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

2,构造方法与匿名对象

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

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

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

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

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

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

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

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

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

·范例:构造方法

 class Person{
private String name;
private int age;
public Person() {//无参构造
}
public Person(String name, int age) {//有参构造
this.name = name;
this.age = age;
} }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

·范例:构造方法重载

 class Person {
private String name;
private int age;
public Person(){//无参构造
}
public Person(String name){//1参构造
super();
this.name=name;
}
public Person(String name,int age){//2参构造
this.name=name;
this.age=age;
}
public void tell(){
System.out.println("姓名:"+this.name+",年龄:"+this.age);
}
}

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

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

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

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

·范例:观察匿名对象

 public class Main {
public static void main(String[] args) {
new Person("万雨",25).tell();//匿名对象,没有引用名称!!!
}
}
 class Message{
private String title;
public Message(){}
public Message(String title){
this.title=title;
} public void setTitle(String title) {//数据修改
this.title = title;
} public String getTitle() {//数据获取
return this.title;
}
} class Person{
private String name;
private int age;
public Person(){}
public Person(String name){
this.name=name;
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
public Person(Message msg,int age){//方法重载,构造方法也是方法
this.name=msg.getTitle();
this.age=age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public Message getInfo(){
return new Message(this.name+":"+this.age);
}
public void tell(){
System.out.println("【姓名】"+this.name+"【年龄】"+this.age);
}
}
public class Main {
public static void main(String[] args) {
Message msg=new Message("Mufasa");
Person person=new Person(msg,25);//声明对象、实例化对象
msg=person.getInfo();
System.out.println(msg.getTitle());
}
}

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

Java深入分析类与对象的更多相关文章

  1. 第31节:Java基础-类与对象

    前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载 ...

  2. Java面向对象-类与对象

    Java面向对象-类与对象 类与对象的关系 我们通俗的举个例子,比如人类是一种类,张三这个人就是人类的具体的一个个体,也就是java中的对象:这就是一个类与对象的关系: 类的定义 下面看实例 类的创建 ...

  3. 关于Java构造类与对象的思考

    简单记录一下Java构造类与对象时的流程以及this和super对于特殊例子的分析. 首先,接着昨天的问题,我做出了几个变形: Pic1.原版: Pic2.去掉了T.foo方法中的this关键字: P ...

  4. JAVA基础——类和对象

    java类与对象学习笔记 一.成员变量和局部变量 (1)定义 1.成员变量 在类中定义,用来描述对象将要有什么.(默认的成员变量值为0) 2.局部变量 在类的方法中定义,在方法中临时保存数据. 演示示 ...

  5. java(9)类和对象

    一.理解什么是类和对象 万事万物皆对象 1.1.属性——对象具有的特征(特点) 1.2.方法——对象可执行的操作(能干什么事) 1.3.对象的定义: 是一个客观存在的,看的见或摸得着的实体,由属性和方 ...

  6. Java面向对象——类,对象和方法

    1.类的概念 在生活中,说到类,可以联想到类别,同类,会想到一类人,一类事物等等.而这一类人或事物都是具有相同特征或特点和行为的,我们根据不同的特征或特点和行为将他们归类或分类.同时,当我们认识一个新 ...

  7. Java学习——类与对象

    在学习面向对象之前首先我们要理解一下几点: 什么是面向对象 对象的概念 类 类与对象的关系/区别 什么是对象的属性 什么是对象的方法 什么是面向对象.对象.类 讲到面向对象就不得提到面向过程,早期的计 ...

  8. Java面向对象类与对象整理

    第一章           面向对象: 1.1         什么是面向过程: 遇到某件事的时候,思考 “我该怎么做”然后一步一步实现的过程 1.2         什么是面向对象: 遇到某件事的时 ...

  9. java笔记 -- 类与对象

    封装: 从形式上看, 封装是将数据和行为组合在一个包中, 并对对象的使用者隐藏了数据的实现方式. 对象中的数据称为实例域, 操纵数据的过程称为方法. 对于每个特定的类实例(对象)都有一组特定的实例域值 ...

随机推荐

  1. Leetcode题目121.买卖股票的最佳时机(简单)

    题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出 ...

  2. CISCO实验记录五:静态路由与RIP动态路由

    一.实验要求 1.创建设备间静态路由 2.检查三层连通性 3.清空路由,使用RIP创建动态路由 4.检查路由表 二.实验操作 1.创建设备静态路由 #iip route 192.168.1.0 255 ...

  3. 【零基础】Selenium:Webdriver图文入门教程java篇(附相关包下载)

    一.selenium2.0简述 与一般的浏览器测试框架(爬虫框架)不同,Selenium2.0实际上由两个部分组成Selenium+webdriver,Selenium负责用户指令的解释(code), ...

  4. ubuntu 安装eclipse for c++

    linux的GUI和windos比起来实在逊色,虽然它的终端模式(命令行模式)非常强大.linux发行版ubuntu的GUI相对其他版本要华丽一些,所以最近由redhat转向ubuntu进行linux ...

  5. Ajax传递复杂对象报415

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  6. Mac配置jdk以及maven

    一 Mac配置JDK和Maven 1.安装成功jdk后 2.打开终端后,输入vim ~/.bash_profile 3.输入: export MAVEN_HOME=/usr/local/maven/a ...

  7. Android : 供应商原生开发套件 (VNDK)

    一.VNDK概述 VNDK(Vendor Native Development Kit)是一组专门用于vendor实现其HAL的lib库,因为自Android 8.0以来,Google引入了Trebl ...

  8. grivaty,margin和padding的区别

    layout_margn是指组件距离父窗体的距离, padding是指组件中的内容距离组件边缘的距离 Layout_grivaty与grivaty的区别 layout_grivaty是指组件相对父窗体 ...

  9. 让 Nginx 支持 WAF 防护功能实战

    ngx_lua_waf 安装说明文档 作者github地址: https://github.com/loveshell/ngx_lua_waf ———————————————————————————— ...

  10. python之NLP数据清洗

    1.知识点 """ 安装模块:bs4 nltk gensim nltk:处理英文 1.安装 2.nltk.download() 下载相应的模块 英文数据处理: 1.去掉h ...