static(静态的)
在同一个类的一个对象里改变static属性,会导致同类的另一个对象的该属性也一起变
tag
静态变量的创建早于对象的创建早于实例变量的创建
静态变量随着类的加载而加载
由于类只会加载一次,则静态变量在内存中也只会存在一份,存在方法区的静态域里面
因为静态方法比对象更早加载于内存中,所以可以直接调用该类的方法而不需要先new一个对象,可以用过“类.静态方法”的方式进行调用
在静态的方法内,不能使用super、this;因为static修饰后,他们对象都没建起来的时候更没有this和super,但已经有static的了(所以前面调用的格式是类.方法)
非静态和对象一起消亡,静态和类一起消亡
判断属性和方法是否应该static
属性要是被多个对象共享且不会随对象不同而不同的就是static,如银行利率
方法如果是用来操作静态属性、或工具类的方法,就用static
类中的方法中的static变量直接存放在方法区中,new的对象中的该变量也在方法区中
main方法
1、main方法作为程序的入口
2、main方法也是一个普通的静态方法
3、main方法要public是因为他权限不大的话就调不了别的包的变量
4、main方法可以作为我们与控制台交互的方式
每个.java文件中只能有一个public类
但是每个类中都可以有main方法,即可以有多个main方法
不过在run的时候要选择一个作为入口
不能在main方法里面调用非静态变量,因为main方法是静态,静态只能调静态,只能调对象里的非静态。但如果该变量就是要写成静态的,就没必要写个对象了
代码块
静态代码块
内部可以有输出语句
随着类的加载而执行,而且只执行一次
非静态代码块
内部可以有输出语句
随着对象的创建二执行
每创建一个对象,就执行一次非静态代码块
作用:可以在创建对象时对对象的属性进行初始化
执行顺序
对于同类代码块,按声明的顺序先后执行
对于静态和非静态的代码块,静态优先
random
用法同Scanner
随机产生一个不超过当前数据类型范围的数
每次运行数都不一样
生成指定范围的随机数:
如果想要1~10的,就num=r.nextInt(9)+1;
final(最终的)(还要再看视频)
可以用来修饰方法、类、变量
用final修饰类后表示该类不能被继承了
修饰方法表明该方法不能被重写了
final和bool在强调这个变量的类型的作用上是一样的
final修饰变量,表明这个变量是常量了
abstract(抽象的)
可以用来修饰类和方法,不能修饰属性、构造器、私有方法(不能被重写)、静态方法(不能被重写)、final(不能被重写)
修饰类:
此类不能实例化(造对象)
抽象类中一定有构造器,便于子类调用
开发中都会提供抽象类的子类
修饰方法
抽象方法只有方法声明,没有方法体(花括号也不能有)如public abstreact void fun();
包含抽象方法的类,必须是一个抽象类(不然类能造对象就能调用该抽象方法,这是不行的)
若子类重写了父类中所有的抽象方法后,此子类方可实例化
若子类没有重写父类中的所以抽象犯法,此子类必须也要是抽象类
抽象类应用
interface接口
1、Java中接口和并列的两个结构
2、
3、接口中不能定义构造器,意味着接口不能实例化
4、Java开发中,接口通过让类去implements(实现)的方式来使用
如果实现类覆盖了(也可看做重写)接口中的所以抽象方法,即可实例化,否则不能,且此实现类仍为一个抽象类
Java8中允许在接口中定义defalt修饰的默认方法,可以使接口中添加方法而不用修改实现该接口的类的方法,使接口升级;并且也使接口不一定必须只能定义抽象方法
Java8中还允许在接口中定义静态方法,其他类实现该接口的操作不变,不过在调用该静态方法时只需要接口名. (这里是个点)静态方法名就可以调用
Java9中允许定义私有方法
作用是防止实现类可以调用该方法
该方法只能是由接口中的默认方法调用
对于静态默认方法就定义静态私有方法
接口中的常量定义和使用
完整写的话就是 public static final type name =value;
只写 type name =value 也没问题
该常量的命名使用全大写,用下划线分隔
接口是没有静态代码块和构造方法的
Java类可以实现多个接口
弥补了Java的只能单继承缺点
如下如图,flyable和attackable都是接口,用逗号隔开
接口和接口之间可以继承,且能多继承
如果继承和实现都要写,先写继承再写实现
继承优先于接口,对于重复方法,优先调用父类中的该方法
如果实现类所实现的多个接口中存在重复的抽象方法,那么只需要重写一个即可
如果存在重复的默认方法,则必须对冲突的默认方法进行覆盖重写
接口与接口之间多继承
类与类之间是单继承,直接父类只有一个
类与接口之间是多实现的,一个类可以实现多个接口
接口与接口之间是多继承
注意事项
1、多个父接口当中的抽象方法如果重复,没关系
2、多个父接口当中的默认方法如果重复,则必须进行默认方法的重写,并带上default关键字
内部类
分类:成员内部类、局部内部类(包括匿名内部类)
成员内部类的定义格式:
修饰符 class 外部类名称
{
修饰符 class 内部类名称
{
。。。。
}
}
内用外,随意访问,外用内,需要内部类对象
使用成员内部类的两种方式:
1、间接方式:在外部类的方法当中使用内部类;main方法知识调用外部类中的方法
2、直接方法:
外部类名称.内部类名称 对象名 =new 外部类名称().new 内部类名称();
如果外部类与内部类出现重名,则在内部类调用的话遵守就近原则,会调用内部类方法的局部变量,如果想要调用外部类的该变量时,格式是:外部类名称.this.外部类成员变量名
包装类
包装类使得基本数据类型的变量具有类的特征
这里的toString这是将他变成了字符串输出,可以直接system.ou.println(in1)
将包装类–>基本数据类型的用途:对象不能四则运算,基本数据类型才行
Java5.0新特性 自动装箱 这样就不用像上面那样调用构造器装箱了****
自动拆箱
面试题:Integer的源码中把-128~127范围的数直接赋值,但是超过127的就要new对象,此时返回的就是地址值了(好像是这么回事)
单例设计模式
就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例
要求:
1、私有化类的构造器 2、内部创建类的静态对象 3、提供公共的静态方法,返回类的对象(静态是因为要创建对象,不然就会出现“为了创建对象而要创建对象”的问题)
这样子实例化多次,获得的多个对象地址值都是相同的,即只有一个对象实例