Java笔记(day9~day10)
继承:
好处:1、提高代码复用性;
2、让类之间产生关系,给多态提供了前提;
父类、子类
java中支持单继承,不直接支持多继承,但对c++的多继承进行了改良
单继承:一个子类只能有一个直接复类
多继承:一个子类可以有多个直接父类(java中不允许,进行了改良)会产生不确定性,不直接支持,因为父类中有相同成员会产生调用的不确定性;
java支持多重继承:c继承b,b继承a
就会出现继承体系:1、查看体系顶层类,了解体系基本功能;
2、创建体系最子类对象,完成功能使用。
什么时候定义继承呢?
当类与类之间存在所属关系时候,就定义继承;
在子父类中,成员的特点体现:1、成员变量;2、成员函数;3、构造函数;
1、成员变量:当本类的成员和局部变量同名用this区分;
当子父类中的成员变量同名用super区分父类;
this和super用法很相似:this代表一个本类对象的引用,super代表一个父类空间
子父类中成员函数特点:
1、覆盖:当子父类中出现成员函数一模一样,会运行子类情况,这种现象称为覆盖;
函数两个特点:1、重载;在同一类中
2、覆盖;子类中,覆盖也称为重写;
覆盖注意事项:1、子类方法覆盖父类方法时,子类权限必须大于等于父类权限;
2、静态只能覆盖静态,或被静态覆盖;
什么时候覆盖操作?
当对一个类进行子类扩展时,子类需保留父类功能,但要定义子类特有
2、子父类中的构造函数——子类的实例化过程
在子类构造对象时,发现访问子类构造函数时,父类也运行了;
原因:在子类中构造函数中第一行有一个默认隐式语句,super()
子类的实例化过程:子类中所有构造函数都默认访问父类构造函数
为什么子类继承父类要访问他们的构造函数?
那是因为子类继承父类,获取了父类内容,所以使用父类内容前,先看父类如何对自己内容初始化
注意:super语句必须定义在子类构造函数第一行
一个对象实例化过程:
person.p=new person()
1、jvm会读取指定路径下person.class文件,并加载进内存,并会先加载person父类;
2、在堆内存中开辟空间,分配地址;
3、并在对象空间中,对对象属性默认初始化;
4、调用对应构造函数初始化;
5、构造函数中,第一行先调用父类构造函数;
6、父类初始化完后,对子类属性初始化;
7、在进行子类构造函数特定初始化;
8、初始化完毕后,将地址值赋给引用变量;
final关键字:继承的弊端:打破了封装性;
1、final是一个修饰符,可以修饰类、方法、变量;
2、final修饰的类不可以被继承;
3、final修饰的方法不可以被覆盖;
4、final修饰变量是一个常量,只能赋值一次;
为什么要用final修饰变量,其实在程序中如果数据固定,则直接用就可以?为了区别;
抽象类:
抽象:abstract /抽象关键字/
没有足够的信息描述一个类就是抽象类;
特点:1、抽象类:方法只有声明没有实现时,该方法就是抽象方法,抽象方法必须在抽象类中;
2、抽象类不能被实例化,因为调用抽象方法没有意义;
3、抽象类必须由子类覆盖抽象类方法,否则,子类还是抽象类;
1、抽象类由构造函数吗?
由,用于给子类对象初始化;
2、抽象类可以不定义抽象方法?
可以,但是少见,通常类中有很多方法,但是却没有内容;
3、抽象类不能和哪些关键字?
private、final、static
4、抽象类和一般类异同点:
相同点:抽象类和一般类都是用来描述事物的,都在内部定义了成员;
不同点:1、一般类有足够信息描述事物;2、一般类不能定义抽象方法;3、一般类可以被实例化;
5、抽象类是一个父类吗?
对.
接口:interface() 当抽象类中方法都是抽象时,这时可以将该抽象类用接口、
定义接口使用的关键字不是class,是interface
对于接口常见的成员:1、全局变量;2、抽象方法
1、public static final 2、public abstract
由此得出结论,接口成员都是公共的权限
实现:类与类之间是继承关系;类与接口之间是实现关系;
接口不可以实例化,只能由实现了接口的子类并覆盖了接口中所有抽象方法后,才可以实例化;
在java中不直接支持多继承,因为会调用不确定性,所以改良多实现
一个类中可以实现多接口
class test implements a,z //多实现
细节:一个类在继承另一个类的同时,还可以实现多个接口
接口出现避免了单继承的局限性
接口与接口之间是继承关系,而且接口可以多继承;
接口的特点:是对外暴露的规则,是程序的功能拓展,可以用来多实现;
类与接口之间是实现规则,类继承的同时可以实现多个接口,降低耦合性
接口与抽象类区别:
相同点:都是不断向上抽取而来;
不同点:1、抽象类需要被继承,接口需要被实现;
2、抽象类中可以定义抽象方法和非抽象方法,接口中只可以定义抽象方法;
多态:定义 :某一类事物的多种存在形态;
对象的多态性:一个对象对应着不同类型;
多态在代码中体现,父类或接口的引用指向其子类的对象;
多态的好处:提高了代码扩展性,前期定义的代码,可以使用后期的内容;
多态弊端:前期定义的内容不能调用后期子类特有内容;
多态前提:1、必须由关心:继承,实现;2、必须要有覆盖;
多态转型:1、自动类型提升,但是特有功能无法访问;作用就是限制对特有功能访问;
2、向下转型的目的是为了使用子类中的特有语法;
类型转换异常
注意:对于转型,自始至终都是子类对象在做着类型变化;
多态成员变量:成员特点:1、成员变量;2、成员函数;3、静态函数;
1、编译时,参考引用型变量所属类中是否有调用的成员变量;有,编译通过,没有,编译失败;
运行时,参考引用型变量所属类中是否有调用的成员变量;并运行该所属类中的成员变量;
2、成员函数:参考引用型变量所属类中是否有调用的成员函数,有,编译通过;
运行时,参考的是对象所属类中是否有调用的成员函数;
3、静态函数:谁调用显示谁;
其实对静态方法,直接用类名调用即可;
内部类:类定义在类中;
访问特点:内部类可以直接访问外部类中成员,包括私有成员;
外部类访问内部类中成员,必须建立内部类对象;
一般用于类的设计
分析事物时,发现事物描述中还有事物;
内部类——修饰符:
如果内部类是静态的,相当于一个外部类;
如果内部类是静态的,成员是静态的;
如果内部类中定义了静态成员,这个类也是静态类;
为什么内部类能直接访问外部类成员?
因为内部类持有外部类引用;
内部类可以放在局部位置上,只能访问局部被final修饰的局部变量;
匿名内部类:就是内部类简写格式:必须有前提,内部类必须继承或实现一个外部类或接口;
其实就是一个匿名子类对象;
格式:new 父类 or 接口(){子类内容}