1 java类、构造函数、代码块、this、static关键字

java类部分(总结个人认为的重点)


类小结

成员变量与局部变量的区别:
    1. 自定义的位置区别:
        1. 成员变量是定义在方法之外,类之内的变量。 
        2. 局部变量是声明在方法之内的变量。
    2. 作用上的区别: 
            1. 成员变量的作用描述一类事物的属性。
            2. 局部变量的作用是提供一个变量给方法内部使用的。
    3. 生命周期的区别;
            1. 成员变量随着对象的创建而存在,随着对象的消失而消失。
            2. 局部变量是调用到了对应的方法执行 到了创建该变量的语句时存在,一旦出了自己的作用域马上从内存中消失。
    4. 初始值的区别:
            1. 成员变量是有默认的初始值的。
            2. 局部变量是没有默认的初始值的,必须要先初始化才能使用。


匿名对象: 没有引用类型变量指向的对象就称作为匿名对象。

匿名对象要注意的细节:
        1. 一般不会给匿名对象的属性赋值,因为永远都没法获取到。
        2. 两个匿名对象永远都不可能是同一个对象。

匿名对象好处:简化书写。


匿名对象的应用场景:
    1. 如果调用一个对象的方法一次时,然后这个对象就不再使用,那么这时候可以使用匿名对象。
    2. 可以作为实参调用一个函数。

构造函数

  1. 构造函数
    如果自己没写构造函数,java会提供默认的构造函数,这个默认构造函数是java编译的时候加上去的。
    证据:反编译class文件 jdk提供了反编译工具:javap.exe工具

    用法: javap
    例如:javap -l -p -c 类名
    其中, 可能的选项包括:
    -help –help -? 输出此用法消息
    -version 版本信息
    -v -verbose 输出附加信息
    -l 输出行号和本地变量表
    -public 仅显示公共类和成员
    -protected 显示受保护的/公共类和成员
    -package 显示程序包/受保护的/公共类
    和成员 (默认)
    -p -private 显示所有类和成员
    -c 对代码进行反汇编
    -s 输出内部类型签名
    -sysinfo 显示正在处理的类的
    系统信息 (路径, 大小, 日期, MD5 散列)
    -constants 显示最终常量
    -classpath 指定查找用户类文件的位置
    -cp 指定查找用户类文件的位置
    -bootclasspath 覆盖引导类文件的位置

  2. 注意
    构造函数要注意的细节:

    1. 构造函数是没有返回值类型的。
    2. 构造函数的函数名必须要与类名一致。
    3. 构造函数并不是由我们手动调用的,而是在创建对应的对象时,jvm就会主动调用到对应的构造函数。
      4. 如果一个类没有显式的写上一个构造方法时,那么java编译器会为该类添加一个无参的构造函数的。
      5. 如果一个类已经显式的写上一个构造方法时,那么java编译器则 不会再为该类添加一个无参的构造方法。
    4. 构造函数是 可以在一个类中以函数重载 的形式存在多个 的。

    疑问: java编译器添加 的无参构造方法的权限修26饰符是 什么?与类的权限修饰是一致的。


代码块

  1. 代码块 代码块的类别:
    1. 构造代码块。
    2. 局部代码块. 大括号位于方法之内。 作用:缩短局部变量的生命周期,节省一点点内存。
    3. 静态代码块 static

  2. 构造 代码块要注意的事项:
    1. java编译器编译一个java源文件的时候,会把成员变量的声明语句提前至一个类的最前端。
    2. 成员变量的初始化工作其实都在在构造函数中执行的。
    3. 一旦经过java编译器编译后,那么构造代码块的代码块就会被移动构造函数中执行,是在构造函数之前执行的,构造函数的中代码是最后执行的。
    4. 成员变量的显示初始化与构造代码块 的代码是按照当前代码的顺序执行的。


this关键字

方法栈:为方法开辟的栈空间

  1. 问题:存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(java 采取的是就近原则的机制访问的。)。
    this关键字:
    this关键字代表了所属函数的调用者对象。 this关键字作用:
    1. 如果存在同名成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据。
    2. 在一个构造函数中可以调用另外一个构造函数初始化对象。

    this关键字调用其他的构造函数要注意的事项:
    1. this关键字调用其他的构造函数时,this关键字必须要位于构造函数中的第一个语句(例如:this(name);不能放在构造函数其他语句后面)。
    2. this关键字在构造函数中不能出现相互调用 的情况,因为是一个死循环。

    this关键字要注意事项:
    1. 存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(java 采取的是“就近原则”的机制访问的。)
    2. 如果在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么java编译器会在该变量的 前面添加this关键字。


Static关键字

  1. static修饰成员变量 :如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰。
    静态成员变量的访问方式:
    方式1: 可以使用对象进行访问。 格式: 对象.变量名。
    方式二: 可以使用类名进行访问。 格式: 类名.变量名;

    注意:
    1. 非静态的成员变量只能使用对象进行访问,不能使用类名进行访问。
    2. 千万不要为了方便访问数据而使用static修饰成员变量,只有成员变量的数据是真正需要被共享的时候才使用static修饰。
    静态的成员变量只会在数据共享区中维护一份,而非静态成员变量的数据会在每个对象中都维护一份的。
    注意:对某个对象的静态成员改变,会改变所有对象的静态成员变量,所以静态成员变量一般设置为private

  2. static使用案例:
    统计对象创建次数

    /*
    统计对象被创建的次数,注意最好放在构造代码块里面,而不是构造函数里面(因为构造函数有好几个)
    */
    class Emp{
    
        //非静态的成员变量。
        static  int count = 0;  //计数器
    
        String name;
    
        //构造代码块
        {
            count++;
        }
    
        public Emp(String name){
            this.name = name;
    
        }
    
        public Emp(){  //每创建一个对象的时候都会执行这里 的代码
    
        }
    
        public void showCount(){
            System.out.println("创建了"+ count+"个对象");
        }
    }
    
    class Demo11 
    {
        public static void main(String[] args) 
        {
            Emp e1 = new Emp();
            Emp e2 = new Emp();
            Emp e3 =new Emp();
            e3.showCount();
        }
    }
    
  3. 静态方法(static方法)
    静态的成员变量与非静态的成员变量的区别:

    1. 作用上的区别:
      1. 静态的成员变量的作用共享一个数据给所有的对象使用。
      2. 非静态的成员变量的作用是描述一类事物的公共属性。
    2. 数量与存储位置上的区别:
      1. 静态成员变量是存储方法区内存中,而且只会存在一份数据
      2. 非静态的成员变量是存储在堆内存中,有n个对象就有n份数据。
    3. 生命周期的区别:
      1. 静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失。
        2.非静态的成员数据是随着对象的创建而存在,随着 对象被垃圾回收器回收而消失。

    静态函数要注意的事项:

    1. 静态函数是可以调用类名或者对象进行调用的,而非静态函数只能使用对象进行调用。
    2. 静态的函数可以直接访问静态的成员,但是不能直接访问非静态的成员。
      原因:静态函数是可以使用类名直接调用的,这时候可能还没有存在对象,
      而非静态的 成员数据是随着对象 的存在而存在的。
    3. 非静态的函数是可以直接访问静态与非静态的成员(注意直接两个字,因为静态函数里面可以定义一个对象)。
      原因:非静态函数只能由对象调用,当对象存在的时候,静态数据老早就已经存在了,而非静态
      数据也随着对象的创建而存在了。
    4. 静态函数不能出现this或者super关键字。
      原因:因为静态的函数是可以使用类名调用的,一旦使用类名调用这时候不存在对象,而this
      关键字是代表了一个函数 的调用者对象,这时候产生了冲突。
      静态的数据的生命周期:静态的成员变量数据是优先于对象存在的。

    懒惰加载:类文件使用到,虚拟机才加载加载

    静态代码块是在加载类文件的时候执行的

    这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值