今日无事,学习。
今日总结:
Java学习:
继承:Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系。
继承的特点:子类能继承父类的非私有成员(成员变量、成员方法)
继承后对象的创建:子类的对象是由子类、父类共同完成的。
例:public class B(子类) extends A(父类){}
注意事项:
1、权限修饰符:用来限制类中的成员(成员变量、成员方法、构造器、代码块..能够被访问的范围。
修饰符 | 在本类中 | 同一个包下的其他类里 | 任意包下的子类里 | 任意包下的任意类里 |
---|---|---|---|---|
private | √ | |||
缺省 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
2、单继承,Object类
①Java是单继承的:一个类只能继承一个直接父类;Java中的类不支持多继承,但是支持多层继承。
②Object类是Java中所有类的祖宗。
3、方法重写:当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。
●注意:重写后,方法的访问,Java会遵循就近原则。
方法重写的其它注意事项:
重写小技巧:使用Override注解,他可以指定java编译器,检查我们方法重写的格式是否正确,代码可读性也会更好。
子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限(public > protected>缺省)。
重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。
私有方法、静态方法不能被重写,如果重写会报错的。
4、子类中访问其他成员的特点
1、在子类方法中访问其他成员(成员变量、成员方法),是依照就近原则的。
●先子类局部范围找。
●然后子类成员范围找。
●然后父类成员范围找,如果父类范围还没有找到则报错。
2、如果子父类中,出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类的怎么办?
●可以通过super关键字,指定访问父类的成员: super.父类成员变量/父类成员方法
5、子类构造器特点:子类的全部构造器,都会先调用父类的构造器,再执行自己。
子类构造器是如何实现调用父类构造器的:
●默认情况下,子类全部构造器的第一行代码都是super()(写不写都有),它会调用父类的无参数构造器。
●如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写super(...)指定去调用父类的有参数构造器。
补充知识:
this(..)调用兄弟构造器:
●任意类的构造器中,是可以通过his(..)去调用该类的其他构造器的。
this(..)和super(..)使用时的注意事项:
●this(...)、super(..)都只能放在构造器的第一行,因此,有了this(..)就不能写super(..)了,反之亦然。
多态:在继承/实现情况下的一种现象,表现为:对象多态、行为多态。
多态的前提
●有继承/实现关系;存在父类引用子类对象;存在方法重写。
多态的一个注意事项
●多态是对象、行为的多态,Java中的属性(成员变量)不谈多态。
方法:编译看左,运行看右 变量:编译看左,运行看左
多态的好处和问题
●可以解耦合,扩展性更强;使用父类类型的变量作为方法的形参时
,可以接收一切子类对象。
●多态不能直接调用子类的独有方法
多态下的类型转换
●自动类型转换:父类变量名=new子类()
●强制类型转换:子类变量名=(子类)父类变量
强制类型转换的一个注意事项
●存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。
●运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException) 的错误出来。
final
●final关键字是最终的意思,可以修饰(类、方法、变量)
●修饰类:该类被称为最终类,特点是不能被继承了。
●修饰方法:该方法被称为最终方法,特点是不能被重写了。
●修饰变量:该变量只能被赋值一次。
final修饰变量的注意
●final修饰基本类型的变量,变量存储的数据不能被改变。
●final修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以被改变的。
抽象类和抽象方法:
●都是用abstract修饰的;抽象方法只有方法签名,不能写方法体。
抽象类有哪些注意事项和特点?
●抽象类中可以不写抽象方法,但有抽象方法的类一定是抽象类
●类有的成员(成员变量、方法、构造器)抽象类都具备。
●抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
●一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。