“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情”
一、概念
父类更抽象更一般,子类更具体更特殊 继承的意义,代码重用
- 继承,基于已存在的类来构建新类
- 当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应付需求
- 约定:从其他类导出的类叫子类,被导出的类叫父类
- 在java中,除了Object类外,所有类都是子类,都有唯一的父类
二、extends关键字
在java中,用extends关键字来表示一个类继承了另一个类
三、super关键字
私有属性方法,子类无法继承
- super和this的特点相似:super代码父类对象的引用,this该类对象引用
- 当子父类的成员出现同名时,可以通过super来区分
- 子类的构造方法中,通过super关键字调用父类的构造方法 当构造一个子类对象的时候一定会先调用父类的构造方法来构造父类的对象。调用父类构造方法的语句必须是子类构造方法中的第一条指令。
四、方法重写
什么是方法重写,重载(方法名称一样,参数列表不一样),重写(完成做到重写,都一样,实现功能不一样)
- 方法重写是指子类可以根据需要对父类继承来的方法进行改写,是多态机制的前奏 注意点
- 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值
public void printInfo(){
super.printInfo(); //用super调用父类方法
System.out.println("子类name=" + name); //不写父类的会优先调用子类方法
}
- 重写方法不能比被重写方法有更加严格的访问权限
private void printInfo(){
super.printInfo();
System.out.println("子类name=" + name);
}
- 父类中的私有方法,不能被重写 能写上,但是主函数不能调用,报错
private void printAddr(){
System.out.println("私有方法");
}
- 在子类重写的方法中继续使用父类被重写的方法可以通过super.函数名获取
五、Object类
- java中,所有类都直接或间接继承自java.lang.Object类,可以说Object是java中所有类的祖先即根类
- java中任何类都继承了Object类中的方法,主要有 toStrring() equals() hashcode() clone() getClass() finalize()
六、抽象方法
- 抽象类 java中可以定义没有方法体的方法称为抽象方法,该方法由子类具体实现,含有抽象方法的类称为抽象类
- 抽象方法的特点 只有方法头没有方法体的方法 抽象方法用abstract修饰 抽象方法代表一种不确定的操作或行为 抽象方法不能被调用
- 抽象方法的特点 定义中含有抽象方法的类叫抽象类 抽象类用abstract来修饰 抽象类代表一种抽象的对象类型 抽象类才能实例化 抽象类中可以有具体方法,可以没有抽象方法
七、接口
- 接口语法 interface 接口名{ //公有静态常量、抽象方法 }
- 接口的特点 1.接口中只能存放静态常量和抽象方法 2.java接口是对功能的扩展 3.通过实现接口,java类可以实现多实现 一个类可以同时继承一个父类并且实现(implements)多个接口 4.接口与接口之间可以使用extends实现继承
- 接口与抽象类的区别 接口强调行为,继承是类似于亲属关系的 1.抽象类和具体实现之间是一个继承关系,也就是如果采用抽象类的方式,则父类和子类在概念上应该是相同的 is-a 2.接口和实现类在概念上不要求相同,接口只是抽取相互之间没有关系的类的共同特征,而不去关注类之间的关系,它可以使没有层次关系的类具有相同的行为 3.抽象类是对一组具有相同属性和行为的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和行为的逻辑上不相关的事物的一种抽象
八、内部类
8.1、内部类概念
就是将一个类定义在另一个类的内部,内部的类简称内部类
8.2、内部类特点
- 内部类可以很好的实现隐藏,可以使用protected private修饰符
- 内部类可以直接访问外部类的所有成员,包括私有的成员
- 外部类不能直接访问内部类的成员,必须首先建立内部类的对象才能访问
8.3、成员内部类及应用
- 成员内部类属于外部类的实例成员,成员内部类可以有public private default protected权限修饰符。在成员内部类中访问外部类的成员方法和属性,要使用“外部类名.this.成员方法”和“外部类名.this.成员属性”的形式
- 创建成员内部类的实例使用“外部类名.内部类名 实例 = 外部类实例名.new 内部类构造方法(参数)”的形式
class Outter{
int data;
public void Outprint(){
System.out.println("外部类");
}
class Inner{
int data;
void Innerprint(){
System.out.println("内部类");
//内部类访问外部类,外部类名.this.成员方法”和“外部类名.this.成员属性
Outter.this.Outprint();
System.out.println("外部类data=" + Outter.this.data);
}
}
}
public class Test {
public static void main(String[] args) {
//实例化内部类,外部类名.内部类名 实例 = 外部类实例名.new 内部类构造方法(参数)
Outter o = new Outter();
o.data = 110;
Outter.Inner i = o.new Inner();
i.Innerprint(); //使用内部类方法
}
}
/*
内部类
外部类
外部类data=110
*/
8.4、匿名内部类
通常用在:线程、安卓按键响应
- 匿名内部类是没有名称的内部类,没办法引用它们。必须在创建时,作为new语句的一部分来声明并创建它们的实例
- 匿名内部类必须继承一个类(抽象的,非抽象的都可以)或者实现一个接口,所有父类(或父接口)是抽象类,则匿名内部类必须实现其所有抽象方法
语法:实例 newinterface/superclass(){类体} 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口,并同时创建该匿名类的一个新实例