一、java面向对象
二、封装
通过该类提供的方法来实现对隐藏信息的操作和访问。
隐藏对象的信息
留出访问的接口
修改属性的可见性(private)→创建getter/setter方法(设为public用于属性的读写)→可以在getter/setter方法中对于数据的获取和赋值进行一些逻辑设定
(一)包
(二)static
static+属性
静态属性、类属性
static+方法
静态方法、类方法
static+类
不存在静态类
static+方法内局部变量
不存在方法中的静态局部变量
static+代码块
普通代码块:存在于方法内
构造代码块:存在于类中
静态代码块:static+构造代码块
(三)注意问题:
1、静态成员的生命周期
随着类的加载而产生,直到类的消亡才回收,生命周期长
2、静态方法中的成员调用
静态方法中只能直接调用同一个类中的静态成员,不能直接访问同一个类中的非静态成员
只能通过对象实例化后,对象.成员方法的方式访问非静态成员
3、各种代码块的执行顺序
无论你实例化多少个对象,静态代码块只会执行一次,构造代码块在每次对象构造的时候调用,方法中的普通代码块在每次调用方法时顺序调用
三、继承(上)
概念:
1、一种类与类之间的关系
2、使用已存在的类的定义为基础建立新类
3、新类的定义可以增加新的定义或者新的功能,也可以用父类的功能,但不能选择性的继承父类
4、满足“A is a B”的关系
特点:
1、利于代码复用
2、缩短开发周期
语法:
1、使用extends实现
2、单一继承,只能有一个父类
继承后的初始化顺序
父类静态成员→子类静态成员→父类对象构建→子类对象构建
(一)super
可以通过super关键字来访问父类的成员
1、访问父类成员方法(super.成员方法)
2、访问父类属性(super.属性)
3、访问父类构造方法(super())
1、子类的构造过程中必须调用其父类的构造方法,默认调用无参的构造方法
2、如果子类的构造方法中没有显式标注,父类中又没有无参的构造方法,则编译出错
3、使用super调用父类指定构造方法,必须在子类的构造方法的第一行
(二)this pk super
1、this:当前类对象的引用
访问当前类的成员方法
访问当前类的成员属性
访问当前类的构造方法
不能在静态方法中使用
2、super:父类对象的引用
访问父类的成员方法
访问父类的成员属性
访问父类的构造方法
不能在静态方法中使用
构造方法调用时super和this不能同时出现
(三)方法重写 pk 方法重载
1、方法重写:
在满足继承关系的子类中
方法名、参数(个数、顺序)、返回值与父类相同,兼容父类类型
访问修饰符的限定范围大于等于父类方法
2、方法重载:
在同一个类中
方法名相同
参数个数、顺序、类型不同
返回值类型、访问修饰符任意
(四)访问修饰符
四、继承(下)
(一)Object类
Object类是所有类的父类
Java中每个类都可以使用Object中定义的方法
(二)final
1、修饰类表示不允许被继承
2、修饰方法表示不允许被重写,但是可以被继承
3、修饰变量表示不允许被修改
4、修饰引用类型的变量,初始化之后不能指向另一个对象,但指向的对象的内容是可以改变的
5、配合static使用,表示静态的不允许被修改的信息,比如一些配置信息
五、多态
向上转型、隐式转型、自动转型:父类的引用指向子类的对象,可以调用子类重写父类的方法和父类派生的方法,无法调用子类独有的方法。
父类中的静态方法不能被子类重写,向上转型之后,只能调用父类原有的静态方法
向下转型、强制类型转换:子类引用指向父类的对象
(一)抽象类与抽象方法
抽象类
不允许被实例化,只能被继承,可以通过向上转型,指向子类的实例
抽象方法
不允许包含方法体;子类需重写父类的抽象方法,否则子类也是抽象类
包含抽象方法的类一定是抽象类,但是抽象类里可以没有抽象方法
static final private不能与abstract共存
(二)接口
我们可以通过接口来描述不同的类型具有相似的行为特征,从而建立关系之后,以接口引用指向实现类的方式来去描述不同的类型对于接口行为的具体表现。
接口定义了某一批类所需要遵守的规范
接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法
接口访问修饰符:public 默认
接口当中抽象方法可以不写abstract关键字,访问修饰符默认public
当一个类实现接口时,需要去实现接口中的所有抽象方法,否则需要将该类设置为抽象类
接口中可以包含常量,默认public static final
测试类中调用接口中的常量:接口名.常量名
接口的引用指向一个实现类的实例时,如果接口和实现类中有同名的常量,引用.常量调用的是接口里的常量
用default修饰接口中的默认方法,默认方法可以包含方法体,一个类实现接口后,可以不重写默认方法,可以重写默认方法,并通过接口的引用调用
用static修饰接口中的静态方法,可以带方法体 ,不可被重写,可以通过接口名调用
调用静态方法方式:接口名.静态方法
调用接口中其他方法:接口名.super.其他方法名
关于多接口中重名默认方法处理的解决方案:当一个类实现多个接口,而接口当中存在同名的默认方法时,对于实现类而言,它必须要重写一个满足自己特征的方法,如果这个类已经继承一个类,它会默认调用父类中的同名方法
接口也可以继承,并且可以继承多个父接口
(三)内部类
成员内部类
获取内部类对象实例,方式1:new 外部类.new 内部类
方式2:外部类对象.new 内部类
方式3:外部类对象.获取方法
1、内部类在外部使用时,无法直接实例化,需要借由外部类信息才能完成实例化
2、内部类的访问修饰符,可以任意,但是访问范围会收到限制
3、内部类可以直接访问外部类的成员;如果出现同名属性,优先访问内部类中定义的
4、可以使用外部类.this.成员的方式,访问外部了中同名的信息
5、外部类访问内部类信息,需要通过内部类实例,无法直接访问
6、内部类编译后.class文件命名:外部类$内部类.class
静态内部类
1、静态内部类中,只能直接访问外部类的静态成员,如果需要调用非静态成员,可以通过对象实例
2、静态内部类对象实例时,可以不依赖外部类对象
3、可以通过外部类.内部类.静态成员的方式,访问内部类中的静态成员
4、当内部类属性与外部类属性同名时,默认直接调用内部类中的成员;
如果需要访问外部类中的静态属性,则可通过 外部类.属性 的方式;
如果需要访问外部类中的非静态属性,则可以通过 new 外部类().属性 的方式;
方法内部类
定义在外部类方法中的内部类,也称局部内部类
方法内定义的局部变量只能在方法里使用
方法内不能定义静态成员
不能通过public、private、protected去进行成员的访问设定
1、定义在方法内部,作用范围也在方法内
2、和方法内部成员使用规则一样,calss前面不可以添加public、private、protected、static
3、类中不能包含静态成员
4、类中可以包含final、abstract修饰的成员
匿名内部类
1、匿名内部类没有类型名称、实例对象名称
2、编译后的文件命名:外部类$数字.class
3、无法使用private、public、protected、abstract、static修饰
4、无法编写构造方法,可以添加构造代码块
5、不能出现静态成员
6、匿名内部类可以实现接口也可以继承父类,但是不可兼得