包装类
java有8种基本类型,byte short int long float double char boolean
这8个基本类型不能当成对象使用,而且不能接受null值。
为了解决上面问题,java为8种基本类型提供了对应的包装类--------可将他们包装成对象。
byte-----Byte
short----Short
int--------Integer
long-----Long
float-----Float
自动装箱:基本类型的值可以自动当作基本类型的值
自动拆箱:包装类的实例可以自动当作基本类型是值使用
Integer in = 2;
Object ob = 2.3;//2.3自动装箱Double,Double自动向上转型为Object
Long re = in * ob;
System.out.println(re);// 自动拆箱
做项目时,同常来说建议使用包装类来声明变量。
包装类的方法:
方法可将字符串转成对应的基本类型值
int i = Integer.parseInt("123");//------->i = 123
long lo = Long.parseLong("123");//------->lo = 123
blooean b = Boolean.parseBoolean("true");//---->b = true
NumberFormatException:要转的字符串不符合数值格式,会引发该异常。
-
面视题
public class 面视题 { public static void main(String[] args) { Integer i = 20; // 在-128~127之间,缓存 Integer j = 20; // 直接使用缓存中的对象 System.out.println(i == j);//true Integer k = 200; Integer l = 200; System.out.println(k == l);//false } }
当程序对Integer使用自动装箱时,它有一个缓存机制,它会缓存-128~127之间的对象。
两个被重写的方法
-
toString()方法
程序打印对象,或把对象自动转成字符串时,实际上调用的是该对象的toString方法。
Object提供的toString返回:类名@hashCode方法返回 返回的是16进制的数值。
@Override public String toString() { return "Apple[color="+color +",weight="+weight +"]"; } //重写toString方法,返回对象的信息
任何对象+"",就会变成字符串
-
equals()方法
== 如果判断的两个引用变量,要求两个引用变量指向同一个对象时,才会返回true.
默认的equals:Object提供的equals方法,判断两个对象相等的标准与==是完全一样的。
-
重写equals()方法,根据业务规则定义。比较一些关键的成员变量。
static修饰符详解
static并不是静态的意思。static是类的意思,有static修饰的成员属于类成员,没有static的成员属于实例成员。
static是否可以修饰局部变量------局部变量不属于成员 ,不能用static修饰
static能否修饰外部类 ----------------外部类不属于成员,因此不能用static修饰
static可修饰的成员:成员变量、方法、
构造器、初始化块、内部类-
static 成员(成员变量、方法、初始化块、内部类)属于类成员
所有类成员,都只能用类名调用!java允许使用对象来调用类成员,其实没有意义!
-
static考点:static成员不能访问非static成员;非static成员可以访问static成员。
单例模式
在某些场景下,某些类只需要(只能)创建一个实例,比如系统的窗口管理器,数据库引擎访问点,Java程序所在的jre环境。。。。。。都只要产生一个实例。此时就应该采用单例模式。
如何设计单例模式?
-
隐藏构造器--------避免被创建实例
-
暴露一个static方法,该方法用于创建实例,该方法还需要保证,该类只产生一个实例。
public class Singleton { private static Singleton s; // 构造器隐藏 private Singleton(){} //暴露一个static方法,用于创建 public static Singleton instance() { if (s == null) //还没有创建实例 { s = new Singleton(); } return s } } public class SingletonTest { public static void main(String[] args) { Singleton s1 = new Singleton();//报错,构造器隐藏了 Singleton s1 = Singleton.instance(); Singleton s1 = Singleton.instance(); System.out.println(s1 == s2);//true } }
-
final修饰符详解
可以修饰变量(各种)、方法、类。
final与abstract是互斥的
-
final修饰变量:该变量被赋初始值后,不能被重新赋值,final修饰的变量必须赋初始值,且只能赋值一次。
-
final修饰的成员变量
非final的成员变量:系统自动分配
final的成员变量:必须显示指定初始值
-
final实例变量必须显示指定初始值,且必须在以下3个位置
- 定义时指定初始值
- 实例初始化块
- 每个构造器显示指定一次初始值
本质上只有一个:构造器
-
final类变量必须显示指定初始值,且必须在以下2个位置
- 定义时指定初始值
- 类初始化块
本质上只有一个:类初始化块
-
final修饰局部变量
与普通变量的区别是:不能第二次赋值,必须由程序员显示赋值。
-
final修饰引用类型变量
final只能保证本身的变量不被重新赋值,但可以修改final变量所引用的对象
重写toString()
-
final修饰的“宏替换”的变量
如果一个变量满足以下3个条件:
- 变量有final修饰
- 声明变量时指定初始值
- 变量的初始值可以在编译时确定(初始值的表达式中没有变量、方法调用等)
这个变量就会消失,所有出现该变量的地方,在编译时就会替换该变量的值。
-
final修饰方法
表明该方法不能被子类重写。但是该方法可以被重载,也可以被子类调用!
-
final修饰类
表明该类不能派生子类!jdk里有很多类都是final: String Math System
-
abstract(抽象)
他只能修饰2个东西:方法、类。抽象方法、抽象类。
abstract与final互斥。
-
抽象类:有得有失。
抽象类与普通类的区别:有得有失
有得:得到一个新功能:抽象类可拥有抽象方法。
有失:失去一个功能:创建对象。
抽象类的主要作用:
- 派生子类
- 子类构造器一定要调用父类构造器方法一次,因此抽象类一定有构造器。
-
抽象方法:
只有方法签名,没有方法体的方法。
只有抽象类可以拥有抽象方法。
-
抽象类作用:
- 定义变量
- 调用类方法和类变量
- 派生子类-----主要目的
-
抽象类派生子类
子类要么重写抽象父类中所有抽象方法,要么子类也只能是抽象的。
接口
接口相当于一种彻底抽象的类,接口体现的是一种规范--------要暴露出来供大家使用,多以接口的多有东西都用public修饰,不管你写还是不写,时钟都是public修饰,通常不写。
【修饰符】interface 接口名 extends 父接口1,父接口2,…
{
// 成员变量。只有常量。始终会添加public static final修饰。通常不写。
//抽象方法。java8后,类方法、默认方法(抽象添加方法体)默认方法就是实例方法
//内部类
}
- 接口是多继承的。
- 修饰符:public 。 接口是彻底抽象的,不能有final;接口已经够抽象了,因此不需要abstract修饰
- 接口名:基本等同于类名,接口一般推荐都是用形容词。添加able就是形容词。
-
接口的作用:
- 定义变量,只能实现类的实例来赋值(向上转型)
- 调用类方法或类变量
- 派生实现类
-
实现接口
【修饰符】 class 类名 extends 父类 implements 父接口1,父接口2,…
{
//5大成员
}
-
java9为接口增加的private方法
多个default方法之间很可能出现“公共部分”,这个“公共部分”就应该被抽取到“工具方法”中。
而工具方法又希望被隐藏,=====用private修饰。
本质:工具方法,为其他方法服务。