纲要:
一、权限修饰符
1、修饰范围
本类 同包类 不同包子类 不同包其他类
private √
default √ √
protected √ √ √
public √ √ √ √
2、 注意:
* 以上四个权限修饰符都是成员修饰符(成员变量,成员方法),不能修饰局部
* 被private修饰的内容不能被继承
* public和default(不能显示定义)能够修饰类
* 设计面向对象的原则之一: 开闭原则(对修改关闭,对扩展开放)
二、重写
1、重写与重载
* 重载 : - ->方法
同一个类中
多个方法的方法名相同
方法签名不同
* 重写 : -->方法
不同的类
继承
方法签名相同
* 重写和重载的区别:
子类中一旦方法重写,会对父类中同名的进行屏蔽
如果子类有重写父类中的方法,调用时会调用子类中重写的方法
2、检测重写方法的方式:
左边有向上的三角
在重写方法的上面添加一个注解 @Override
3、重写满足|注意的条件:
== 方法签名相同
<= 返回值类型:基本数据类型:子父类必须相同 引用数据类型:子类<=父类
>= 权限修饰符:子类>=父类
4、注意:
被private修饰的方法不能被重写
被final修饰的方法不能被重写
被static修饰的方法不能被重写
如果子类中存在于父类静态方法重名的方法,记住要把子类中这个方法定义为静态的
三、super关键字
1、使用: super:指代父类对象
this: 指代当前创建对象
1) 用在构造器的首行可以掉用父类中的构造器
super(参数)-->匹配父类中构造器的参数
如果没有显示定义,默认在子类构造器的首行存在super(),默认调用父类的空构造
2) 区分子父类同名问题
如果存在同名问题,默认隐藏this,默认就近原则找当前子类中的,如果想要指定父类中,要使用super调用
2、注意:
先父类后子类
不能显示同时定义this()和super(),因为都要存在于构造器的首行,但是可以隐式同时使用,默认调用父类空构造,显示调用子类其他构造器
就近找局部,然后如果同时存在局部,子类成员,父类成员同名问题,默认找局部,子类成员this,父类成员super
四、final关键字
1、被final修饰的变量为常量,不能改变
2、被final修饰的方法,不能被重写
3、 被final修饰的类不能被继承(太监类)
注意: 被final修饰的一个对象的引用,可以修改对象中的属性值
五、多态
面向对象三大特性之一
一种事物多种形态|多种表现形式
1、多态的前提:
类的继承 | 接口的实现
2、 多态的最终体现:
父类的引用指向子类的对象
3、多态的目的:
父类的引用在调用子父类中同名方法的时候,会调用子类中重写的方法
4、注意:子类中新增的方法对父类不可见
5、使用成员
成员变量:
编译运行找父类
成员方法:
编译看父类,运行看子类
6、封装:对外隐藏内部的实现细节,提供公共的访问方式
继承:子类继承父类,就可以拥有父类中的成员
多态:在继承的前提下和方法重写的前提下,可以提高代码的服用型和扩展性
六、Object类
1、toString()
打印一个对象的引用,默认调用这个对象的toString()方法
目的: 打印对象的信息的字符串表示形式
类中重写toString方法,自定义方法体的实现
2、equals()
==比较地址
equals : 可以比较对象的内容是否相同
public boolean equals(Object obj) {
return (this == obj);
}
equals在Object中默认比较的还是对象的地址
七、转型
A引用 instanceof B
判断A是否为B类或其子类的对象
向下转型
父类对象转为子类需要强转
八、abstract
1、抽象方法
没有方法体,必须存在于抽象类中
抽象方法必须被重写(子父类继承)
抽象方法只需要被重写一次,也可以按需重写多次
2、抽象类
抽象类并不是实例化
如何使用抽象类中的内容
具体的子类:重写父类中所有的抽象方法+按需新增方法
抽象的子类:按需重写父类中抽象方法+按需新增->抽象类,如果想要使用最终需要具体子类
可以存在抽象方法,可以存在具体方法
3、abstract不能和private,final,static,native一起使用
4、 为什么不用具体的类,要使用抽象类?
方法体不知道如何定义,需要抽象方法,需要抽象类
九、接口:接口特殊的抽象类
类要继承 -->只能单继承
接口要实现 :吸烟 :游泳 --->多实现
如果有一个人类会游泳实现游泳接口,会抽烟实现抽烟的接口,即会游泳又会抽象,同时实现这两个接口
只要实现了这个接口,就有了这个能力,
接口在jdk1.8之前只能存在抽象方法
十、注意点:
1、父类的构造器和子类的构造块,父类构造器会先被调用
2、子类继承父类的方法,通过子类对象调用父类中的方法,此方法中的this指的是父类的对象。
3、父类可以强转为子类,子类可以自动转换为父类
4、toString方法重写中,value是获取String的char数组
5多态使用成员
成员变量:
编译运行找父类
成员方法:
编译看父类,运行看子类
这是因为方法在内存在存储方式是method table,加载类方法的时候存储的是内存中的偏移量
JVM在执行class文件的时候,也就是在内存中执行Java的程序的时候,会将父类的Method,放到Method Table 里面,子类复写了父类中的方法后,初始化子类的时候,就会将Method Table中相应的Method进行覆盖。
另一方面,所有派生类中继承于基类的方法在方法表中的偏移量跟该方法在基类方法表中的偏移量保持一致这也就是为什么可以准确的调用Method。
---------------------
参考
作者:项昂之
来源:CSDN
原文:https://blog.csdn.net/csp277/article/details/49760047
版权声明:本文为博主原创文章,转载请附上博文链接!
---------------------
6、protected权限
直接访问父类中的成员,直接访问权限修饰符 ,不同包下的其他类,如果想要使用
父类中protected修饰符的内容,要通过继承关系,子类能够直接使用父类中的内容
网友评论