java类部分(总结个人认为的重点)
类小结
成员变量与局部变量的区别:
1. 自定义的位置区别:
1. 成员变量是定义在方法之外,类之内的变量。
2. 局部变量是声明在方法之内的变量。
2. 作用上的区别:
1. 成员变量的作用描述一类事物的属性。
2. 局部变量的作用是提供一个变量给方法内部使用的。
3. 生命周期的区别;
1. 成员变量随着对象的创建而存在,随着对象的消失而消失。
2. 局部变量是调用到了对应的方法执行 到了创建该变量的语句时存在,一旦出了自己的作用域马上从内存中消失。
4. 初始值的区别:
1. 成员变量是有默认的初始值的。
2. 局部变量是没有默认的初始值的,必须要先初始化才能使用。
匿名对象: 没有引用类型变量指向的对象就称作为匿名对象。
匿名对象要注意的细节:
1. 一般不会给匿名对象的属性赋值,因为永远都没法获取到。
2. 两个匿名对象永远都不可能是同一个对象。
匿名对象好处:简化书写。
匿名对象的应用场景:
1. 如果调用一个对象的方法一次时,然后这个对象就不再使用,那么这时候可以使用匿名对象。
2. 可以作为实参调用一个函数。
构造函数
构造函数
如果自己没写构造函数,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 覆盖引导类文件的位置注意
构造函数要注意的细节:- 构造函数是没有返回值类型的。
- 构造函数的函数名必须要与类名一致。
- 构造函数并不是由我们手动调用的,而是在创建对应的对象时,jvm就会主动调用到对应的构造函数。
4. 如果一个类没有显式的写上一个构造方法时,那么java编译器会为该类添加一个无参的构造函数的。
5. 如果一个类已经显式的写上一个构造方法时,那么java编译器则 不会再为该类添加一个无参的构造方法。 - 构造函数是 可以在一个类中以函数重载 的形式存在多个 的。
疑问: java编译器添加 的无参构造方法的权限修26饰符是 什么?与类的权限修饰是一致的。
代码块
代码块 代码块的类别:
1. 构造代码块。
2. 局部代码块. 大括号位于方法之内。 作用:缩短局部变量的生命周期,节省一点点内存。
3. 静态代码块 static构造 代码块要注意的事项:
1. java编译器编译一个java源文件的时候,会把成员变量的声明语句提前至一个类的最前端。
2. 成员变量的初始化工作其实都在在构造函数中执行的。
3. 一旦经过java编译器编译后,那么构造代码块的代码块就会被移动构造函数中执行,是在构造函数之前执行的,构造函数的中代码是最后执行的。
4. 成员变量的显示初始化与构造代码块 的代码是按照当前代码的顺序执行的。
this关键字
方法栈:为方法开辟的栈空间
问题:存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(java 采取的是就近原则的机制访问的。)。
this关键字:
this关键字代表了所属函数的调用者对象。 this关键字作用:
1. 如果存在同名成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据。
2. 在一个构造函数中可以调用另外一个构造函数初始化对象。this关键字调用其他的构造函数要注意的事项:
1. this关键字调用其他的构造函数时,this关键字必须要位于构造函数中的第一个语句(例如:this(name);不能放在构造函数其他语句后面)。
2. this关键字在构造函数中不能出现相互调用 的情况,因为是一个死循环。this关键字要注意事项:
1. 存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(java 采取的是“就近原则”的机制访问的。)
2. 如果在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么java编译器会在该变量的 前面添加this关键字。
Static关键字
static修饰成员变量 :如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰。
静态成员变量的访问方式:
方式1: 可以使用对象进行访问。 格式: 对象.变量名。
方式二: 可以使用类名进行访问。 格式: 类名.变量名;注意:
1. 非静态的成员变量只能使用对象进行访问,不能使用类名进行访问。
2. 千万不要为了方便访问数据而使用static修饰成员变量,只有成员变量的数据是真正需要被共享的时候才使用static修饰。
静态的成员变量只会在数据共享区中维护一份,而非静态成员变量的数据会在每个对象中都维护一份的。
注意:对某个对象的静态成员改变,会改变所有对象的静态成员变量,所以静态成员变量一般设置为privatestatic使用案例:
统计对象创建次数/* 统计对象被创建的次数,注意最好放在构造代码块里面,而不是构造函数里面(因为构造函数有好几个) */ 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(); } }
静态方法(static方法)
静态的成员变量与非静态的成员变量的区别:- 作用上的区别:
- 静态的成员变量的作用共享一个数据给所有的对象使用。
- 非静态的成员变量的作用是描述一类事物的公共属性。
- 数量与存储位置上的区别:
- 静态成员变量是存储方法区内存中,而且只会存在一份数据。
- 非静态的成员变量是存储在堆内存中,有n个对象就有n份数据。
- 生命周期的区别:
- 静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失。
2.非静态的成员数据是随着对象的创建而存在,随着 对象被垃圾回收器回收而消失。
- 静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失。
静态函数要注意的事项:
- 静态函数是可以调用类名或者对象进行调用的,而非静态函数只能使用对象进行调用。
- 静态的函数可以直接访问静态的成员,但是不能直接访问非静态的成员。
原因:静态函数是可以使用类名直接调用的,这时候可能还没有存在对象,
而非静态的 成员数据是随着对象 的存在而存在的。 - 非静态的函数是可以直接访问静态与非静态的成员(注意直接两个字,因为静态函数里面可以定义一个对象)。
原因:非静态函数只能由对象调用,当对象存在的时候,静态数据老早就已经存在了,而非静态
数据也随着对象的创建而存在了。 - 静态函数不能出现this或者super关键字。
原因:因为静态的函数是可以使用类名调用的,一旦使用类名调用这时候不存在对象,而this
关键字是代表了一个函数 的调用者对象,这时候产生了冲突。
静态的数据的生命周期:静态的成员变量数据是优先于对象存在的。
懒惰加载:类文件使用到,虚拟机才加载加载
静态代码块是在加载类文件的时候执行的
- 作用上的区别: