第一节 static静态关键字
1、成员变量的分类和访问分别是什么样的?
静态成员变量(有static修饰,属于类,加载一次,可以被共享访问)
访问格式:类名.变量名(推荐)
对象名.变量名(不推荐)
实例成员变量(无static修饰,属于对象)
访问格式:对象名.变量名
2、两种成员变量各自在什么情况下定义?
静态成员变量:表示在线人数等需要被共享的信息
实例成员变量:属于每个对象,且每个对象的信息不同时(如name,age,money等)
3、static修饰成员变量的内存原理
程序运行开始,方法区加载class文件和main方法的同时,堆内存开辟一块空间,加载class静态变量区,存储静态成员变量
4、成员方法的分类和访问分别是什么样的?
静态成员方法(有static修饰,属于类和对象共享)
访问格式:类名.静态成员方法
对象名.静态成员方法(不推荐)
实例成员方法(无static修饰,属于对象)
访问格式:对象名.实例成员方法
5、每种成员方法的使用场景是怎么样的?
静态成员方法:如果该方法是以执行一个通用功能为目的,或者需要方便访问,则可以申明静态方法
实例成员方法:表示对象自己的行为的,且方法中需要直接访问实例成员变量的,则该方法必须申明成实例方法
6、static修饰成员方法的内存机制
程序运行,类和静态方法优先加载到方法区,如果后面有new对象的话,实例成员方法会加载进方法区,堆内存里的对象的方法的引用会指向方法区里加载好的实例方法,这个实例方法是归属于对象的。
7、static访问注意事项(面试,笔试题会遇到)
静态方法只能访问静态成员,不能直接访问实例成员
实例方法可以访问静态成员,也可以访问实例成员
静态方法中不可以出现this关键字
第二节 static应用知识:
1、工具类是什么,有什么好处
工具类中都是一些静态方法,每个方法都是以完成一个共用的功能为目的,这个类用来给系统开发人员共同使用
好处是:一是调用方便,二是提高代码复用(一次编写,处处可用,提高代码的重用性)
2、工具类有什么要求?
建议工具类的构造器私有化处理,即不让别人创建工具类对象,直接使用类名.静态方法形式调用,这样不占内存,还显得专业化。
3、代码块是什么?
代码块是类的5大成分之一(成员变量,构造器,方法,代码块,内部类),定义在类中方法外。
在java类下,单独使用{}括起来的代码被称为代码块
4、代码块可以分为哪几类?
静态代码块
格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次
使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用。
实例代码块(构造代码块)
格式:{}
特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且会在构造器执行前执行(super在{}前执行,爸爸永远是爸爸)
使用场景:初始化实例资源
5、静态代码块的作用是什么?
如果要在启动系统时对静态资源进行初始化,则建议使用静态代码块完成数据的初始化操作。
以斗地主为例
package com.itMao.d1; import java.util.ArrayList; public class staticDemoTest { /** *需求:斗地主,在启动游戏房间的时候,应该提前准备好54张牌,后续才可以直接使用这些牌数据 */ /** *1、定义一个静态集合,这样这个集合只加载一个,因为当前房间只需要一副牌 */ public static ArrayList<String> cards = new ArrayList<>(); /** * 2、在程序真正运行main方法前,把54张牌放进去,后续游戏可以直接使用 */ static { //3、正式做牌,当到集合中去 //a、定义一个数组存储全部点数,因为类型,个数都确定 String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; //b、定义一个数组存储全部花色,因为类型,个数都确定 String[] colors = {"红桃","黑桃","方片","梅花"}; //c、遍历点数 for (int i = 0; i < sizes.length; i++) { //d、遍历花色 for (int j = 0; j < colors.length; j++) { cards.add(sizes[i]+colors[j]); } } //e、单独加入大小王 cards.add("小王"); cards.add("大王"); } public static void main(String[] args){ System.out.println("新牌加载完毕"+cards); } }
第三节 单例设计模式
1、单例模式是什么
可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只创建一个对象
单例模式有很多:饿汉单例,懒汉单例。。。。。。。
2、饿汉单例的实现步骤(在用类获取对象时,已经提前创建好了对象)
定义一个类,构造器私有化
定义一个静态变量存储该类的对象
package com.itMao.d1.d4_static_singleInstance; public class SingleInstance { //2、定义一个静态成员变量存储该类的对象,只加载一次,只此一个 public static SingleInstance instance = new SingleInstance(); //1、构造器私有化 private SingleInstance(){ } }
3、懒汉单例的实现步骤(在真正需要该对象的时候,才去创建一个对象,即延迟加载对象)
定义一个类,把构造器私有化
定义一个静态变量存储一个对象,不可以直接new,这样就变成了饿汉单例,同时这个变量要私有化
提供一个返回单例对象的方法
package com.itMao.d1.d4_static_singleInstance; public class SingleInstance2 { /** * 2、定义一个静态变量负责存储一个对象 * 只加载一次,只有一份 * 最好私有化,不然其他类在调用的时候会返回null */ private static SingleInstance2 instance; /** * 3、提供一个返回该类对象的方法 */ public static SingleInstance2 getInstance(){ if(instance == null){ instance = new SingleInstance2(); } return instance; } /** * 1、构造器私有化 */ private SingleInstance2(){ } }
4、饿汉单例和懒汉单例的优缺点
饿汉单例:速度快,但是占内存
懒汉单例:速度慢,但是不占内存
因为饿汉单例只要一加载类,这个对象就new出来了,而懒汉单例只有在调用方法的时候才会new对象。
第四节 继承
1、什么是继承?继承的好处是啥?
继承就是java允许我们用extends关键字,让一个类和另一个类建立起一种父子关系
提高代码复用性,减少代码冗余,增强类的功能扩展性
2、继承的格式
子类 extends 父类
3、继承后子类的特点?
子类继承父类后,子类可以得到父类的属性和行为,子类可以使用
java中子类更强大
4、创建子类对象的内存机制
创建子类对象后,对外是一个对象,但是内部是分成两个空间的
5、继承需要满足什么样的设计规范
子类们相同特征(共性属性,共性方法)放在父类中定义
子类独有的属性和行为应该定义在子类自己里面
6、继承有哪些特点?
子类可以继承父类的属性和行为,但是子类不能继承父类的构造器
java是单继承i模式:一个类只能继承一个直接父类
java不支持多继承、但是支持多层继承
java中所有的类都是object类的子类
7、在子类方法中访问成员(成员变量、成员方法)满足:
就近原则,先在子类范围里面找,子类没有找父类,父类没有就报错
8、如果子父类中出现了重名的成员,此时如果一定要在子类中使用父类的怎么办?
格式:super.父类成员变量/父类成员方法
9、方法重写是什么样的
子类写一个与父类申明一样的方法覆盖父类的方法
10、方法重写建议加上哪个注解,有什么好处?
@Override注解可以校验重写是否正确,同时可读性好
11、重写方法有哪些基本要求
重写方法的名称和形参列表应该与被重写方法一致
私有方法不能被重写
静态成员方法不能被重写
子类重写父类方法是,访问权限必须大于或者等于父类被重写的方法的权限
12、子类继承父类后构造器的特点
子类中所有的构造器默认都会先访问父类中无参的构造器,在执行自己
因为子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据
子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化
13、怎么调用父类构造器的
子类构造器的第一行语句默认都是super(),不写也存在的。
14、super调用父类构造器的作用是什么?
通过调用父类有参数构造器来初始化继承自父类的数据
15、如果父类中没有无参数构造器,只有有参构造器,会出现什么现象?
会报错,因为子类默认是调用父类无参构造器的
16、如何解决
子类构造器中可以通过书写super(),手动调用父类的有参数构造器
或者父类一定要写无参构造器
17、this和super详情
18、this(....)和super(....)使用注意点
子类通过this(..)去调用本类的其他构造器,本类其他构造器会通过super去手动调用父类的构造器,最终还是会调用父类构造器的
注意:this(...)super(...)都只能放在构造器的第一行,所以二者不能共存在同一个构造器中
标签:JAVA,进阶,--,子类,成员,static,单例,父类,方法 From: https://www.cnblogs.com/Flower--Dance/p/16633868.html