多敲多想
day06
java.lang.Object类
如果一个类未继承父类,那么他的默认父类就是Object
==和equlas的区别
==运算符:如果比较的是基本数据类型,比较的是两个基本类型的值。如果比较的是引用数据类型,比较的是两个对象的地址值。
==符号使用时,必须保证符号两边类型相同
equlas:用于比较引用数据类型,如果自定义类没有重写equlas()方法时,比较的是两个地址的值,如果重写了equlas()方法,就比较两个对象属性是否相等。
通常情况下,重写equlas方法,都会对类中的属性进行比较
toString()方法
Object类中toString()的使用:
- 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()。
- String、Date、File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()时,放回“实体内容"信息。
- 自定义类也可以重写toString()方法,返回对象的“实体内容”。
包装类
针对8种基本数据类型定义相应的引用数据类型–包装类。
有了类的特点,就可以调用类中的方法,Java才是真正的面向对象。
包装类的使用
-
Java提供了8中基本数据类型对应的包装类,为了基本数据类型的变量具有类的特征。
-
基本数据类型、包装类、String类型三者之间的转换。
-
基本数据类型----->包装类:调用包装类的构造器。
```java`
Integer i = new Integer(100); -
包装类----->基本数据类型:调用包装类xxx的xxxValue()
Integer i = new Integer(100); int num = i.intValue();
-
自动装箱与自动拆箱
这是JDK5之后的新特性
int num = 10;
Integer i = num; //自动装箱
int num1 = i; //自动拆箱
基本数据类型、包装类----->String类型
int num = 10;
//方式一:连接运算
String str1 = num + "";
//方式二:调用String的valueOf()
float f1 = 12.3f;
String str2 = String.valueOf(f1)
String类型---->基本数据类型、包装类 调用包装类的parseXxx()方法;
String str1 = "123";
int num2 = Integer.parseInt(str1);
Integer内部定义了IntegerCache结构,IntegerCache结构定义了Integer[]
保存了-128127范围的整数。如果我们使用自动装箱的方式,给Integer赋值的范围在-128127,则不会去new一个新的Integer对象,这是一个优化。
static关键字
-
static:静态的
-
static 可以用来修饰:属性、方法、代码块、内部类
-
使用static修饰属性:静态变量(或类变量)
- 属性,按是否使用static修饰,又分为:静态属性、非静态属性(实例属性)
实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象的非静态属性时,不会导致其他对象中同样的属性被修改。
静态变量:当我们创建了类的多个对象,多个对象共享同一个变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
静态变量随着了类的加载而加载,可以通过”类名.静态变量“调用。
-
使用static修饰方法:静态方法
-
随着类的加载而记载,可以通过“类.静态方法”的方法进行调用。
-
静态方法中,只能调用静态的方法或属性。
非静态方法中,既可以调用非静态属性的方法或属性,也可以调用静态属性和方法。
-
-
static注意点:
-
在静态方法中,不能使用this关键字,super关键字 (因为对象都还没创建呢)
-
关于静态属性和静态方法的使用,需要从生命周期的角度去理解
-
开发中,如何确定一个属性是否要声明为static的?
- 属性是可以被多个对象所共享,不会随着对象的改变而改变
开发中,如何确定一个方法是否声明为static的?
- 操作静态属性的方法,通常设置为static
- 工具类中的方法,习惯声明为static的
单例设计模式
-
类的单例设计模式,就是采用一定的方法保证整个软件系统中,对某个人只能存在一个对象实例。
-
实现方式:
-
饿汉式
class Order{ private Order(){ } private static Order instance = new Order(); public static Order getInstance(){ return instance; } }
-
懒汉式
class Order{ private Order(){ } private static Order instance = null; public static Order getInstance(){ if(instance == null){ instance = new Order(); } return instance; } }
-
类的成员之四:代码块(初始化代码块)
- 代码块的作用:用来初始化类、对象
- 代码块如果有修饰的话,只能使用static修饰
- 代码块分为:静态代码块和非静态代码块
- 静态代码块:随着类的加载而执行,而且只执行一次
- 非静态代码块:随着对象的创建而执行,每创建一个对象,就执行一次
由父及子,静态先行。
final关键字
-
final可以用来修饰的结构:类、方法、变量
-
final 用来修饰一个类:此类不能被其他类所继承。
-
final 用来修饰方法:表示此方法不能被重写
-
final 用来修饰变量:此时的“变量”就是一个常量了
-
final用来修饰属性,可以考虑赋值的位置有:显示初始化,代码块中初始化,构造器中初始化。
-
final修饰局部变量:
尤其是使用final修饰形参时,表示此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但无法重新赋值。
-
static final 用来修饰属性:全局常量
abstract 关键字的使用
- abstract:抽象的。
- abstract可以用来修饰的结构:类、方法。
- abstract修饰类:抽象类
- 此类不能被实例化
- 抽象类中一定有构造器,便于子类实例化调用
- 开发中,都会提供抽象类的子类,让子类实例化,完成相关的操作
- abstract修饰方法:抽象方法
- 抽象方法只有方法的声明,没有方法体
- 包含抽象方法的类,一定是抽象类。反之,抽象类中是可以没有抽象方法的。
- 若子类重写了父类中的所有的抽象方法后,此子类才可以实例化。若子类么有重写父类中的抽象方法,则需要把子类也声明为抽象类
abstract不能用来修饰属性、构造器。
接口
接口的使用
- 使用interface来定义
- Java中,接口和类是并列的两个结构
- 如何定义接口:定义接口中的成员
- JDK7及以前:只能定义全局常量和抽象方法
- 全局常量 public static final修饰的 但是书写时,可以省略
- 抽象方法 public abstract 修饰的
- JDK8:除了定义全局常量和抽象方法外,还可以定义静态方法、默认方法
- JDK7及以前:只能定义全局常量和抽象方法
- 接口中不能定义构造器,意味着接口不能实例化
- Java开发中,接口都是通过让类实现(implements)的方法来使用
- 如果实现类覆盖了接口中的所有抽象方法,则该实现类可以实例化
- 如果没有覆盖接口中的所以抽象方法,则该实现类为抽象类。
- 类可以实现多个接口,弥补了Java的单继承的局限性
- 接口和接口之间可以继承,实现了多继承
接口的具体使用,体现了多态性
接口,实际上可以看做是一种规范