目录
关键知识点和补充
- this有俩种用法,第一种:调用本类的构造器,必须放在第一行使用,第二种:this总指向调用方法的对象,可以避免重名,其实在所有的方法中,都会默认传递一个this,所以所有的对象的属性其实都是this.属性,但是this都省略了!
- 不能用this关键字进行构造器之间的相互调用(会成一个死循环)
- 静态的是属于类的,成员属于对象的,好好品味
- 类的所有对象公用类中静态的内容,静态的内容是独一份的,在类第一次加载就初始化
- 被final修饰的 变量为常量 注意基本数据类型不可以更改,引用类型是地址不可修改,值可以修改, 方法 不可以被继承,也就更别说重写了! 类 为 太监类 ,也就是说不可以被继承
- block代码块注意几点:
- 一般:静态代码块>main方法>{}>构造器 !!!!有特殊!!!
- static{}和main方法的优先级是看谁被加载,当main方法的类有static{}则先执行静态代码块,反之必定执行main
- static{}代码块是当类在被加载的时候只被初始化一次,
- 注意!!虽然在new一个对象的时候{}优先于构造器,但是他是将其放在构造器里面去执行的,所以会有种this必须放在第一行的情况,看例题的运行结果!
- 私有是封装,但是封装不只是私有!!!!
- System.gc()程序员可以通知他运行,但是是否回收怎么回收无权干涉
- 一定会被垃圾回收机制清理的是(GC回收的都是堆中new出来的对象): 1.匿名类 2.对象无引用状态
- 匿名类是没有名字的对象,匿名对象只能在当前行使用一次!
- 对象无引用状态指的是
- import 关键字 标识当前所使用的这个类的位置
1 . 这个包下的所有的类,如果有使用都可以引用
会降低编译效率,不会降低运行效率
2 . 静态导入: 只导入静态的内容
3 . 如果不使用import可以在使用的位置指明类的位置,包名+类名
注意:不要与jdk的 包名,类名出现相同情况,不然会出现java中帮你定义的类无法使用 - 权限修饰符: 都只能修饰成员,不能修饰局部 成员是在创建对象的时候才产生,局部变量在调用方法时候才会产生,方法结束时局部变量结束
- 能够修饰类的只有 default|public
- protected:1.同包类,本类中直接使用 2.不同同包下的子类,必须通过继承关系才能使用
this关键字
* this指代当前new的对象
*
* this使用在构造器中,调用本类中的其他构造器
* this(参数列表)
* 必须在构造器的第一行使用
*
* this使用在成员方法中|构造器中,区分同名变量问题(局部和成员同名问题)
* this指代当前对象|当前调用方法的对象
* 如果出现同名的成员和局部变量的问题,如果想要指代成员,必须使用this
* 如果没有出现同名问题,只有成员变量,相当于省略的this
*
* 注意:
* 1.不能使用this关键字进行构造器之间的相互调用
* 2.this和static不能同时使用
静态的 static
* static修饰变量: 静态变量|类变量
* 只能修饰成员,不能修饰局部,static是成员修饰符
*
* static修饰方法: 静态方法|类方法
*
* 使用方式:
* 1.类名.属性名|方法名();
* 2.对象.属性名|方法名();
*
* 静态的是属于类的,成员属于对象的
* 类的所有对象公用类中静态的内容
* 静态的内容是独一份的,在类第一次加载就初始化
* 在静态的内容中,可以直接使用静态的内容,不能直接使用非静态的内容,可以跟随对象使用
* 在非静态的内容中,可以直接使用静态的内容,可以直接使用非静态的内容
final 最终的
* 1.被final修饰的变量为常量
* 变量的数据类型如果是基本数据类型: 存储的数据值不能改变
* 变量的数据类型如果是引用数据类型: 存储对象的地址不能改变,但是对象内存中的属性值可以改变
* 2.被final修饰的方法不能被重写
* 3.被final修饰的类不能被继承(太监类)
block 块 {}
* {} 定义在方法中-->局部代码块|普通语句块 执行时机:方法调用时
* {} 定义在类中方法外 --> 构造块 执行时机:创建对象的时候
* static{} 定义在类中方法外--> 静态块 执行时机: 类第一次加载时
*
* {} 就是一个作用域
* 构造块中代码先于构造器代码执行,如果有多个构造块,从上倒下以此执行
* static只执行一次,在类第一次加载后执行,如果存在多个静态块,从上到下依次执行
* 顺序(大体,有特殊的看第一大部分的补充):
* static main 构造块 构造器
封装
* 安全隐患-->介绍一个关键字 private 私有的
* private 修饰的内容,只能在当前类|本类中使用
* 需要为私有的字段提供一对公共的访问方式 设置器setter 获取器getter
* 私有的属性需要配合公共的访问方式->方法
*
* 私有的属性并且提供公共的访问方式-->面向对象中封装特性的体现
* 私有是封装
* 不能说封装是私有,封装不仅仅表示为私有
*
* 封装:
* 隐藏内部的实现细节,对外提供公共的访问方式
*
* 优点:
* 提高代码的复用性,安全性
*
* 模板类|javabean|bean...规范:
* 1.修饰类的public
* 2.至少提供一个空构造
* 3.属性私有化
* 4.对外提供公共的访问方式
System.gc()
* System.gc()通知垃圾回收机制回收垃圾,但是是否回收,什么时候回收,程序员无权控制垃圾回收机制,
* 一定会调用finalize方法的情况:
* 1.匿名对象
* 2.对象无引用状态
* finalize() 回收垃圾第一步会调用的方法
类的上面进行导包
* import 关键字 标识当前所使用的这个类的位置
* 1 . 这个包下的所有的类,如果有使用都可以引用
* 会降低编译效率,不会降低运行效率
* 2 . 静态导入: 只导入静态的内容
*
* 3 . 如果不使用import可以在使用的位置指明类的位置,包名+类名
*
* 注意:不要与jdk的 包名,类名出现相同情况,不然会出现java中帮你定义的类无法使用
权限修饰符: 定义对象中内容的可访问范围
* 自己 自己家 私生子(非名正言顺的) 陌生人
* 本类 同包类 不同包子类 不同包其他类
* public Y Y Y Y
* protected Y Y Y
* default(默认) Y Y
* private Y
*
* 以上权限修饰符: 都只能修饰成员,不能修饰局部
* 能够修饰类的只有 default|public
*
* protected:
* 1.同包类,本类中直接使用
* 2.不同同包下的子类,必须通过继承关系才能使用
例题
代码块问题的一个例题:
public class BlockTest02 {
public static int a = 0;
{
a = 10;
System.out.println("2、非静态代码块执行a=" + a); //10
}
static {
a = 6;
System.out.println("1、静态代码块执行a=" + a); //6
}
public BlockTest02() {
this(a); //6 调用其他构造器
System.out.println("5、"+a); //5,10
System.out.println("6、无参构造方法执行a=" + a); //6.10
}
public BlockTest02(int n) {
System.out.println("3、"+n); //3,6
System.out.println("4、"+a);//4,10
}
public static void main(String[] args) {
System.out.println("main"); //main
BlockTest02 tsc = new BlockTest02();
}
}
执行结果:
1、静态代码块执行a=6
main
2、非静态代码块执行a=10
3、6
4、10
5、10
6、无参构造方法执行a=10
注意!!!!!!3.6这个,就是关键知识点和补充的block注意点的第四点,按理说应该是10,但是结果为6,可以通过反编译工具看,反编译工具可以评论区问我要呦.
垃圾回收机制
public class GCDemo01 {
public static void main(String[] args) {
//匿名对象 :没有名字的对象
//只能在当前行使用一次
new GCDemo01().haha();
System.gc(); //通知
System.out.println("123");
/*第二种对象无引用状态,本来a和b指向自己的,
但是a把自己的地址给了b,所以b new出来的对象就没有存在的意义了,所以需要回收
*/
GCDemo01 a = new GCDemo01();
GCDemo01 b = new GCDemo01();
b = a;
}
public void haha(){
System.out.println("哈哈哈哈,最近还是先吃火锅~~~");
}
@Override
protected void finalize() throws Throwable {
System.out.println("over....");
}
}
运行结果:
哈哈哈哈,最近还是先吃火锅~~~
123
over....
导包问题
import static java.lang.Math.PI;
import static java.lang.Math.sqrt;
import java.util.*;
public class ImportDemo06 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Random ran=new Random();
System.out.println(PI);
System.out.println(PI);
System.out.println(sqrt(4));
}
}