面向对象高级分为以下几个部分:
类变量
类变量也叫静态变量,静态属性,是该类的所有对象共享的变量,任何一个该类访问他时都是相同的值,任何对象去修改他是修改的也是同一个变量。
-
static变量是同一个类所有对象共享
-
static类变量在类加载的时候生成
-
如何定义: 访问修饰符 static 数据类型 变量名;
-
如何访问: 类名.类变量名(推荐使用)。对象名.类变量名
-
类变量是该类的所有对象共享的,而实例变量是每个对象独享的。实例变量不能通过 类名.类变量名来访问
-
类变量的生命周期随类的加载开始,随类的消亡而消亡
类方法
类方法也叫静态方法。当方法中不涉及到任何对象相关的成员,则可以将方法设计成静态方法,提高开发效率。
- 类方法的定义:访问修饰符 static 数据返回类型 方法名(){}
- 类方法的调用: 类名.类方法名 / 对象名.类方法名
- 类方法和普通方法都是随着类的加载和加载,将结构信息储存在方法区中
- 普通方法不能通过类名调用
- 类方法不允许使用和对象有关的关键字如 this super
- 类方法只能访问静态方法或静态变量
- 不同成员方法及可以访问静态成员有可以访问非静态成员。
main方法
- 虚拟机调用main方法,所以需要将权限设为public
- main()方法不必创建对象使用,所以是静态的
- 接受String类型,接收值为在命令行打的参数
代码块
代码块又叫做初始化块,属于类中的成员(类的一部分),讲逻辑语句封装在方法体中。通过{}包围起来。
但和方法不同的是没有方法名,返回,参数,只有方法体
- [修饰符]{方法体}
- 随这类的加载而执行,只会执行一次
- 类的加载:创建对象时,创建子类对象时,使用类的静态成员时
- 在创建对象时,一个类的调用顺序:调用静态代码块和静态属性初始化。调用普通代码块和普通属性的初始化。调用构造方法
- 构造器第一行隐藏super和普通代码块。
- 静态方法只能调用静态方法和属性
单例设计模式
- 在整个软件系统中,莫格勒只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
- 分为饿汉式和懒汉式两种,区别在于,第一种再累加载时就创建了对象实例,第二种在使用时才创建
- 饿汉式不存在线程安全的问题,懒汉式存在
- 饿汉式存在浪费资源的问题
final关键字
final 可以修饰类、属性、方法和局部变量。被final修饰的属性叫常量并且必须赋值。
如果类不是final类但是含有final方法则该方法不饿能被重写,但是可以被继承。
final不能修饰构造器
final一般在以下情况使用
- 在不希望类被继承时
- 父类的某个方法不希望被覆盖或者重写
- 类的某个属性不希望被修改
- 局部变量被修改
抽象类
当父类某些类不知道如何实现时那么可以将其声明为抽象类。
- 抽象类: abstract class 类名{}
- 抽象方法: abstract 返回类型 方法名(形参);//没有方法体
- 抽象类不能被实例化。
- 抽象类可以没有抽象方法,但是如果一个类有抽象方法那么必须声明为抽象类。
- 抽象方法不能有方法主体
- 如果一个类继承了抽象类,则必须实现抽象类的所有抽象方法。除非他自己也是抽象类
- 抽象方法不能用private、final、static修饰
模板设计模式
抽象类就像一个模板,它可以作为多个子类的通用模板
接口
接口就是一些没有实现的方法,封装到一起,到某个类要使用的时候再根据具体情况把方法写出来。
语法: interface 接口名{//属性//抽象方法}
接口是更加抽象的抽象抽象的类。抽象类里的方法可以有方法体,接口里的所有方法都没有方法体。jdk7.0
jdk8.0接口类可以有静态方法默认方法。
注意细节和事项
- 接口不能被实例化
- 接口中所有的方法是public方法,接口中的抽象方法可以不用abstract修饰
- 一个普通类实现即可偶就必须将该接口的所有方法都实现。
- 抽象类实现接口,可以不用实现接口的方法
- 一个类同时可以实现多个接口
- 接口中的属性是能是final,而且修饰符是public static final
- 接口也属性的访问形式是: 接口名.属性名
- 接口不饿能继承其他的类,但是可以继承多个别的接口
- 接口的修饰符只能是默认或者public,这点和类的额修饰符是一样的。
接口和继承
- 当子类继承父类,就自动拥有父类的功能,如果子类需要扩展功能,可以通过实现接口的方式扩展。可以理解实现接口是对java单继承机制的一种补充。
- 继承的价值:解决代码的复用性和可维护性。
- 接口的价值:设计,设计好各种规范,让其他类去实现这些方法,即更加灵活
- 接口比继承更加灵活,继承是满足is-a的关系,耳机口只满足like-a的关系
- 接口在一定程度上实现代码解耦(接口规范性+动态绑定机制)
接口的多态性
接口可以接受不同的对象,接口存在多态传递的现象。
内部类
一个类的内部完整嵌套另一个类。被嵌套的类叫内部类,嵌套内部类的类叫外部类。
类的额成员:属性、方法、构造器、代码块、内部类
特点是可以访问私有属性,并且体现类和类的包含关系。
基本语法:
class Outer{
class Inner{
}
}
class Other{
}
内部类的分类
- 局部内部类:有类名
- 匿名内部类:没有类名
- 定义在外部类的成员位置上: 成员内部类(没有static修饰)静态内部类(使用static修饰)。
局部内部类的使用
局部内部类定义在外部类的局部位置,比如方法中并且有类名
- 可以直接访问外部类的所有成员,包含私有类
- 不能添加访问修饰符,因为它的地位等同于一个局部变量,但是可以有final 修饰
- 作用域:仅仅在定义它的方法或代码块中
- 内部类访问外部类可直接访问,外部类访问内部类需要创建对象
- 外部其他类不能访问局部内部类,因为局部内部类地位是一个局部变量
- 如果外部类和局部内部类的成员重名,默认就近原则,如果想访问外部类的成员则可以用 外部类名.this.成员 去访问。
匿名内部类的使用
- 本质是类
- 没有名字
- 同时还是一个对象
基本语法:
new 类或接口(参数列表){
类体
};
注意事项
- 可以直接访问外部类所有成员,包含私有的
- 蹦年添加访问修饰符
- 作用域仅在定义它的方法和代码块中
- 外部其他类不能访问匿名内部类
成员内部类
- 可以直接访问外部类的所有成员包括私有
- 可以添加任意访问修饰符
- 成员内部类访问外部类成员
- 外部类访问成员内部类:创建对象在访问
静态内部类
静态内部类是定义在外部类的成员位置,并且有static修饰
- 可以直接访问外部类的所有静态成员。包含私有的不能直接访问非静态成员
- 可以添加任意修饰符
- 作用域:同其他的类为整个类体
- 静态内部类访问外部类,可以直接访问静态成员
- 外部类访问静态内部类,创建对象才能访问
- 外部其他类访问静态内部类
- 如果外部类和静态内部类重名,依然遵循就近原则