深入学习面向对象
static、继承、包、final、权限修饰符、代码块、抽象类、接口、多态、内部类
一、static
static表示静态,是JAVA中的一个修饰符,可以修饰成员方法、成员变量。
1.1静态变量
被static修饰的成员变量,叫做静态变量
特点:
(1)被该类所有对象共享
(2)不属于对象,属于类
(3)随着类的加载而加载,优先于对象存在
调用方式:
1、类名调用(推荐)
2、对象名调用
例子:
private String student;//在JavaBean里面
public static String teachername;//在JavaBean里面 老师是共享的,所以可以用static修饰
Student.teacherName = "丸子老师"; //假设JavaBean类类名为Student,直接用类名调用静态变量就好
2.1静态方法
被static修饰的成员方法,叫做静态方法
特点:
(1)多用在测试类和工具类中
(2)JavaBean类中很少会用
调用方式:
(1)类名调用(推荐)
(2)对象名调用
2.2补充解释工具类、测试类、JavaBean类
JavaBean类:用来描述一类事物的类。比如,Student、Teacher、Dog、Cat等
测试类:用来检查其他类是否书写正确,带有main方法的类,是程序的入口
工具类:不是用来描述一类事物的,而是帮我们做一些事情,但是不描述任何事物的类
工具类:
(1)类名见名之意
(2)私有化构造方法(因为没有实际意义)
(3)方法定义为静态(方便调用,统一的)
3.1static的注意事项
(1)静态方法只能访问静态变量和静态方法
(2)非静态方法可以访问静态变量或者静态方法,也可访问非静态变量或者非静态方法
(3)静态方法中是没有this关键字的
(4)因为测试类中的main方法是静态的,所以测试类中其他方法也是静态的
面向对象三大特征:封装、继承、多态
二、继承
1、概念
(1)继承是面向对象三大特征之一,可以让类和类之间产生子父关系;
(2)可以把多个子类中重复的代码抽取到父类中,子类可以直接使用,减少代码冗余,提高代码复用性;
(3)继承的格式:public class 子类 extends 父类 { };
(4)继承后,子类可以得到父类的属性和行为,子类可以使用;子类可以在父类的基础上新增其他功能,使子类更加强大。
2、继承的特点
JAVA只支持单继承,不支持多继承,但支持多层继承
JAVA中所有的类都直接或间接继承与Object类
多层继承:子类A继承父类B,父类B可以继承父类C
子类只能访问父类中非私有的成员
3、子类能继承父类的哪些内容
非私有 | private | |
构造方法 | 不能 | 不能 |
成员变量 | 能 | 能 |
成员方法 | 能 | 不能 |
能继承,但不一定能用!!!!
4、就近原则
5、方法的重写
当父类的方法不能满足子类现在的需求时,需要进行方法的重写
书写格式:
在继承体系中,子类出现了和父类中一模一样的方法声明,我们称子类这个方法是重写方法
@Override重写注解
1、@override是放在重写后的方法上,校验子类重写是语法是否正确
2、加上注解后如果有红色波浪线,表示语法错误
3、建议重写方法都加@Override注解
方法重写注意事项和要求:
1、重写方法的名称、形参列表必须与父类中的一致
2、子类重写父类方法时,访问权限子类必须大于等于父类
3、子类重写父类方法时,返回值类型子类必须小于等于父类
4、建议:重写的方法尽量和父类保持一致
5、私有方法不能被重写
6、子类不能重写父类的静态方法,如果重写会报错的
三、多态
1、什么是多态
对象的多种形态
2、多态的前提
有继承/实现关系
有父类引用指向子类对象
有方法重写
3、多态的好处
使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利
4、多态调用成员变量和成员方法
调用成员变量:编译看左边,运行也看左边
调用成员方法:编译看左边,运行看右边
5、多态的优势和弊端
优势:方法中,使用父类型作为参数,可以接收所有子类对象
弊端:不能使用子类的特有功能,()但可以强转)
引用数据类型的类型转换有2种方式:自动类型转换、强制类型转换
强制类型转换能解决什么问题?
(1)可以转换成真正的子类类型,从而调用子类独有功能
(2)转换类型与真实对象类型不一致会报错
(3)转换的时候用instanceof关键字进行判断
四、包和final
包
包:就是文件夹,用来管理各种不同功能的JAVA类,方便后期代码维护
包名的规则:公司域名反写 + 包的作用,需要全部英文小写,见名之意。
全类名:包名+类名
不需要导包的情况:
1、使用同一个包中的类时,不需要导包
2、使用java.lang包中的类时,不需要导包
3、其他情况都需要导包
4、如果同时使用两个包中的同类名,需要用全类名
final
方法:表明该方法时最终方法,不能被重写
类:表明该类是最终类,不能被继承
变量:叫做常量,只能被赋值一次
(常量的概念:
实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性
常量的命名规范:
单个单词:全部大写
多个单词:全部大写,单词间用下划线隔开)
细节:
1、final修饰的变量是基本类型:那么变量储存的数据值不能发生改变
2、final修饰的变量是引用类型:那么变量储存的地址值不能发生改变,对象内部的可以改变
五、权限修饰符和代码块
权限修饰符
是用来控制一个成员能够被访问的范围的
可以修饰成员变量,方法,构造方法,内部类
权限修饰符的分类:
有四种作用范围由小到大(private<空着不写<protected<public)
修饰符 | 同一个类中 | 同一个包中其他类 | 不同包下的子类 | 不同包下的无关类 |
private | √ | |||
空着不写 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
权限修饰符的使用规则
实际开发中,一般只用private和public
1、成员变量私有
2、方法公开
特例:、
如果方法中的代码是抽取其他方法中共性代码,这个方法一般也私有
代码块
1、局部代码块:
提前结束变量的生命周期(已淘汰)
2、构造代码块:
抽取构造方法中的重复代码(不够灵活)
3、静态代码块 :
数据的初始化(重点)
静态代码块
格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次
使用场景:在类加载的时候,做一些数据初始化的时候使用
六、抽象类和抽象方法
1、抽象类的作用:
抽取共性时,无法确定方法体,就把方法定义为抽象的,强制让子类按照某种格式重写。
抽象方法所在的类,必须是抽象类。
2、抽象类和抽象方法的格式:
public abstract 返回值类型 方法名(参数列表);
public abstract class 类名{};
3、继承抽象类有哪些要注意:
(1)要么重写抽象类中的所有抽象方法
(2)要么是抽象类
七、接口
1、接口中成员的特点
(1)成员变量:只能是常量(默认修饰符:public static final )
(2)构造方法:没有
(3)成员方法:只能是抽象方法(默认修饰符:public abstract )
(4)JDK7以前:接口中只能定义抽象方法
(5)JDK8的新特性:接口中可以定义有方法体的方法(默认/静态)
(6)JDK9的新特性:接口中可以定义私有方法
2、接口和类之间的关系
(1)类和类之间的关系:继承关系,只能单继承,不能多继承,但是可以多层继承
(2)类和接口的关系:实现关系,可以单实现,也可以多实现,还可以再继承一个类的同时实现多个接口
(3)接口和接口的关系:继承关系,可以单继承,也可以多继承
八、内部类
1、什么是内部类
类的五大成员:属性、方法、构造方法、代码块、内部类
写在一个类里面的类就叫做内部类
2、内部类的访问特点
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
3、什么时候用到内部类
B类表示的事物是A类的一部分,且B单独存在没有意义。
比如:汽车的发动机,ArrayList的迭代器,人的心脏等
4、内部类的分类
(1)成员内部类:了解
(2)静态内部类:了解
(3)局部内部类:了解
(4)匿名内部类
匿名内部类本质上就是隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置
格式: 继承\实现关系(整体就是一个类的子类对 象或者接口的实现类对象)
new 类名或者接口名(){ 方法重写
重写方法; 创建对象
};
-----------------------------------------------------------------------------------------------------------------------------
举例:
new Inter(){
public void show(){
}
}
使用场景:
当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现
类只要用到一次,就可以用匿名内部类简化代码。