1. 如果一个类中没有定义构造函数,会自动加上一个空参的默认构造函数

  如果定义了一个构造函数,默认的空参构造函数就没有了。

2. this

  当成员变量与局部变量重名的时候,可以使用this来区分。this代表当前对象。

  哪个对象调用了this所在的函数,this就代表哪个对象,this只能放在函数里。

Class Person{

  String name;

int age;

  Person(String name)

  {

    name=name;//这样只是把栈中的name赋值给栈中的那么,并不是赋值给堆中的成员变量name,当构造函数Person入栈的时候,同时在栈中

           //创立变量name,当执行name=name的时候,因为栈中有name,就不会去堆中查找name了

    解决办法:

this.name=name;//this.name是指对象的name,即堆内存的name。

  }

}

3. 内存图解

  Class Demo{

    public static void main(String[] args)

    {

      Person p=new Person("zhangsan");

      p.speak();

    }

}

  1.主函数main进栈

  2.执行到Person p的时候,p开始进栈,同时在堆内存创建一个对象Person(假设在堆内存的地址为0x0045),并默认初始化,age=0,name是String类型,初始值为null(注意:此时堆内存已经建立的对象person,并默认初始化了,还没有调用构造函数赋值)

  3.执行Person p=new Person("zhangsan");调用构造函数Person(String name)传值,这时候构造函数入栈,把zhangsan赋值给栈内的变量name传参,构造函数内部有this,即持有该对象的引用,this指向0x0045堆内存地址,用来指向堆内存的当前对象,然后把name的值传递给堆内存的name,即this.name,这样也就通过构造函数对堆内存的对象完成初始化。构造函数结束,构造函数出栈。同时把地址0x0045赋给p,即栈内存的p指向堆内存的地址0x0045.

  4.然后执行p.speak()方法,speak方法进栈,speak方法里也持有this引用,执向0x0045地址。

  5.执行完speak方法,speak方法出栈

5.构造函数调用重载的构造函数可以使用this,只能放在构造函数第一行。因为初始化动作要先执行。

6.this的应用

  public bool compare(Person p)

  {

    if(this.age>p.age)

      return true;

  else

   return false;

  }

7. static 修饰符,用于修饰成员变量,成员函数,(该类对象共享的数据),static修饰的成员,被本类所有对象共享。

static修饰的成员,先于对象之前出现,因为static成员是随着类的加载而加载。可以直接被类名访问,也可以被对象调用。

  static修饰的成员存储在寄存器中,不是存储在栈,堆内存中。

static成员中存储的是对象共享的数据,非static成员是某个对象特有的数据

8. 成员变量与静态变量区别?

1.两个变量的生命周期不同:

  成员变量随着对象的创建而存在,随着对象的被回收而释放

  静态变量随着类的加载而存在,随着类的消失而消失。弊端是生命周期太长。

2.调用方式不同

成员变量只能被对象调用

静态变量可以被类名调用,也可以被对象调用。建议用类名调用。

3.别名不同

成员变量也成为实例变量

  静态变量也成为类变量

4.存储位置不同

成员变量数据存储在堆内存的对象中。所以也叫对象的特有数据

静态变量数据存储在方法区(共享数据区)的静态区中,类中的方法就存储在方法区。

9.static静态使用注意事项:

  1.静态成员只能访问静态成员,不能访问非静态成员,非静态成员即可以访问静态,又可以访问非静态。因为静态方法不依赖对象存在。

  2.静态方法中不能使用this,super关键字,因为静态方法不依赖对象存在。

  3.主函数是静态的 public static void main(String[] args),所以在主函数中不能直接调用非静态方法,非静态必须使用对象来调用。

10。 主函数public static void main(String[] args)解析

   主函数特殊之处:

    1.格式是固定的

    2.被JVM识别和调用

  public:权限必须是最大的。

  static:JVM调用主函数是不需要对象的。

  void:主函数没有具体的返回值,因为是JVM调用的,返回值给JVM也没用。(任何函数结束都必须return,用于结束函数,即使是void,可以不写return,系统也会自动加上。)

  main:不是关键字,只是一个被JVM识别的名字

String[] args:主函数的参数列表,是一个字符串数组类型。

  运行class类的时候可以传值

  如java  Demo   haha  xixi  heihei

  String[] args的值为haha xixi heihei数组长度是3

11. 静态代码块

  static//静态代码块,随着类的加载而执行,所以该代码块只执行一次。

  {

    ..........

  }

静态代码块的作用:用于给类初始化。

那跟构造函数有什么关系:不是所有的类都是通过构造函数初始化的,比如静态类,静态类就没有创建对象,也就不会调用构造函数,此时类初始化可以使用静态代码块。

12. 构造代码块:创建对象的时候都会调用一次,可以给所有的对象进行初始化。所有的对象都会执行代码块代码。

  构造函数:是对对象具有针对性的初始化。

静态代码块:是给类初始化,只执行一次。

  public Person

   {

    Person()//构造函数

    {

    }

    //构造代码块

    {

    }

    //静态代码块

    static

    {

    }

}

  

13. 单例设计模式:一个类在内存中的对象唯一性。比如系统的配置文件,必须只能有一份,此时配置信息类必须设置为单例模式

  如何保证对象的唯一性:

  1.不允许其他程序用new创建该类对象(构造函数私有即可)

  2.在类中创建一个本类实例

  3.对外提供一个方法,让其他程序可以获取该对象。

  步骤:1:构造函数私有

     2:通过new在本类中创建一个本类对象

       3.定义一个公有的方法将创建的对象返回。

   class Single

  {

    static Single s=new Single();

    private Single()

    {

    }

    public static Single getInstance()

    {

      return s;

    }

  } 

  

JAVA-面向对象--封装的更多相关文章

  1. Java面向对象㈠ -- 封装

    Java的面向对象有三大特征:封装.继承.多态.这里主要对封装进行讲解. 封装可以理解为隐藏一个类的成员变量和成员函数,只对外提供需要提供的成员函数. Java的封装主要通过访问权限控制符:priva ...

  2. Java面向对象封装和继承

    面向对象 什么是面向过程.面向对象? 面向过程与面向对象都是我们编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.例如:公司打扫卫生( ...

  3. JAVA面向对象-----封装

    我们日常使用的电脑主机,把cpu.内存.主板等等都封装到机箱里面去.假如没有机箱的话的出现什么问题,主机.主板全部都散落在一处,然后开机没有开机按钮,那么需要我们直接操作接跳线才能把电脑开启.这样子的 ...

  4. Java面向对象----封装概念

    封装 信息隐藏,隐藏对象的细节 访问修饰符 public private protected 默认 属性封装的实现 方法封装的目的(隐藏方法实现细节) package com.tanlei.newer ...

  5. Java面向对象封装优化2_构造方法

    1. 类 package cn.itcast.day06.demo05; /* 一个标准的类通常要拥有下面四个组成部分: 1. 所有的成员变量都要使用private关键字修饰 2. 为每一个成员变量编 ...

  6. 学习练习 java面向对象封装汽车

    package com.hanqi; //汽车 public class Car { // 车牌 private String CheP; // 油箱容量 private double YouXRL ...

  7. java 面向对象 — 封装

      

  8. Java面向对象封装优化1_this(Python中的self)

    1. 类 package cn.itcast.day06.demo03; /* 问题描述:定义Person的年龄时,无法阻止不合理的数值被设置进来. 解决方案:用private关键字将需要保护的成员变 ...

  9. Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js

    Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js 1.1. 封装性是面象对象编程中的三大特性之一  三个基本的特性:封装.继承与多态1 1.2. 魔 ...

  10. java基础1.0::Java面向对象、面向对象封装、抽象类、接口、static、final

    一.前言 一直以来都是拿来主义,向大神学习,从网上找资料,现在就把自己在工作中和学习中的所理解的知识点写出来,好记星不如烂笔头,一来可以作为笔记自己温习,二来也可以给走在求学之路的同学们一点参考意见, ...

随机推荐

  1. hdu和poj的基础dp30道

    题目转自:https://crazyac.wordpress.com/dp%E4%B8%93%E8%BE%91/ 1.hdu 1864 最大报销额 唔,用网上的算法连自己的数据都没过,hdu的数据居然 ...

  2. 移动端Bug管理工具——Bugtags

    Bugtags介绍 产品说明 Bugtags是为改善移动产品质量而专门打造的测试平台产品. 产品功能 SDK集成简单 一行代码极速集成,完全不影响原有程序结构. 所见即所得提交问题 一键截屏,使用标签 ...

  3. ebtables使用的协议

    ebtables的参数中: -p:指明使用的协议类型,ipv4,arp等可选(使用时必选)详情见/etc/ethertypes --ip-proto:IP包的类型,1为ICMP包,6为TCP包,17为 ...

  4. Excel教程(6) - 外部函数

    EUROCONVERT 用途:将数字转换为欧元形式,将数字由欧元形式转换为 欧盟成员国货币形式,或利用欧元作为中间货币将数字由某一 欧盟成员国货币转化为另一欧盟成员国货币的形式(三角转换 关系). 语 ...

  5. POJ 2083 Fractal 分形

    去年校赛团队赛就有一道分形让所有大一新生欲生欲死…… 当时就想学了 结果一直拖到…… 今天上午…… 马上要省选了 才会一点基础分形…… 还是自己不够努力啊…… 分形主要是要找到递归点…… 还有深度…… ...

  6. EnumPrinters用法

    看API描述,不怎么理解,还是在网上找到用法,记载一下: 1: DWORD dwNeeded = 0, dwNum = 0; 2: EnumPrinters(PRINTER_ENUM_LOCAL, N ...

  7. winform/wpf 程序部署

    (1):一些发布方式 ClickOnce是什么玩意儿,这个问题嘛,在21世纪的互联网严重发达的时代,估计也没有必要大费奏章去介绍了,弄不好的话,还有抄袭之嫌.因此,有关ClickOnce的介绍,各位朋 ...

  8. 【笔记】Loadrunner添加OS类型为Windows的服务器(Win7)

    最近在学习Loadrunner,看到“监控Windows资源”,决定小试一把,由于没有找到合适的镜像,暂时没有搞好Windows的虚拟机,so 先用自己小试牛刀了只有,不过这样子好像难度锐减也~只要小 ...

  9. ASP.NET中的Excel操作(OLEDB方式)

    一:OLEDB方式操作Excel的个人理解 就是把要操作的Excel当作一个数据库,所有对Excel的操作,就变成了对“数据库”的操作.那么这时就需要有一个数据库的连接字符串. 代码如下: connS ...

  10. 关于C++中字符的转换

    VS的工程属性中我们常会设置Character Set: