目录
一、面向对象的三大特征是什么?
访问修饰符的权限
static关键字
1、封装
2、继承
重写
抽象类
1、定义
2、特点
3、面试题
接口
1、定义
2、接口的好处:
3、接口中成员组成部分(特点)
3、多态
1、定义
2、实现多态的前提
3、多态的对象转型
4、在多态环境下,方法和属性的调用规则
总结:
1、封装(隐藏):对类中的成员属性进行私有化,对类中的成员方法公共。
2、继承:一个类A可以继承另一个类B,这里的类A就是类B的子类,类A可以继承类B的属性和方法,也可以定义自己的属性和方法。
3、多态:为了适应需求的多种变化,类可以呈现多种形态,使代码更加通用。
用于修饰类,属性,方法的关键字都称为访问修饰符
1、public :公共的
可被同一个项目的所有类方法(项目可见性)
2、protected :受保护
可以被自身的类访问
可以被同包下的其他类访问
对于不同包的,存在父子关系的子类可以访问
3、默认的
可以被自身类访问
可以被同包下的其他类访问
4、private: 私有的
只能被自身类访问
static表示“静态” ,它可以修饰 属性,方法,代码块 , 在一个类中除了可以定义成员属性、成员方法和构造器以外,还可以定义静态的部分(静态属性,静态方法,静态代码块)
static 修饰属性:称为 静态属性或类的属性。静态属性可以通过类名访问,也可以通过对象名访问
static修饰方法:称为静态方法或类的方法。静态方法只能访问静态属性,不能访问成员属性(非静态属性)
static修饰的语句块: 称为静态代码块
static修饰的组件不需要通过对象访问,而是直接通过类名访问,在类一加载时会给static修饰的属性和方法分配内存区,这个内存分布在 静态内存区中。后续所有对象操作的是同一个内存区
// 类的组件执行顺序
// 类编译成.class文件被JVM的类加载器加载-》
// 从上往下初始化static修饰的组件
// (静态属性,静态代码块,静态方法,其中静态方法调用才执行,静态属性和静态代码块直接分配内存)-》
// --》构造代码块-》执行构造器 -》初始化成员属性,成员方法
对代码的封装包括两层意思:
1、对类的成员属性的封装 :
将属性私有化(private),提供对属性的访问给属性添加公用的getter和setter方法, 对于boolean类型的属性,需要使用isXxx返回属性的值。
2、对代码的封装:
为了提高代码的复用性,尽量使用方法加参数传递对代码进行封装,并使该方法公有(public)
封装的优点:
1、良好的封装可以减少类的耦合性(类与类的关联)
2、对类中封装的代码可以自由修改,而不会影响其他类
3、最大程度提高类中属性的隐蔽性 和对属性的控制
当多个类中都存在相同的属性和行为时,可以将这些共有的属性和行为定义到一个新的类中,让其他类服用这个新类的属性和行为,这种关系就是继承关系。其中 被继承的类是 父类(超类,基类),继承父类的类就是子类(新类,派生类)。
2.1 子类继承父类,子类拥有父类的哪些属性和方法?
可访问: 子类拥有父类的共有的属性和方法, 同包下面的属性和方法,不同包下的受保护的也可以访问
不可访问: 其中子类不能继承 父类的私有的属性和方法、不同包的默认属性和方法 ,不能继承父类的构造器
2.2 子类继承父类,子类如何访问父类的属性和方法
属性: 子类通过super 关键字访问父类的属性 ,子类通过this关键字访问自己的属性
方法:子类通过super挂件自方法父类的方法, 子类通过this关键字访问自己的方法
注意: 这里的this和super可以省略,省略后子类通过“就近原则”访问属性和方法(子类中存在就访问子类的,子类中不存在,就访问父类的。)
super.属性
super.方法(参数)
构造器:子类通过super([参数]) 调用父类的构造器, 子类通过this([参数])调用 自己类的其他构造器,其中 super(参数[]) 必须写在子类构造器的第一行
注意:可以通过在子类构造器手动调用父类的有参构造器给父类的属性赋值 ,但子类构造器中默认调用父类的无参构造器 。所以一旦在父类中写了有参构造器覆盖了无参构造器后,需要再写一个无参构造器。
子类可以继承父类的方法,但是当父类的方法不能满足子类的需要时,子类可以重写父类的方法
重写的必要条件:
1、两个方法名必须相同,且存在不同类中(父子关系的类)
2、子类重写的父类的方法,其方法的参数和返回值必须完全一样,方法的具体实现可不一样
3、访问修饰符必须大于或等于父类的修饰符
注意: 子类的对象 调用父类方法时,如果子类重写了父类的方法,则执行子类的方法,没有重写执行父类的方法。
面试题:
说一下方法的重写与重载的区别?
1、重写存在于父子关系中的不同类,重载存在同类中
2、重写必须满足 方法名相同,且参数相同,返回值相同 ,重载满足方法名相同,参数不同,与返回值无关。
3、重写的访问修饰符必须 子类大于等于父类, 重载没有要求
什么情况下需要定义抽象类?
1、当这个类不需要创建具体的实例时,可将类定义为抽象的
2、当这个类中存在没有实现的方式时(没有方法体的方法),可以将这个类定义抽象的
2.1 抽象类 不能实例化(不能new) ,通常抽象被当作父类使用
2.2 抽象类中 可以有抽象方法( 没有方法体的方法) 也可以有普通方法
2.3 抽象类被当作父类时,它的子类必须重写父类的抽象方法
抽象方法和非抽象方法的区别
回答: 抽象方法没有方法体,需要使用abstract修饰, 只能写在抽象类中
非抽象方法就是普通方法(成员方法或静态方法) ,可以写在抽象类中或普通类中。
接口用于对某件事物的功能的声明,而没有实现具体功能 ,接口提供对软件开发的标准规范。
利用接口的“多实现”完成Java的单一继承。
1、为了规范实现类的行为,让所有的方法都通过接口定义
2、为了提高代码的可扩展性
接口定义实现类的对象 和 实现类定义试下类的对象的区别?
接口定义实现类的对象只能调用接口中定义的方法, 实现类定义的对象既可以调用实现类的方法,也可以调用接口类的方法。
接口中定义的变量默认全部是 public static final 修饰的
接口中的静态方法可以直接调用。
接口中不能写构造器(因为接口不能实例化,不需要构造器)
接口中的方法全部都是 抽象方法, 在JDK8以后可以定义default的非抽象方法
一个类既可以继承一个类 也可以实现多个接口
一个类可以实现多个接口,中间用逗号分隔 (那么这个类要实现接口的所有方法)
一个接口可以继承 接口,或多个接口(接口可以多继承)
同一种行为对于不同的事物呈现的不同形态就是多态的表现。
基于继承关系或基于实现关系的
子类或实现类必须对方法进行重写(没有重写的方法 不具有多态行为)
父类的引用指向子类对象( 接口的引用指向实现类的对象)
1、子类对象转父类对象时,称为向上转型是默认转换,自动转型
2、父类的引用转成子类对象,称为向下转型,向下转型需要强转 , 为了避免转换错误,需要先判断数据类型是否匹配
instanceof : 判断该对象是否属于 这个类型
为什么需要做类型换行呢? 有时候我们需要调用子类特用的方法时必须用子类的引用。所有多态对象下父类应用需要强转。
为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验,格式如下:
变量名 instanceof 数据类型如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false
属性: 当子类和父类中存在相同属性时 ,以 对象的左边引用类型为依据,所谓“看左边”
方法: 以当前new出来的对象为依据,如果方法重写了,就调用子类方法,如果方法没有重写 调用父类方法
静态方法: 无论方法是否有重写, 都已对象左边的引用类型为依据。
1、抽象类与接口的区别
共同点: 它们都是抽象的,都不能实例化
区别:
1、抽象类是类 使用abstract修饰,接口使用interface定义
2、抽象类中可以包含抽象方法和普通方法, 接口中是纯粹的抽象类,都是抽象方法,除使用default定义以外
3、子类继承抽象类,必须实现抽象类的方法,或者自身变为抽象类
接口中是实现关系,实现类必须实现接口的所有方法,接口的变量是public static final
2、重载和重写的区别?
3、在java中如何实现多态(多态的前提条件)?
4、final的作用
final修饰变量 定义为常量
final 修饰方法 不能被重写
final 修饰类 则不能被其他子类继承