🔥博客主页: A_SHOWY
🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_
一、类变量和类方法
1.1 引出类变量
类变量的快速入门:类变量被所有对象实例共享
1.2 类变量内存布局
两种说法,有一点是肯定的,静态变量是被对象共享的,一种说法是在堆里,另一种说法是在静态域(jdk8以前)里面。
两点共识:
- static变量被同一个类的所有对象共享
- static类变量,在类加载的时候就生成
1.3 类变量定义
类变量也叫静态变量/静态属性,是该类所有对象共享的变量
1.4 如何定义类变量
1.5 如何访问类变量
如果static前面变成private,那么另一个就不能访问他了,遵循基础规则
*1.6 类变量使用细节
1.7 类方法基本介绍
形式:只需要普通方法前面加一个static
调用:类名.类方法名或者对象名.类方法名 (满足访问修饰符的权限)
小例子:总学费
1.8 类方法经典使用场景
如果我们不创建实例,也可以掉某个方法,及当作工具来使用! ,这时把方法做成静态方法合适
*1.9 类方法使用细节
4)注释:不能用是因为类变量和类方法随着类的加载而加载,类的加载比对象的创建要早,如果使用this或者super的话,会找不到这个对象
5)静态方法只能访问静态成员
1.10 课堂练习
(1)答案:9,10,11
(2)答案:
1.id++那里错的,类方法中只能访问静态变量和静态方法
2.输出是0和1,注意构造器这里不能是static所以这里没错
(3)答案:
1.在静态方法中不能使用this
2.total的值最后等于4
总结:
- 静态方法只能访问静态成员
- 非静态方法可以访问所有成员
- 编写代码时候仍要遵守访问权限规则
1.11 main方法
注释:
1.一定记住:main方法由虚拟机调用
2.把public去了就直接不能执行了
5.问:你这个字符串数组【String【】 args】形参从哪里传进去的:是在执行这个程序的时候,在后边传进去的参数形成的数组
这就是为什么我们每次访问非静态成员,都要创建个对象 !
1.12 补充:在idea中传递参数给java程序
二、代码块
2.1 基本介绍
2.2 基本语法
2.3 快速入门
代码块的调用要优先于构造器,就比如构造器重载的时候,三个构造器,第一个构造器是一个参数,第二个是两个参数,第三个是三个参数,但是他们的内容都是一样的,这样就不如搞一个代码块放在最前面
2.4 代码块细节
- 代码块前面加一个staitc表示静态代码块,作用就是对类进行初始化,随着类的加载而执行,只会执行一次。如果是普通代码块,每次创建一个对象就执行,每创建一次就执行一次。
- (重要)类什么时候被加载:1)当创建对象实例的时候(new)2)创建子类对象实例的时候,父类也会被加载 (比如说父类中有一个代码块,子类中也有一个,然后创建一个子类对象,他就会先加载一个父类的代码块再加载一个子类代码块) 3)使用类的静态成员时(这个类中的代码块会被加载)
- 注意,如果只使用类的静态成员,普通代码块并不会执行!!!,因为类加载和这个普通代码块没有关系,普通代码块是构造器的补充,普通代码块调用了,他就被调用了
- (重点+难点) 创建对象的时候,在一个类中的调用顺序
- 构造器的最前面其实隐藏了super和调用普通代码块
- (综合带继承)顺序总结:先把静态的走完,剩下的从父类开始各走各的
- 静态代码块只能调用静态成员,普通代码块能调用所有代码块
在new的时候首先要进行类的加载,再进行创建对象 所以类的加载和静态相关的部分全部执行。设计到创建对象的时候就从父类开始了,因为子类隐藏了super()和普通代码块和普通属性的初始化等。参考5,其实综合起来核心就是
2.5 代码块相关题目
题目一:答案:in static block ,total = 100,total = 100(因为类加载以后静态代码块就不再执行了)
题目二(重点题目):答案:
java基础例子讲解
静态成员sam初始化,static块执行,|(该普通成员了),Sam1成员初始化 ,|(该构造器了)Test默认构造函数被调用
三、单例设计模式
3.1 什么是单例模式
单例:就是单个的实例,大概意思是指该类只能有一个对象实例
3.1.1 饿汉式
(因为是私有的,在类内创建,所以在还没有使用到的时候就已经创建好了, 饿汉式可能造成创建了对象没有使用就造成了浪费)
注:私有化的目的是防止直接new一个对象
这里有个很奇妙的点,就是为什么创建的对象和这个提供的公共方法都必须是static因为首先如果方法不是static那么需要先创建类才能调用,但是这个是个私有的,没法创建类,所以必须是static,而静态方法只能用静态成员,所以内部创建的对象也必须static ,形成了完美闭环,非常的神奇。
3.1.2 懒汉式
单例模式的对象通常是重量级的对象,如果你创建了没有用就浪费了。饿汉式可能造成创建了对象但是没有使用的弊端。
代码中判断是否为空的目的,是假如说他再次创建对象肯定就不是空的了,这时候就不需要再重新创建一个对象,直接返回原有Cat对象即可,保存的单例模式的特征。
四、final关键字
4.1 基本介绍
4.2 细节
关于final修饰的静态属性初始化位置: 可以这样理解:因为是static和final,那么在类加载的时候就要创建好相应的属性,所以在构造器的时候修改,就违反了final不可修改的规定 。同时static在类加载的时候就要给值,它等不到你构造器创建对象!
注释5:它都不能被继承了,都没有重写的必要了,一般我们重写都是继承了以后,想要特殊功能
注释7:从下列代码和结果可以看到直接使用类的静态成员导致类加载,但是final能抑制这个类加载,所以不会输出静态代码块!
4.3 练习
4.3.1 练习1
4.3.2 练习2
错误,++x修改了final修饰的值,但是形参加上final是对的
五、抽象类
5.1 抽象类的引出
父类方法的不确定性:当父类的某些方法需要声明,但是又不确定如何实现的时候,可以将其声明为抽象方法,那么这个类就是抽象类 ,一般来说抽象类会被继承,由其子类来实现
5.2 抽象类的细节
- 抽象类不能被实例化
- 抽象类可以没有抽象方法
- 一旦包含了抽象方法,那么这个类必须声明为抽象类
- abstract只能修饰类和方法,但是不能修饰属性和其他的
- 抽象类的本质还是类,所以类内部还是可以拥有任何可以拥有的方法
- 抽象类不能有主体,即不能实现
- 如果一个类继承了抽象类,它必须实现抽象类的所有方法,除非他自己也声明了抽象类//只要有方法体{}就称为实现了
- 抽象方法不能使用private ,final,static修饰,因为这些关键字和重写都是冲突的,private和final好理解,static的话:static修饰的方法是静态方法,其可以直接被类调用。而abstract是修饰的方法是抽象方法,即无代码体的方法,不能被直接调用,需要子类或者实现类去编写完整的方法处理逻辑了才能使用。
5.3 抽象类练习
1)错误,因为final不能被继承,所以你这里抽象了,后边没法实现
2)错误static关键字和方法重写无关,具体看上面的第八条。
3)不行,因为私有的别人不能重写
4)太简单了不写了
5.4 抽象类**实践——模板设计模式
思路1:最容易想到的
发现代码冗余,他们都有公共的代码部分,就是计算开始和结束时间,我们可以分别把这个抽出来,然后去改job但是还是很麻烦
思路2:抽象模板类(抽象类+动态绑定机制)
其实核心思想就是普通方法嵌套抽象方法,这样子只需要改抽象方法就行了
六、接口
6.1 快速入门
这里在computer类中其实在形参部分有一个向上转型的思想,父类的引用指向子类的对象
6.2 基本介绍
demo:
如果一个类 implements实现接口,需要将接口的所有抽象方法全部都实现 !
6.3 应用场景
核心就是统一管理
这里其实又用到了向上转型,这里用个static就是为了不创建对象了简单测试一下
6.4 注意事项和使用细节
1.接口不能实例化,接口的作用是让别的类去实现它,再用实现它的类去实例化
2.接口中所有的方法是public方法,接口抽象方法中可以不用 abstract修饰
3.一个普通类实现接口就必须把该接口的所有接口都实现,可以使用alt+enter解决
4.抽象类实现接口,可以不用实现接口的方法
5.一个类可以同时实现多个接口
6.接口中的属性,其实都是public static final 的,比如int a = 1;其实就是public static final int a = 1;(必须初始化)
7.接口中属性的访问形式:接口名.属性名
8.一个接口不能继承其他的类,但是能继承多个其他接口
9.接口的修饰符只能是public和默认
6.5 接口练习
这三个都完全正确,static属性可以被直接使用,在这里有点像继承,这里要注意当final修饰类的时候才说明不能被继承
6.6 接口和继承类的比较
简单理解:实现机制对我们单继承机制的补充 ,就比如小猴子继承了老猴子的东西,但是想学飞行或者游泳需要实现小鸟的飞行和小鱼的游泳
6.7 接口的多态特性
1.其实就是向上转型:父类的引用指向子类的对象
2. 多态数组
用到了判断运行类型instanceof + 向下转型去调用特有方法
3.接口存在多态传递的现象
6.8 接口课堂练习
第一句话接口里面的等价于 public static final int x = 0;
pX函数父类是B,接口是A,这个x不明确是谁,以下方式可以解决
总结:
七、内部类
7.1 基本介绍
补:类的五大成员
属性、方法、构造器、代码块、内部类
7.2 内部类的分类
7.3 局部内部类
说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名
7.4 匿名内部类(最重要)
说明:匿名内部类是定义在外部类的局部位置,比如方法中并且没有类名
1) 本质是类 2)内部类 3)该类没有名字 4)同时还是一个对象
我的理解是就是这个匿名内部类起到一个简化作用,在做一个基于接口或者基于别的类的时候,只想用一次,每次调用接口都要创建一个新的类,那你创建一个匿名内部类省略了创建类的步骤 ,简化开发。这个匿名内部类用一次就没有了,你再new就不行了就是这个Outer04,但是返回的实例那个对象可以反复使用
demo1基于接口的匿名内部类
demo2基于类的匿名内部类
7.5 匿名内部类实践(使用场景)
demo1 用作实参直接传递
demo2 上一个demo的实例(自己能做出来牛逼)
7.6 成员内部类
说明:成员内部类是定义在外部类的成员位置,并且没有static修饰
1.需要成员内部类定义在外部内的成员的位置上
2.可以添加任意的访问修饰符,因为他本身就是一个成员(public,protected等)
第六点比较重要,外部其他类去使用成员内部类,主要有两种方法
7.如果外部类和内部类的成员重名了,内部类访问的话,默认遵循就近原则,如果想访问外部类的成员可以使用外部类名.this.成员去访问,和前面那个局部内部类是一样的
7.7 静态内部类
说明:静态内部类是定义在外部类的成员位置,并且有static修饰
补:小总结
7.8 习题1
判断输出结果
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/2522.html