Android温习之路Day7:java基础7

来源:互联网 发布:淘宝上300的狗能买吗 编辑:程序博客网 时间:2024/05/21 14:03

之前讲过了类与对象还有封装等知识,不懂得伙伴可以再去温习一下这片文章:
http://blog.csdn.net/xiaoyu940601/article/details/52685987
今天呢咱们来说一下几个关键字this、static这两个关键字,这两个关键字是比较常用的所以呢以后会经常和这两个关键字打交道,咱们先来说一下this,this 代表的就是一个对象,哪个对象调用了this所在的函数,那么他就代表了哪个对象,this就是当前对象的引用,局部变量当中的name就赋值给他所传入的this所对应的name。
this的表现形式之一:当局部变量和成员变量同名时,可以用this进行区分。类中的成员(成员函数,成员变量)都能够被对象所调用
类中的方法有两种调用方式:
*1.用对象调用
*2.用类名调用
this的表现形式之二:构造函数之间的调用时,可以用this关键字,后面跟上小括号,写入制定的实参内容
说完了this,再来说一下static 这个关键字。
想要对对象中相同的数据,进行数据的共享,就可以对该变量进行修饰,修饰符使用static
方法区存放什么呢?
* 所有对象都能共享的内容的。方法区又命名为:共享数据区。
static关键字
* 1.被static修饰的成员变量,能够被所有的对象所共享。
* 2.静态随着类的加载而加载,随着类的结束而结束。
* 3.优先于对象而存在。
* 4.静态成员可以直接被类名所调用

  • 静态数据:(共享数据)共有的,每个对象都是统一的数据,那么就用static修饰,然后存储到方法区中。
  • 特有数据:存储在对象当中的数据。
    接下来说一下static使用时需要注意的几点:
    [注意事项]
    1.静态方法只能调用静态成员,不能调用非静态成员,非静态方法可以调用静态成员,也可以调用非静态成员的。
  • 原因:如果在静态方法中,放入了非静态变量,那么这个非静态变量对应的数值,就要有对象,而静态是优先于对象而存在的, 所有静态方法中没有对象,也就没法使用非静态变量。
    2.静态方法中不允许出现this,super关键字。
  • 原因:this就代表了对象,当静态方法执行时,还没有对象呢。
    所以静态是有访问局限性的,只能访问静态的内容。
    下面再来说一下静态变量和非静态变量的区别:
    [静态变量和非静态变量的区别]
  • 1.非静态变量又被称为实例变量,而静态变量被称为类变量
  • 2.非静态成员变量是随着对象的创建而存在,随着对象的消失而消失。
  • 静态变量随着类的加载而加载,随着类的结束而消失。
  • 3.非静态成员变量是存在于堆内存当中的。
  • 静态变量是存在与方法区当中的。
  • 4.非静态成员变量只能被对象调用。
  • 静态变量可以被类名调用,也可以被对象调用。
    了解了以上的知识,那static到底什么时候用呢?
    *静态变量是在方法区当中,不是在堆内存当中。
    1.成员变量是否需要被static修饰?
  • 成员变量的值如果每个对象都相同。 是,用static修饰,被所有对象所共享。
  • 反之不是,不用static修饰,存储到每个对象对应的内存中。

  • 2.成员函数是否被static修饰。
  • 当函数中访问到了对象特有的属性时,那这个函数就不能被static修饰。
  • 如果函数中没有访问到对象特有的属性时,那这个函数就可以被static修饰。简单来说:如果函数中访问到了实例变量,那就不能静态修饰,反之可以。
  • 如果一个类中定义的所有方法都是静态的,可以么?
    可以,这个类普遍称之为工具类。

    工具类(静态代码块)的特点:
    1.随着类的加载而运行,而且只执行一次
    2.优先于主函数执行
    在后面的会经常用到工具类的。
    最后呢咱们来说一下包,什么?包,LV?不是了,是eclipse的包,也就是package,包产生的原因:为了管理大型软件系统包含的数量过多的类,为了避免类名冲突,java引入了包的概念,同样呢package也是关键字,是用于声明包的,必须卸载java源文件的第一行
    package语句中的“.”用于指定目录的层次包对应的文件夹的目录层次结构
    【声明包】:package com.cxy.homework;
    【导入包】:import 语句可以导入包
    import java.utils.Scanner;
    原因:为了使用定义在不同包中的java类,需要用import语句来导入包
    语法格式:
    import[包名].[]…..[类名]
    导入包中的所有类
    import 包名.*;
    在同一个保重的类是可以直接调用的,无须他能够过import语句来导入,同时呢建议大家写代码都放在自定义保重,不要放在默认的包中,否则无法访问到这个类。
    讲了这么多,最后给大家看两张图。进一步的理解一下类这个东西。不废话,直接上图:
    下图是构造函数的内存分析图:
    下图是构造函数的内存分析图
    下图是多个构造函数去初始化同一个对象的分析图:
    下图多个构造函数,去初始化同一个对象的分析图
    之前貌似没有说过构造函数这个名词,在这里呢顺便补充一下吧。
    构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
    构造函数有以下特点:
    1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;
    2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;
    3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
    4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;
    5.构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放(c++)
    6.当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。
    今天就到这里吧,晚安!明天开始呢会每天在博客顶部给大家插一条正能量。

1 0