------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、继承
1、定义:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
1) 这多个类称为子类,单独这个类称为父类或者超类。
2) 子类可以直接访问父类中非私有的成员变量与成员方法。
2、格式:通过 extends 关键字让类与类之间产生继承关系
class Zi extends Fu{}
3、优点:
1) 继承的出现提高了代码的复用性。
2) 继承的出现让类与类之间产生了关系,是多态的前提之一。
4、弊端:
使类与类之间产生了更强的耦合性
5、特点:
1) java只支持单继承不支持多继承,但支持多层继承。
2) 任何类都直接或者间接继承自Object类。
6、注意事项:
不要为了某个功能而去继承,需要满足”is a”的关系。
7、成员特点:
1) 成员变量:访问满足就近原则
局部变量>成员变量>父类成员变量>父类的父类
2) 成员方法:
子类可以直接使用父类的非私有方法,当子父类方法一样时,方法重写。
3) 构造方法:
构造方法不继承,子类的构造默认调用父类构造。
父类构造方法负责对成员变量初始化供子类对象使用,而不是创建父类对象。
父类没有无参构造时,子类需要手动调用其他父类构造。\
8、方法重写:
1) 定义:子类中出现与父类一模一样的方法时,出现方法重写
子类方法访问权限需要大于等于父类方法访问权限
静态只能覆盖静态
返回值类型:
基本类型/void::必须相同
引用类型:子类返回值类型必须为父类返回值类型的子类
函数名相同
参数列表相同
2) 应用:
子类需要父类功能,但又在功能上又有多增加时,可以复写父类方法。子类比父类更强大。
3) 注意事项:
父类中私有方法不可以被覆盖。
在子类中想调用父类自己的方法可以使用super关键字
9、子父类实例化过程
1) 子类中所有的构造函数默认都会访问父类中空参数的构造函数,原因是构造方法中第一行默认的super()
2) 子类具备父类中的数据,所以需要先明确父类是如何初始化的,即调用父类的构造方法。父类存储空间优于子类对象。
3) 大致顺序:
子类构造调用——父类构造调用——父类默认初始化——父类显示初始化——父类构造代码块初始化——父类构造方法初始化——子类默认初始化——子类显示初始化——子类构造代码块初始化——子类构造方法初始化
二、多态
1、定义:某一种事物的多种形态。
多态的程序体现为父类或者接口的引用指向其子类对象或者实现类对象。
2、前提:
需要存在继承或者实现关系。
要有方法覆盖操作,否则没有意义。
父类或者接口的引用指向或者接收自己的子类对象。
3、优点:
开发当中要符合开闭原则:对修改关闭,对扩展开放。
多态的存在提高了程序的扩展性和后期可维护性。
4、特点:
1) 成员函数:
编译时:查看引用变量所属的类中是否有所调用的成员函数。
运行时:调用子类实例中的方法。
2) 成员变量:编译和运行只看引用变量所属的类。
向上向下转型:
向上转型:引用变量为父类时,子类实例对象可以自动提升为父类类型
向下转型:可以使用强制类型转换,完成向下转型
5、抽象类:
1) 定义:被abstract关键字修饰的类就是抽象类。
2) 注意:
包含抽象方法的类就是抽象类
抽象类不一定包含抽象方法。
类/抽象类不一定包含方法。
抽象类可以有非抽象方法。
3) 抽象方法定义:
只有功能声明,没有功能主体的方法称为抽象方法。
4) 格式:抽象类与抽象方法均需要使用abstract关键字
抽象方法格式:
修饰符 abstract 返回值类型 函数名(参数列表) ;
抽象类格式:
修饰符 abstract class 类名{}
5) 特点:
A) 抽象类本身无法实例化。
B) 抽象类通过多态的形式创建其子类实例对象。
C) 子类需要将抽象父类的抽象方法均覆盖才可以实例化,否则依然是抽象类。
D) 抽象类强制子类必须实现抽象方法。
6) 注意事项:
抽象类包含构造方法,用来给属性赋值供子类实例对象使用。
abstract不能与如下关键字公用
final :抽象类需要继承,final修饰的无法继承
static :抽象类抽象方法无方法体,调用无意义
private:抽象类的方法需要被覆盖,如果private修饰的话,子类无法访问
6、接口:
1) 定义:比抽象类更为抽象的表现形式
2) 格式:
定义接口:interface XX {}
使用接口:class YY implements XX{}
3) 特点:
接口是对外暴露的规则。
接口是程序的功能扩展。
接口的出现降低耦合性。
java支持类同时实现多个接口。
java支持类在继承一个类的同时,实现多个接口。
接口与接口之间可以有继承关系。并且可以多继承。
接口不能被实例化。
接口是”like a”的关系。
4) 接口成员特点:
接口内的成员修饰符是固定的
成员常量:public static final,接口中只有常量
成员函数:public abstract,接口中只有抽象方法
构造方法:无
5) 接口与抽象类的异同:
均为抽取出的相同概念的抽象。
类为单继承,接口为多实现。
继承为”is a”的关系,接口为“like a”的关系。
抽象类中可以定义非抽象方法,共子类直接使用。接口均为抽象方法,因为固定修饰符。
7、内部类:
1) 概念:
内部类又叫内置类或者嵌套类。即在类中定义的另外一个类,是一个相对概念。
内部类是符合面向对象的。如人与心脏的关系。
内部类在编译时,会生成两个class文件。
2) 访问特点:
内部类可以直接访问外部类中的成员,包括私有成员。
而外部类要访问内部类中的成员必须要建立内部类的对象。
3) 分类:
成员内部类
局部内部类,匿名内部类属于局部内部类
4) 成员内部类:内部类定义在成员位置。
访问格式:
Outer.Inner x = new Outer().new Inner();
或外部类的方法中,直接创建内部类对象调用其方法。
可以被private成员修饰符修饰,保证数据安全。
可以被static成员修饰符修饰,方便调用。
被static修饰的内部类只能访问外部类中的静态成员。
static修饰后的访问格式:
Outer.Inner x = new Outer.Inner();
调用静态内部类中的静态方法:
Outer.Inner.method();
5) 局部内部类:内部类定义在方法内。
无法使用Outer.Inner进行访问。
访问格式:在所在方法内创建对象进行方法调用
同时可以访问所在局部中的局部变量,但必须是被final修饰的。
必须先定义再使用。
6) 匿名内部类概念:在通过简写形式定义一个没有类名的类。
在创建一个对象。
匿名内部类即将匿名定义类与创建对象的动作一起完成。
匿名内部类属于局部内部类。
定义格式:
new 类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容。)};
匿名内部类需要先定义再使用。
匿名内部类是一种多态的表现形式。
使用场景:
1、内部类效率更高。
2、通常在使用接口类型参数的方法上,并该接口中的方法不超过三个时,可以将匿名内部类作为参数传递。
3、增强阅读性。
面试题:
interface Inner{void show()}
class Outer{
//补齐代码
Public static Inner method(){
return new Inner(){
public void show(){}
};
}
}
class innerClassTest{
public static void main(String[] args){
Outer.method().show();
}
}
三、访问权限:
public | protected | default | private | |
同一类中 | √ | √ | √ | √ |
同一包中(子类与无关类) | √ | √ | √ |
|
不同包的子类 | √ | √ |
|
|
不同包中的无关类 | √ |
|
|
|
四、this关键字
1、定义:
this代表其所属对象的引用,没有实例对象,this就没有意义。
2、this的使用:
当在函数内需要用到调用该函数的对象时,就用this
局部变量隐藏成员变量时,使用this区分。
构造函数中第一行,用来调用本类其他重载的构造函数。
五、super关键字
1、代表父类的内存空间。使用super区分子父类所属。
2、用法与this类似,子类的构造方法中均有默认的super()
六、final关键字
1、定义:最终修饰符,修饰类与类的成员。
2、作用:
修饰类,类不可以被继承。
修饰方法,方法不可以被重写。
修饰变量,变量的值不能更改,成为了常量。
常量必须有值,且常量的值只能赋值一次。
引用类型常量可以更改其堆内存对象中的值。
内部类只能访问被外部类中被final修饰的局部变量。