修饰符
- static关键字
-
1)静态与实例的区别:
- (1)实例属性是每个对象各自持有的独立空间(多份),对象单方面修改,不会影响到其他对象。
- (2)静态属性是整个类共同持有的共享空间(一份),任何对象修改,都会影响其他对象。
-
2)静态的概念:
- (1)静态(static)可以修饰属性和方法。
- (2)static可以修饰属性和方法,称为静态属性(类属性)、静态方法(类方法)。
- (3)静态成员是全类所有对象共享的成员。
- (4)在全类中只有一份,不因创建多个对象而产生多份。
- (5)访问静态属性和方法时,不必创建对象,可以直接“类名.属性名/方法名”访问。
-
3)静态的特点:
- (1)静态方法允许访问静态成员。
- (2)静态方法不能访问非静态成员。
- (3)静态方法不允许使用this或是super关键字。
- (4)静态方法可以继承,不能重写,没有多态。
- 类加载
- 1)JVM首次使用某个类时,将该类的.class文件加载到内存中,进行保存。
- 2)加载时机:
- (1)创建对象。
- (2)创建子类对象。
- (3)访问静态属性。
- (4)调用静态方法。
- (5)Class.forName(“全限定名”);
- 3)静态代码块:
类加载时,触发静态代码块的执行(仅一次)。
执行地位:静态属性初始化之后。
作用:可为静态属性赋值,或必要的初始行为。 - 4)总结:
- (1)静态方法允许访问静态成员。
- (2)静态方法不能访问非静态成员。
- (3)静态方法不允许使用this或是super关键字。
- (4)静态方法可以继承,不能重写,没有多态。
- (5)类加载时,触发静态代码块的执行(仅一次)。
- final关键字
-·1)概念:最后的,不可更改的。
- 2)final可修饰的内容:
- (1)final修饰类(最终类):此类不能被继承。
- (2)final修饰方法(最终方法):此方法不能被覆盖。
- (3)final修饰变量(最终变量):此变量值不能被改变(变量),无初始值,仅允许赋值一次。
- 3)要求:
- (1)实例常量(修饰的实例变量不在提供默认值,必须手动赋值)
- (a)期限:在对象构造之前赋值
- (b)赋值位置:显示初始化,动态代码块,构造方法(如果在构造方法中赋值,所 有构造方法必须赋值)
- (2)静态常量(必须手动赋值)
- (a)期限:在类加载完成之前(通过类名调用之前)
- (b)赋值位置:显示初始化,静态代码块。
- (3)局部变量:显示初始化。
- (4)基本数据类型常量:值不可变。
- (5)引用数据类型常量:地址不可变。
- (1)实例常量(修饰的实例变量不在提供默认值,必须手动赋值)
接口
-
语法:
(1)接口相当于特殊的抽象类,定义方法、组成部分与抽象类类似。
(2)interface定义接口
(3)只能定义公开静态常量、公开抽象方法 -
与抽象类的异同
相同:
(1)可以编译成字节码文件。
(2)不能创建对象(接口不是类,不是模板的概念,没有构造方法)。
(3)可以声明、引用。
(4)具备Object类中所定义的方法。
差异:
(1)接口中的属性都是公开静态常量((隐式使用public static final修饰)。
(2)接口中的方法都是公开抽象方法(隐式使用public abstract修饰)。
(3)没有构造方法、没有动态代码块、没有静态代码块。 -
微观概念:接口是一种能力和约定。
接口的定义:代表了某种能力。
方法的定义:能力的具体要求。
经验:
(1)Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充子类能力。
(2)接口支持多实现,可为类扩充多种能力。 -
使用规范:
(1)任何类在实现接口时,必须实现接口中的所有的抽象方法,否则此类为抽象类。
(2)实现接口中的抽象方法时,访问修饰符必须是public。 -
接口引用:
(1)同父类一样,接口也可声明为引用,并指向实现类对象。
(2)注意:
a)仅可调用接口中所声明的方法,不可调用实现类中独有的方法。
b)可强转回实现类本身类型,进行独有方法调用。 -
接口的多态:
1)不再关注具体类型,而是关注行为 -
常见关系:
- 类与类:
- 单继承
- extends 父类名称
- 类与接口
- 多实现
- implements 接口名1,接口名2,接口名n
- 接口与接口
- 多继承
- extends 父接口1,父接口,父接口n
- 常量接口
将多个常用于状态或固定值的变量,以静态常量的形式定义在接口中统一管理,提高代码可读性。 - 宏观概念:接口是一种标准。
耦合度:模块与模块之间的关联程度,关联的越密切,耦合越高,关联的越松散,耦合越低。 - 接口回调:先有接口的使用者,后有接口的实现类。
- 接口的好处:
- 程序的耦合度降低。
- 更自然的使用多态。
- 设计与实现完全分离。
- 更容易搭建程序框架。
- 更容易更换具体实现。
内部类
- 概念:在一个类的内部在定义一个完整的类。
- 特点:
- 编译之后可生成独立的字节码文件。
- 内部类可以直接访问外部类的私有成员,而不破坏封装。
- 可为外部类提供必要的内部功能组件。
- 分类:
(1)成员内部类:
- 在类的内部定义,与实例变量、实例方法同级别的类。
- 外面类的一个实例部分,创建内部类对象时,必须依赖外部类对象。
- Outer out = new Outer();
- Outer.Inner in = out.new Inner();
- 当外部类、内部类存在重名属性时,会优先访问内部类属性。
- 若要访问外部: 外部类名.this.属性名
- 成员内部类不能定义静态成员。
(2)静态内部类: - 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员。
- 只能直接访问外部类的静态成员(实例成员需要实例化外部类对象)。
- Outer.Inner in = new Outer.Inner();
- Outer.Inner.show();
(3)局部内部类:
- 定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。
- 局部内部类访问外部类当前方法中的局部变量时,因无法保证变量的生命周期与自身相同,变量必须修饰为final。
- 限制类的使用范围。
(4)匿名内部类: - 没有类名的局部内部类(一切特征都与局部内部类相同)。
- 必须继承一个父类或者实现一个接口。
- 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象。
- 优点:减少代码量。
- 缺点:可读性较差。
Object类
- 概念:
- 超类、基类,所有类的直接或间接父类,位于继承树的最顶层。
- 任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承。
- Object类中所定义的方法,是所有对象都具备的方法。
- Object类型可以存储任何对象。
- 作为参数,可接受任何对象。
- 作为返回值,可返回任何对象。
- getClass()方法:
- public final Class<?> getClass(){}
- 返回引用中存储的实际对象类型。
- 应用:通常用于判断两个引用中实际存储对象类型是否一致。
- hashCode()方法:
- public int hashCode(){}
- 返回该对象的十六进制的哈希码值。
- 哈希算法根据对象的地址或字串符或数字计算出来的int类型的数值。
- 哈希码并不唯一,可保证相同对象返回相同哈希码,尽量保证不同对象返回不同哈希码。
- toString()方法:
- public String toString(){}
- 返回该对象的字符串表示(表现形式)。
- 可以根据程序需求覆盖该方法,如:展示对象各个属性值。
- equals()方法:
- public boolean equals(Object obj){}
- 默认实现为(this == obj),比较两个对象地址是否相同。
- 可进行覆盖,比较两个对象的内容是否相同。
equals()方法覆盖步骤: - 比较两个引用是否指向同一个对象。
- 判断obj是否为null.
- 判断两个引用指向的实际对象类型是否一致。
- 强制类型转换。
- 依次比较各个属性值是否相同。
链接: 图示.
来源:CSDN
作者:Java小白223
链接:https://blog.csdn.net/qq_38663926/article/details/104571476