继承是多态的前提,没有继承就没有多态。安全
继承主要解决的问题:共性抽取。ide
父类,也能够叫基类,超类this
子类,也能够叫派生类.net
继承关系中,子类能够拥有父类的内容,子类还能够拥有本身专有的内容。子类就是一个父类,子类能够被看成父类看待。子类is a父类。对象
格式:public classs 子类名称 extends 父类名称{}继承
在父子类的继承关系中,若是成员变量重名,则建立子类对象时,访问有两种方法:接口
直接经过子类对象访问成员变量:get
等号左边是谁,就优先用谁,没有则向上找编译
间接经过成员方法访问变量:class
该方法属于谁,就优先用谁,没有则向上找
当局部变量,子类成员变量和父类成员变量三者都同名
局部变量 直接写成员变量名
子类成员变量 this.成员变量名
父类成员变量 super.成员变量名
当子类成员方法和父类成员方法重名时,对象是谁,优先用谁,没有时向上寻找。
子类重写父类的成员方法:在继承关系中,方法的名称和参数列表都同样,则发生重写。
重写的特色:建立的是子类对象,则优先使用子类方法
注意:一、能够经过在方法前面添加注解@override,检测是否是正确的覆盖重写
二、子类方法的返回值必须小于等于父类方法的返回值
三、子类方法的权限必须大于等于父类方法的权限,public->protected->private
在继承关系中,父子类构造方法的访问特色:
一、子类构造方法当中默认隐含一个super();,因此必定是先调用父类的构造,后执行子类的构造
二、子类构造能够经过super关键字来调用父类构造的重载
三、super的父类构造调用必须是子类构造方法的第一个语句,一个子类只能调用一次父类的构造
总结:super关键字的三种用法:一、在子类的成员方法中,调用父类的成员变量
二、在子类的成员方法中,调用父类的成员方法
三、在子类的构造方法中,调用父类的构造方法
this关键字的三种用法:一、在本类的成员方法中,调用本类的成员变量
二、在本类的成员方法中,调用本类的成员方法
三、在本类的构造方法中,调用本类的另外一个构造方法,若是有this,不能使用super,反之同样。
Java继承的三个特色:一、Java语言是单继承的,一个类直接的父类只能有一个。
二、Java语句能够多级继承
三、一个子类的父类是惟一的,可是一个父类能够拥有多个子类
抽象方法:若是父类当中的方法不肯定如何进行方法体的实现,那么就应该是一个抽象方法
抽象方法的定义格式:在方法返回值前面加上abstract关键字,而后去掉大括号,直接分号结束。注意:抽象方法所在的类必须是抽象类才行,在class以前加上abstract便可。
如何使用抽象类和抽象方法的使用:一、不能直接使用new建立抽象类
二、必须用一个子类来继承抽象父类
三、子类必须覆盖重写抽象父类当中全部的抽象方法
四、建立子类对象进行使用
注意:一、抽象类中,能够有构造方法,是供子类建立对象时,初始化父类成员使用的
二、抽象类中,不必定包含抽象方法,可是抽象方法的类必须是抽象类
三、抽象类的子类,必须重写抽象父类中的全部的抽象方法,不然,编译没法经过,除非子类也是抽象类
接口(interface):一种公共的规范标准,是一种引用数据类型
定义一个接口: public interface 接口名称{接口内容;}
接口中能够包含的内容:一、常量
二、抽象方法
三、默认方法(Java8以上)
四、静态方法(Java8以上)
五、私有方法(Java9以上)
扩展:一、接口当中的抽象方法修饰符都是public abstract ,而且能够选择性省略。public abstract 返回值类型 方法名称(参数列表);
二、接口默认方法的定义 public default 返回值类型 方法名称(参数列表){方法体;},解决接口升级的问题。接口的默认方法能够经过接口的实现类的对象直接调用,也能够被实现类覆盖重写再调用。
三、接口的静态方法的定义:public static 返回值类型 方法名称(参数列表){方法体;},不能经过接口实现类的对象调用静态方法,应该经过接口名称直接调用静态方法。
四、接口的私有方法分为:一、普通私有方法 :private 返回值类型 方法名称 (参数列表){方法体;},解决多个默认方法之间重复代码的问题
二、静态私有方法:private static 返回值类型 方法名称 (参数列表){方法体;},解决多个静态方法之间重复代码的问题
五、接口的常量 : public static final 数据类型 常量名称 = 数据值
接口不能直接使用
一、必须有一个实现类来实现该接口
public class 实现类名称 implement 接口名称{}
二、接口的实现类必须覆盖重写接口中的全部抽象方法。
三、建立实现类的对象,进行使用
注意:一、若是实现类没有覆盖接口中全部的抽象方法,那么这个实现类本身必须是抽象类
二、接口没有静态代码块和构造方法
三、一个类的父类只有一个,可是一个类能够同时实现多个接口。
四、若是实现类所实现的多个接口中,存在重复的抽象方法,实现一次就好。
五、若是实现类所实现的多个接口中,存在重复的默认方法,实现类必须覆盖重写重复的默认方法。
六、一个实现类的父类方法和接口中的默认方法重复,优先使用父类方法。
接口的能够多继承的,多个父接口但在的抽象方法重复,不要紧,默认方法重复,子接口要覆盖重写一个同名的默认方法
多态:一个对象拥有多种形态,子类形态和父类形态
多态的使用:父类引用指向子类 父类名称 对象名 = new 子类名称() 或者 接口名称 对象名 = new 实现类名称()
当使用多态时访问成员变量:一、直接经过对象名称访问成员变量,看等号左边是谁,优先用谁,没有则向上寻找
二、间接经过成员方法访问成员变量,看该方法属于谁,优先用谁,没有则向上寻找
在多态的代码中,成员方法访问的规则:看New的是谁,就优先使用谁,没有则向上寻找
使用多态的好处:不管右边new的时候换成哪一个子类对象,等号左边调用方法都不会改变
对象的向上转型:其实就是多态的写法 父类名称 对象名 = new 子类名称();
注意:向上转型必定是安全的,从小范围到大范围,一旦向上转型为父类,那么就没法调用子类特有的内容
对象的向下转型:将父类对象还原成原本的子类对象, 子类名称 对象名 = (子类名称)父类对象
注意:必须保证对象原本建立的子类对象和向下转型的对象一致。
instanceof关键字:判断前面的对象能不能看成后面类型的实例 , 对象 instanceof 类名称 ,返回一个boolean值。用来判断是否能向下转换。
final关键字:最终的,不可变的
四种做用:一、用来修饰一个类,public final class 类名称{},表示当前的类不能有任何子类。
二、用来修饰一个方法,public final 返回值类型 方法名 (参数列表){方法体},表示当前的方法不能被子类覆盖重写。
三、用来修饰一个局部变量,final 数据类型 数据名称 = 表达式 ,一次赋值,不能更改,常量,注意基本数据类型值不变,引用类型地址不变
四、用来修饰一个成员变量,那么这个变量照样不变,可是由于成员变量具备默认值,因此用来final必须手动直接赋值或者构造方法赋值,且全部构造方法都进行了赋值。
四种权限修饰符:一、public
二、protected
三、default
四、private
对应的四种状况:一、同一个类:四种权限修饰符都能访问
二、同一个包:除了private 其余均可以
三、不一样的包子类:除了private 和default 其余均可以
四、不一样的包非子类:就public 能够
内部类:一个类的内部包含另外一个类
分类:一、成员内部类
二、局部内部类(包含匿名内部类)
成员内部类:修饰符 class 类名称 {
修饰符 class 类名称{}
}
注意:内部类使用外部类,能够随意访问,外部类使用内部类必须使用内部类对象
使用内部类:一、在外部类的方法当中,使用内部类,而后在main只是调用外部类的方法
二、直接使用,外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()
内部类同名变量访问:若是出现重名的现象,使用外部类名称.this.变量名称 访问外部类成员变量。
局部内部类:只有当前所属的方法才能使用它,出了这个方法外面就不能用
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名 (参数列表){
class 局部内部类名称{
}
}
}
注意:局部内部类若是但愿访问所在方法的局部变量,那么这个局部变量必须是有效final。(final可写可不写,可是局部变量必须不能改变)
类的权限修饰符:
外部类: public /default
成员内部类:public /protected/ private/default
局部内部类:什么都不写
匿名内部类:若是接口的实现类或者父类的子类,只须要使用一次,这种状况下就能够省略掉该类的定义,而改成使用匿名内部类
定义格式: 接口名称 对象名 = new 接口名称 (){须要覆盖的方法;}