赞
踩
目录
面向对象的三大特征:封装、继承、多态
封装就是对外部隐藏细节,提供简单易用的方法,便于外界调用,从而提高系统的可扩展性、可维护性。使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑限制对属性的不合理操作。
1. 隐藏实现细节。比如现在有一个方法对数组转换成想要的字符串形式,只需要传入一个数组参数即可,调用者并不关心是怎么实现的。
2. 可以对数据进行验证,保证数据的安全性和合理性(在set方法里面可以加入控制逻辑限制对属性的不合理操作)。
3. 将属性设置为private修饰,外部就无法直接赋值,必须通过set方法才能设置属性值。
1. 将成员变量(属性)私有化
2.提供成套公开的的getXxx()方法和setXxx()方法供外部访问
- public class Student {
- //将成员变量私有化
- private int age;
-
- //提供成套的getXxx()和setXxx()方法供外部访问
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- //在设置属性值时,可以加入控制逻辑限制对属性的不合理操作
- if (age < 0 || age > 150) {
- System.out.println("您的年龄有误,赋值失败");
- return;
- }
- this.age = age;
- }
- }
当多个类之间拥有同名的成员(成员变量/成员方法),可以把这些成员抽取出来放到父类中,然后子类只需要通过extends关键字继承父类,便可以拥有这些成员,而不需要重新定义这些成员。
- public class Test {
- public static void main(String[] args) {
- Dog dog = new Dog();
- dog.eat(); //输出 "动物吃饭"
- }
- }
-
- class Animal{
- public void eat(){
- System.out.println("动物吃饭");
- }
- }
- class Dog extends Animal{
- //Dog类继承了Animal类,所以拥有了Animal类的非私有成员
- }
1. 提高了代码复用性,不用编写重复的代码。
2. 提高了代码的可扩展性和可维护性。
1. 通过继承,子类继承了父类非私有的成员变量和成员方法。
2. 在Java中,不支持多继承,也就是一个类不能同时继承多个类。但支持多层继承,也就是说类A继承类B,类B继承类C。
3. 在Java中,所有类的祖宗类是Object,要么直接继承Object,要么间接继承Object。(一个类没有显示的用extends关键继承另一个类,那么这个类默认继承Object)
1. 根据就近原则访问(先子类局部范围找,然后子类成员范围找,然后父类成员范围找,如果父类范围还没有找到则报错)。
2. 访问子类的同名变量:this.name
3. 访问父类的同名变量:super.name
1. 子类构造器的特点:子类的全部构造器,都会先调用父类的构造器,再执行自己。
2.子类构造器调用父类构造器方式:默认情况下,子类全部构造器的第一行代码都是 super() (写不写都有) ,它会调用父类的无参数构造器。如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写super(…),指定去调用父类的有参数构造器。
3. this(…)和super(…) :可以通过this(…) 去调用该类的其他构造器,通过super(...)去调用父类的构造器。this(…)和super(…) 都只能放在构造器的第一行,因此,两者不能同时使用。
本类 | 同一个包下的类 | 其他包下的子孙类 | 其他包下的任意类 | |
private | ✅ | |||
缺省 | ✅ | ✅ | ||
protected | ✅ | ✅ | ✅ | |
public | ✅ | ✅ | ✅ | ✅ |
权限修饰符大小比较:private < 缺省 < protected < public
如果父类中的方法不足以满足子类的需求,子类中可以重写父类的方法,覆盖掉父类中的方法,这样在调用该方法时就会执行子类重写后的方法。
- public class Test {
- public static void main(String[] args) {
- Dog dog = new Dog();
- dog.eat(); //输出 "狗啃骨头"
- }
- }
-
- class Animal{
- public void eat(){
- System.out.println("动物吃饭");
- }
- }
- class Dog extends Animal{
- //重写父类的eat方法
- @Override
- public void eat() {
- System.out.println("狗啃骨头");
- }
- }
方法重写注意事项:
1. 建议对重写方法加上@Override注解,代码可读性会更好
2. 访问权限必须大于等于父类的访问权限
3. 返回值类型必须小于等于父类的返回值
4. 私有方法以及静态方法不能被重写,否则报错
多态指的是同一个方法调用,由于对象不同可能会有不同的行为。比如吃饭,中国人吃饭用筷子,印度人吃饭用手,英国人吃饭用刀叉。
1. 存在继承关系
2. 存在父类引用指向子类对象(父类 变量名 = new 子类();)
3. 存在方法重写
- public class Test {
- public static void main(String[] args) {
- People chinese = new Chinese(); //多态的前提条件之二:父类引用指向子类对象
- chinese.eat(); //输出"中国人吃饭用筷子"
- People british = new British(); //多态的前提条件之二:父类引用指向子类对象
- british.eat(); //输出"英国人吃饭用刀叉"
- }
- }
-
- class People{
- //吃饭方法
- public void eat(){
- System.out.println("吃饭");
- }
- }
- class Chinese extends People{ //多态的前提条件之一:存在继承关系
- //多态的前提条件之三:重写父类的方法
- @Override
- public void eat() {
- System.out.println("中国人吃饭用筷子");
- }
- }
- class British extends People{ //多态的前提条件之一:存在继承关系
- //多态的前提条件之三:重写父类的方法
- @Override
- public void eat() {
- System.out.println("英国人吃饭用刀叉");
- }
- }
多态是行为(方法)的多态,不是属性的多态(多态与属性无关)。
- public class Test {
- public static void main(String[] args) {
- People chinese = new Chinese();
- System.out.println(chinese.name); //输出"人",因为属性没有多态性
- chinese.eat(); //输出"中国人吃饭用筷子",因为多态是行为(方法)的多态
- }
- }
-
- class People{
- String name = "人";
- public void eat(){
- System.out.println("吃饭");
- }
- }
- class Chinese extends People{
- String name = "中国人";
- @Override
- public void eat() {
- System.out.println("中国人吃饭用筷子");
- }
- }
在使用多态时,有个弊端就是无法使用子类独有的功能。解决方法是:使用强制类型转换后再调用子类独有的功能。强制类型转换之前建议先用instanceof关键字判断当前对象所属类,否则可能出现类型转换异常。
- public class Test {
- public static void main(String[] args) {
- People chinese = new Chinese();
- //chinese.fun(); //报错,多态下无法使用子类独有的功能
- if (chinese instanceof Chinese) { //强转前,建议使用instanceof关键字判断
- Chinese c = (Chinese) chinese;
- c.fun(); //强转后,可以使用子类独有的功能
- }
- }
- }
-
- class People{
- public void eat(){
- System.out.println("吃饭");
- }
- //父类中并没有fun()方法
- }
- class Chinese extends People{
- @Override
- public void eat() {
- System.out.println("中国人吃饭用筷子");
- }
- public void fun() {
- System.out.println("子类独有的功能");
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。