研究生一枚,为后端实习和未来工作打基础。无意间发现韩顺平老师的课程,细心细致,讲课和吴恩达老师一样,都是保姆式讲解,各种基础知识都会补充,爱了。 韩顺平老师课程地址:https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0 阅读提醒:本笔试适合有编程语言基础的伙伴阅读,因为本兔兔是本专业的,有c、c++、python 、sql基础,笔记中特别的基础的内容就没有记录。完全零基础的小伙伴建议跟着韩老师的课程自己记录。
1、需求 1.1用以前的技术 设置 Child类,设置计数变量count。 缺点
2、介绍 2.1 类变量和类方法,前边必须有static修饰,因此也叫静态变量、静态方法。 他们会被 同一类的 所有的 对象实例 所共享,在类加载的时候就生成了,即使没有创建任何对象实例也可以访问 2.2 定义 访问修饰符的权限范围 同普通变量的一样 访问修饰符 static 数据类型 变量名; //这个更好 static 访问修饰符 数据类型 变量名; 访问修饰符 static 数据返回类型 方法名(){}; //这个更好 static 访问修饰符 数据返回类型 方法名(){}; 2.3 访问 类名.类变量名;//更推荐 对象名.类变量名; 类名.类方法;//更推荐 对象名.类方法;
static
他们会被 同一类的 所有的 对象实例 所共享,在类加载的时候就生成了,即使没有创建任何对象实例也可以访问
访问修饰符 static 数据类型 变量名; //这个更好 static 访问修饰符 数据类型 变量名; 访问修饰符 static 数据返回类型 方法名(){}; //这个更好 static 访问修饰符 数据返回类型 方法名(){};
类名.类变量名;//更推荐 对象名.类变量名; 类名.类方法;//更推荐 对象名.类方法;
3、 类变量 3.1 内存分析 后边补充的蓝线,是即使不创建对象可以访问类变量的原因哦 图片细节: 静态变量在内存中存放的位置有两种说法 一个是堆中该类对应的class对象的最后 一个是方法区的静态域 根据JDK的版本不同而不同.jdk8以前在方法区,jdk8开始在堆 3.2类变量使用细节 特别强调,类变量(静态变量)是绝对不可以在构造器中的!为啥?因为所有static的东西都在类第一次加载的时候完成,且只加载一次。而构造器是创建对象的时候使用的,和static的东西不是一个阶段
后边补充的蓝线,是即使不创建对象可以访问类变量的原因哦
图片细节:
一个是堆中该类对应的class对象的最后 一个是方法区的静态域 根据JDK的版本不同而不同.jdk8以前在方法区,jdk8开始在堆
堆中该类对应的class对象的最后
方法区的静态域
特别强调,类变量(静态变量)是绝对不可以在构造器中的!为啥?因为所有static的东西都在类第一次加载的时候完成,且只加载一次。而构造器是创建对象的时候使用的,和static的东西不是一个阶段
4、 类方法的使用场景:希望不创建实例对象也可以使用的一些方法,经常当做工具来使用的话,开发成static很合适。如Math.max()、Arrays.sort() 使用细节 特别的,如果非要在静态方法中使用 非静态 成员,那么只能在静态方法中,创建本类的对象,通过对象调用 非静态 成员。
类方法的使用场景:
特别的,如果非要在静态方法中使用 非静态 成员,那么只能在静态方法中,创建本类的对象,通过对象调用 非静态 成员。
static方法
第5点举例
运行时
代码块的好处:
代码块的用法:
1、普通代码块 优先于构造方法被执行,无论使用哪个构造器都会首先执行代码块的内容。 每次创建对象,也会被调用 创建子类对象实例,父类的普通代码块也会被加载。父类先做 普通代码块的用法举例:上图中两个构造器包含相同的语句上图,把重复的语句提炼出来放入代码块,完美!
子类
普通代码块的用法举例:
2、static代码块 作用是对类进行初始化,随着类的加载而执行,并且只会执行一次。 2.1类什么时候被加载(静态代码块什么时候执行) 第一次创建某类的对象实例时new(一个类,在第一次new时才执行静态代码块,以后再新建对象便不再执行静态代码块)) 创建子类对象实例,父类也会被加载 使用类的静态成员时(静态代码块特有的) 特别注意,使用子类的静态方法,也会调用父类的静态代码块
对类进行初始化
随着类的加载而执行
只会执行一次
第一次创建某类的对象实例时new(一个类,在第一次new时才执行静态代码块,以后再新建对象便不再执行静态代码块))
new
创建子类对象实例,父类也会被加载
使用类的静态成员时(静态代码块特有的) 特别注意,使用子类的静态方法,也会调用父类的静态代码块
静态成员
小结
static代码块随着类的加载而被调用。
只能直接调用静态成员变量、静态成员方法。
普通代码块随着 构造器的使用 而调用。什么操作会调用构造器,同时就会执行普通代码块。
所以构造器中,最前边隐含了 ① super() ② 调用本类普通代码块和本类普通属性初始化。(按照代码位置的顺序)
3、一些需要牢记的执行顺序重要 注:同一优先级的由定义的位置决定执行顺序 3.1 本类中 代码块、属性、构造器的优先级 静态属性 = 静态代码块 > 普通属性 = 普通代码块 > 构造器 3.1 父类和子类的构造器、普通代码块的执行顺序是: 父类普通代码块 > 父类构造器 > 子类普通代码块 > 子类构造器 3.3 继承关系中 代码块、成员变量、构造器的优先级重要 父类 静态属性 = 父类 静态代码块 > 子类 静态属性 = 子类 静态代码块 > 父类 普通属性初始化 = 父类 普通代码块 > 父类 构造器 > 子类 普通属性初始化 = 子类 普通代码块 > 子类 构造器
重要
注:同一优先级的由定义的位置决定执行顺序
代码块、属性、构造器
=
构造器、普通代码块
总的来说呢。就是 :
静态高于一切(因为首先进行父类子类的 类加载,类加载的时候静态信息随之创建) 普通遵循“父高子低”,大于构造器 但普通总会带着构造器这个"小兄弟",没有普通时构造器“占山为王”
1、整个软件系统中,某个类只能存在一个对象实例,且该类只提供一个取得其对象实例的方法。 2、单例模式有两种方法:1)饿汉式 2)懒汉式
在类加载时,实例就已经创建好了。 缺点如果在程序中没有使用甚至很少使用,显然会造成资源的浪费。因为一般使用单例模式的对象都是重量级的哦。 优点不存在线程安全问题 举例java.lang.Runtime
缺点如果在程序中没有使用甚至很少使用,显然会造成资源的浪费。因为一般使用单例模式的对象都是重量级的哦。 优点不存在线程安全问题 举例java.lang.Runtime
缺点
优点
举例
当用户第一次使用静态方法getInstance的时候,才会创建Cat实例,后续再使用getInstance只会返回之前创建过的实例对象。 缺点存在线程安全问题 优点不会有资源浪费的现象
缺点存在线程安全问题 优点不会有资源浪费的现象
使用场景:主要就是两类:不希望被继承的类、不希望被修改的各种值和方法 这里注意哦方法的参数列表里的参数也可以定义为final(见下图)
主要就是两类:不希望被继承的类、不希望被修改的各种值和方法
这里注意哦方法的参数列表里的参数也可以定义为final(见下图)
使用细节 1、final修饰的属性就是 常量 ,命名方式是XX_XX_XXX 2、final修饰的属性必须赋初值,赋初值的地方有三种: 如果既有final修饰又有static修饰,那么还是遵循static高于一切,这个成员变量就不能在构造器中、普通代码块中使用。可以在static代码块中赋值 3、4、5、6 7、已知静态变量(类变量),每次被调用都会造成类重新加载。那么java的底层实现了,final static一起修饰一个类变量,那么使用它时就不会造成类加载 8、
常量
如果既有final修饰又有static修饰,那么还是遵循static高于一切,这个成员变量就不能在构造器中、普通代码块中使用。可以在static代码块中赋值
final static一起修饰
不会造成类加载