六、面向对象进阶一
-
构造器的作用?
-
初始化类的对象,并返回对象的地址
-
-
构造器有几种,各自的作用是什么?
-
无参构造器:初始化对象时,成员变量的数据均采用默认值
-
有参构造器:在初始化对象时,同时可以为对象进行赋值
-
-
构造器有哪些注意事项?
-
任何类定义出来,默认就自带了无参构造器,写不写都有
-
一旦定义了有参构造器,无参构造器就没有了,此时就需要自己写无参构造器了
-
this关键字的作用?
-
代表当前对象的地址,可以用于指定访问当前对象的成员变量、方法
成员变量的分类和访问分别是什么样的?
-
静态成员变量(有static修饰,属于类、加载一次,可以被共享访问),访问格式1: 类名.静态成员变量(推荐) 访问格式2:对象.静态成员变量(不推荐)
-
实例成员变量(无static修饰,属于对象),访问格式:对象.实例成员变量
两种成员变量各自在什么情况下定义?
-
静态成员变量:表示在线人数等需要被共享的信息
-
实例成员变量:属于每个对象,且每个对象信息不同时(name,age……等)
成员方法的分类和访问分别是什么样的?
-
静态成员方法(有static修饰,属于类和对象共享)访问格式1:类名.静态成员方法 访问格式2:对象.静态成员方法(不推荐)
-
实例成员方法(无static修饰,属于对象)的访问格式:对象.实例成员方法
每种成员方法的使用场景是怎么样的?
-
表示对象自己的行为的,且方法中需要访问实例成员的,则该方法必须申明成实例方法
-
如果该方法是以执行一个通用功能为目的,或者需要方便访问,则可以申明成静态方法
工具类是什么,有什么好处?
-
内部都是一些静态方法,每个方法完成一个功能
-
一次编写,处处可用,提高代码的复用性。
工具类有什么要求?
-
建议工具类的构造器私有化处理
-
工具类不想要创建对象
static访问注意:
-
静态方法只能访问静态的成员,不可以直接访问实例成员
-
实例方法可以访问静态的成员,也可以访问实例成员
-
静态方法中不可以出现this关键字
代码块
-
静态代码块
-
静态代码块的作用是什么?
-
如果要再启动系统时对数据进行初始化,建议使用静态代码块完成初始化操作,代码优雅
-
-
格式:static{}
-
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
-
使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用
-
-
构造代码块(了解,用的少)
-
格式:{}
-
特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行
-
使用场景:初始化实例资源
-
什么是设计模式
-
设计模式是一套被前人反复使用、多数人知晓、经过分类编目的代码设计经验的总结,后来者可以直接拿来解决问题
-
设计模式是软件设计中的常见解决方案,好的设计模式可以进一步的提高代码的复用性
单例模式
-
可以保证系统中,应用该模式的这个类永远只有一个实例,即这个类永远只能创建一个对象
-
场景和作用
-
例如任务管理器对象我们只需要一个就可以解决问题了,这样可以节省内存空间
-
什么是继承
-
继承是类与类之间的一种关系
-
多个类继承单独的某个类,多个类就可使用单独的这个类的属性和行为了
-
多个类称为子类(派生类),单独的这个类称为父类(基类,或超类)
-
使用继承的好处:提高代码复用,减少代码冗余,增强类的功能性扩展
-
继承的格式:
-
在Java中,继承的关键字用的是”extends“
-
例:public class 子类名 extends 父类名{}
-
-
继承后子类的特点
-
子类继承父类,子类继承父类的属性和行为,但是不能继承父类的构造器
-
Java中子类更强大
-
Java是单继承模式:一个类只能继承一个直接父类
-
Java不支持多继承,但是支持多层继承
-
Java中所有的类都是Object类的子类
-
-
Object特点:
-
Java中所有类,要么直接继承了Object,要么默认继承了Object,要么间接继承了Object,Object是祖宗类
-
-
继承设计规范:
-
子类们相同特征(共性属性,共性方法)放在父类中定义,子类独有的属性和行为应该定义在子类里面
-
为什么?
-
如果子类的独有属性、行为定义在父类中,会导致其他子类也会得到这个属性和行为,这不符合面向对象逻辑
-
-
-
在子类方法中访问成员(成员变量、成员方法)满足:就近原则
-
先子类局部范围找
-
然后子类成员范围找
-
然后父类成员范围找,如果父类范围还没有找到则报错
-
-
如果字符类中,出现了重名的成员,会优先使用子类的,此时如果一定要在子类中使用父类的怎么办?
-
可以通过super关键字,指定访问父类的成员
-
格式:super.父类成员变量/父类成员方法
-
-
-
方法重写
-
在继承体系中,子类中出现了和父类中一摸一样的方法声明,我们就称子类这个方法是重写的方法。
-
-
方法重写的应用场景
-
当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。
-
子类可以重写父类中的方法
-
-
@Override重写注解
-
@Override是放在重写后的方法上,作为重写是否正确的校验注解
-
加上该注解后如果重写错误,编译阶段会出现错误提示
-
建议重写方法都加@Override注解,代码安全,优雅
-
-
方法重写注意事项和要求
-
重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致
-
私有方法不能被重写。
-
子类重写父类方法时,访问权限必须大于或者等于父类(暂时了解:public>protected>缺省)
-
子类不能重写父类的静态方法,如果重写会报错
-
-
子类继承父类后构造器的特点:
-
子类中所有的构造器默认都会先访问父类中的无参构造器,在执行自己
-
为什么?
-
子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法在使用父类的数据
-
子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化
-
-
-
怎么调用父类构造器?
-
子类构造器的第一行语句默认都是:super(),不写也存在
-
-
super调用父类有参数构造器的作用:
-
初始化继承自父类的数据
-
-
如果父类中没有无参构造器,只有有参构造器,会出现什么现象呢?
-
会报错,因为子类默认是调用父类无参构造器的
-
如何解决?
-
子类构造器中可以通过书写super(……),手动调用父类的有参构造器
-
-
-
this和super详情
-
this:代表本类对象的引用; super:代表父类存储空间的标识
-
关键字 访问成员变量 访问成员方法 访问构造方法 this this.成员变量 访问本类成员变量 this.成员方法(…) 访问本类成员方法 this(…) 访问本类构造器 super super.成员变量 访问父类成员变量 super.成员方法(…) 访问父类成员方法 super(…) 访问父类构造器 -
this(……)和super(……)使用注意点:
-
子类通过this(……)去调用本类的其他构造器,本类其他构造器会通过super去手动调用父类的构造器,最终还是会调用父类的构造器
-
注意:this(……)super(……)都只能放在构造器的第一行,所以二者不能共存在同一个构造器中
-
-