------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1. 继承
优点:
提高了代码的复用性
让类与类之间产生了关系,有了这个关系,才有了多态的特性
java语言中:java只支持单继承,不支持多继承,因为多继承容易带来安全隐患
子父类出现后,类成员的特点:
1. 变量
如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量,用this,子类要访问父类中的同名变量,用super
2. 函数
当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容,如同父类的函数被覆盖一样
覆盖:
1. 子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败
2. 静态只能覆盖静态
3. 构造函数
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();
super():回访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super()。
■为什么子类一定要访问父类中的构造函数
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类时如何对这些数据进行初始化的,所以子类在对象初始化时,要先访问一下父类中的构造函数。如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定
PS:super一定定义在子类构造函数的第一行(初始化动作要先做)
■结论:
子类的所有构造函数,默认都会访问父类中空参的构造函数
因为子类每一个构造函数内的第一行都有一句隐式super()
当父类中没有空参数的构造函数时,子类必须手动通过super或者this语句形式来指定要访问的构造函数
2. final关键字
final可以修饰类,方法,变量
final修饰的类不可以被继承
final修饰的方法不可以被覆盖
final修饰的变量是一个常量。只能被赋值一次,作为常量:常量的书写规范所有字母都大写,如果由多个单词组成,单词间通过_连接
内部类只能访问被final修饰的局部变量
3. 抽象类
■当多个类中出现相同功能,但是功能主体不同,这是可以进行向上抽取,这是,只抽取功能定义,而不抽取功能主体
■ 抽象类的特点
⑴抽象方法一定在抽象类中
⑵抽象方法和抽象类都必须被abstract关键字修饰
⑶抽象类不可以用new创建对象,因为调用抽象方法没意义
⑷抽象类中的方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调用,如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象方法
抽象类比一般类多了个抽象函数
抽象类不可以实例化
特殊:抽象类中可以不定义抽象方法,仅仅是不让该类建立对象
■模板方法设计模式
在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,那么这是就将不确定的部分暴露出去,由该类的子类完成
4. 接口
■格式
interface()
■接口中的成员修饰符是固定的
成员常量:public static final
成员函数:public abstract
■接口的出现将“多继承”通过另一种形式体现出来,即“多实现”
当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示
■接口:是不可以创建对象的,因为有抽象方法,需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化,否则子类是一个抽象类
■类与类之间,继承
类与接口之间实现
接口与接口之间,继承
■特点:
接口是对外暴露的规则
接口是程序的功能扩展
接口可以用来多实现
类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口
接口与接口之间可以有继承关系
接口的出现降低了耦合性
5. 多态
定义:某一类事物的多种存在形态
■多态的表现
父类的引用指向了自己的子类对象
父类的引用也可以接受自己的子类对象
■多态的前提
必须是类与类之间有关系。要么继承,要么实现
通常好友一个前提,就是存在覆盖
■多态的好处
多态的出现大大提高了程序的扩展性
■多态的弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员
■多态的应用
◆在多态中非静态成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法,若果有,编译通过,如果没有,编译失败
在运行时期:参阅对象所属的类中是否有调用的方法
简单总结:成员函数在多态调用时,编译看左边,运行看右边
◆在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)
◆在多态中,静态成员函数的特点:
无论编译和运行,都参考左边
代码
Animal a = new Cat();//类型提升,向上转型
a.eat()
//如果想要调用猫的特有方法时,如何操作
//强制将父类的引用,转成子类类型.向下转型
Catc = (Cat) a;
c.catchMouse();
c instanceof Animal
//instanceof关键字
//能转换的是父类应用指向了自己的子类对象时,该引用可以被提升,也可以被强制转换,多态在自始自终都是子类对象在做着变化
6. object类
object是所有对象的直接或者间接父类。该类中定义的是所有对象都具备的功能
★equals()
★toString()
7. 内部类
■将一个类定义在另外一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)
■访问特点:
内部类可以直接访问外部类中的成员,包括私有成员
之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式Outer.this.成员
而外部类要访问内部类中的成员必须建立内部类的对象
■访问格式:
当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中,可以直接建立内部类对象
格式:Outer.Inner o = new Outer().new Inner();
当内部类在成员位置上,就可以被成员修饰符所修饰,比如,private:将内部类在外部类中进行封装
static:内部类就具备static的特性
当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限
在外部其他类中,如何直接访问static内部类的非静态成员呢-----new Outer.Inner().function();
在外部其他类中,如何直接访问static内部类的静态成员呢----- Outer.Inner.function();
PS:当内部类中定义了静态成员,该内部类必须是static
当外部类中的静态方法访问内部类时,内部类也必须是静态的
■当描述事物时,事物内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容
■内部类定义在局部时
不可以被成员修饰符修饰
可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问他所在的局部中的变量,只能访问被final修饰的局部变量
代码:
class Outer{
private int x=5;
private class Inner{
void function(){
System.out.println(“inner”+Outer.this.x);
}
}
void method(){
}
}
public class Test{
public static void main(String[]args){
Outer o =new Outer();
o.method();
}
}
8. 匿名内部类
▼匿名内部类其实就是内部类的简写格式
▼定义匿名内部类的前提:
内部类必须是继承一个类或者实现接口
▼匿名内部类的格式:new父类或者接口(){定义子类的内容}
▼其实匿名内部类就是一个匿名子类对象
▼匿名内部类中定义的方法最好不要超过3个
代码
new Object(){
public void function(){
}
}.function();
9. 包(package)
▼对类文件进行分类管理
▼给类提供多层命名空间
▼写在程序文件的第一行
▼类名的全称是 包名.类名
▼包也是一种封装形式
javac –d . HelloWorld.java
总结:
包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰
不同包中的子类还可以直接访问父类中被protected权限修饰的成员
为了简化类名的书写,使用一个关键字,import
通配符*
import导入的是包中的类