Java小白进阶笔记(5)-进阶面向对象

上Java课的时候没弄明白接口,今天终于明白了(但没使用过,还停在理论的程度,可能理解也不准确,以后学通了会回来补充:)如果你刚学Java,对Java的三要素不能理解,强烈推荐看一下这篇文章。

下面是看完偏头痛杨的这篇博客的摘要


继承(Inheritance,也称为泛化)

为什么要继承

  • 继承是面向对象编程实现软件复用的重要手段
  • 当子类被继承,子类作为一种特殊的父类,将直接获得父类的属性和方法,同时子类也可以增加自己的属性和方法,以及重新定义父类的属性重写父类的方法以获得和父类方法实现的不同的功能。
  • 在类层次结构中,,对父类的改动自动反映在它所有的子类,子类的子类中,不需要修改或重新编译任何低层次的类,那些类通过继承而接收父类中新改变的信息,仅仅需要在层次结构中定义行为和属性一次,那么,以后将自动由所有子类所继承。
  • 继承有利于软件的复用,避免重复代码,提高开发效率。

什么时候会用到继承

(这里理解比较浅,以后对Java继承加深理解后再补充)

  • 当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,然后这两个类作为这个父类的子类继承父类的属性和方法。

继承的一些注意事项

  • 子类无法继承父类的构造方法
  • Java只支持单继承(可以用接口变相实现多继承)
  • 父类中private的属性和方法无法被继承
  • 继承提高了类之间的耦合性
  • 所有的类默认继承java.lang.Object

特别的

  • 实例化子类对象的时候总会在执行子类构造方法之前去调用父类的构造方法(先实例化父类,再实例化子类,如果继承的类很多则可能影响性能)
  • 如果父类中有无参构造,则默认先调用父类的无参构造(子类不用显示的调用super())
  • 如果父类没有无参构造,则需显示的在子类构造中用super()来调用父类相应的构造,且必须在第一行调用
  • 如果父类中只有有参构造,而子类没有显示的去调用则会报错
  • 如果父类中只有有参构造,而子类显示的去调用父类的无参构造则也会报错

this和super关键字

this()与super()必须定在在构造方法中,并且必须在第一行

super()

调用父类的构造方法,只能出现在子类的构造器中,且必须是第一行。

  • super()中的参数,决定了调用父类的那个构造方法
  • 如果子类的构造方法中没有出现super,那么编译器默认加上super(),即调用父类的无参构造,如果父类没有无参构造,编译器就会报错。

this()

调用本类的构造方法

注意

  • this()和super()不能出现在static的方法与static块中(这个不理解,感觉可能与加载顺序有关,以后回来补充)
  • this()调用和super()调用不会同时出现

this. 和super.

  • super.指向父类的引用,我们可以通过super关键字来实现对父类成员的访问。
  • this.指向本类的引用,我们可以通过this关键字来实现对本类成员的访问。

final关键字

final可以修饰的元素

  • :不能被继承,类被定义成final,那么类中所有的方法全部为final
  • 方法:不能在子类中被覆盖(private方法除外,因为private方法不能被子类继承),即不能修改
  • 变量:被final修饰,也就是常量

包(package)

  • 包主要用来对类和接口进行分类
  • 与文件夹类似,把Java类文件放到不同包(文件夹)中,不同的报下,文件名可以重复
  • 与包相关的语句:1.打包语句package;2.引用包语句import
  • package语句必须写在第一行,不写的话,默认放在默认路径下,也就是src根目录
  • 使用import访问第三方或者其他包中的类,如果这个类与本类在同一个包中则不需要import
//package 包名;
//package 包名.子包名.子子包名;

package com.webi.hwj.weixin.controller;

public class WeixinHandleController {

}

import 包名;
import 包名.子包名.子子包名;
package com.webi.hwj.weixin.controller;

import org.apache.log4j.Logger;

public class WeixinHandleController {
  Logger logger = Logger.getLogger(WeixinHandleController.class);
}

封装

将对象实现的细节(属性和方法)隐藏起来,然后通过一些公用方法来暴露该对象的功能。

为什么要封装

开发者让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作。

如何实现封装

Java的访问控制符
从小到大:private,default,protected,public
范围:同一类,同一包,子类,全局范围(同一项目)

注意

  • 类的控制级别只有public和default,成员变量与方法四个都有
  • 如果类的构造方法为private,则其他类均不能生成该类的实例(自己类内部可以)
  • Java类中一般会使用private来修饰成员变量,来防止外部调用

模块设计追求高内聚、低耦合。

高内聚:尽可能把模块的内部数据、功能实现细节隐藏在模块的内部独立完成,不允许外部直接干涉。
低耦合:仅暴露少量的方法给外部使用。

方法的覆盖

重写(overriding)

在父子类继承情况下,子类写出一个跟父类一摸一样的方法,方法体内可以修改,这就是重写。
优势:子类可以根据需要,定义特定与自己的行为,即子类可以根据需要实现父类的方法
注意:子类中写的要覆盖父类的方法的访问权限要不小于父类中被覆盖方法的访问权限

重载(overloading)

在同一个类中,新写一个方法,方法名跟某一个老方法一样,但参数必须不一样,返回值可能也不一样,这就是新方法重载了老方法。
比较常见的重载方式是重载构造方法

多态(Polymorphism)

多态是建立在继承的基础上的,是指子类类型的对象可以赋值给父类类型的引用变量,但运行时仍表现子类的行为特征。
也就是说,同一中类型的对象执行同一个方法时可以表现出不同的行为特征。

为什么要使用多态

可以增强程序的可扩展性及可维护性,使代码更加简洁。
作用:在方法传递引用数据类型的时候,使方法内部的代码更具有可维护性,当有新增子类时,方法内部的代码不用去修改,进一步的使用抽象的概念。

java引用变量有两个类型:一个是编译时类型,一个是运行时类型。
编译时类型由声明该变量时使用的类型决定运行时类型由实际赋给该变量的对象决定,如果编译时类型与运行时类型不一致,就可能会出现所谓的多态

多态的三个必要条件:

  • 要有类继承或实现接口
  • 要有方法重写
  • 父类引用指向子类对象(或接口引用指向实现类对象)。

满足条件后,当调用父类中被重写的方法后,运行时创建的是哪个子类的对象,就调用该子类中重写的那个方法。

注意

  • 多态情况下父类的成员变量无法被子类覆盖,因此需要使用setter/getter方法。
  • 继承情况下父类的成员变量可以被子类覆盖
  • 在多态情况下,子类有重写父类方法的情况,则调用子类方法。
  • 多态情况下,对象无法调用子类独有的方法与属性,只能调用编译类型的成员。
  • >>>>阅读全文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值