Java面向对象(二)

instanceof运算符

instanceof是二元运算符,左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回true;否则,返回false。

继承

1.父类也称作超类、基类、派生类等。
2.Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
3.Java中类没有多继承,接口有多继承。
4.子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。
5.如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。

方法的重写

注:

1.“==”: 方法名、形参列表相同。
2.“≤”:返回值类型和声明异常类型,子类小于等于父类。
3.“≥”: 访问权限,子类大于等于父类。

方法

toString

Object类中定义有public String toString()方法,其返回值是 String 类型。Object类中toString方法的源码为:
根据如上源码得知,默认会返回“类名+@+16进制的hashcode”。

==和equals

“==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。
Object 的 equals 方法默认就是比较两个对象的hashcode,是同一个对象的引用时返回 true 否则返回 false。但是,我们可以根据我们自己的要求重写equals方法。

super关键字

super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。

使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。

若是构造方法的第一行代码没有显式的调用super(…)或者this(…);那么Java默认都会调用super(),含义是调用父类的无参数构造方法。这里的super()可以省略。

继承树追溯

属性/方法查找顺序:
  1. 查找当前类中有没有属性h
  2. 依次上溯每个父类,查看每个父类中是否有h,直到Object
  3. 如果没找到,则出现编译错误。
  4. 上面步骤,只要找到h变量,则这个过程终止。
构造方法调用顺序:

构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。
注:静态初始化块调用顺序,与构造方法调用顺序一样,不再重复。

封装

优点

  1. 提高代码的安全性。
  2. 提高代码的复用性。
  3. “高内聚”:封装细节,便于修改内部代码,提高可维护性。
  4. “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。

使用的控制符

private

表示私有,只有自己类能访问

default

表示没有修饰符修饰,只有同一个包的类能访问

protected

表示可以被同一个包的类以及其他包中的子类访问

public

表示可以被该项目的所有包中的所有类访问

private修饰符的访问权限为:同一个类

封装的使用

类的属性的处理
  • 一般使用private访问权限。

  • 提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头!)。

  • 一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。

多态

  • 多态是方法的多态,不是属性的多态(多态与属性无关)。

  • 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。

  • 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

对象的转型

父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。

向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型!
对象的转型
结果:
在这里插入图片描述

final关键字

  • 修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值
  • 修饰方法:该方法不可被子类重写。但是可以被重载!
  • 修饰类: 修饰的类不能被继承。比如:Math、String等。

抽象方法和抽象类

抽象方法

使用abstract修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实

抽象类

包含抽象方法的类就是抽象类。通过abstract方法定义规范,然后要求子类必须定义具体实现。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。

抽象类类的使用
  • 有抽象方法的类只能定义成抽象类

  • 抽象类不能实例化,即不能用new来实例化抽象类

  • 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用

  • 抽象类只能用来被继承

  • 抽象方法必须被子类实现

接口

接口和抽象类的区别

接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。

抽象类还提供某些具体实现,接口不提供任何实现,接口中所有方法都是抽象方法。接口是完全面向规范的,规定了一批类具有的公共方法规范。

从接口的实现者角度看,接口定义了可以向外部提供务。

从接口的调用者角度看,接口定义了实现者能提供那些服务。

区别:
  1. 普通类:具体实现

  2. 抽象类:具体实现,规范(抽象方法)

  3. 接口:规范!

内部类

作用
  1. 内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。

  2. 内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。 但外部类不能访问内部类的内部属性。

  3. 接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变得更加完整。

使用
  1. 由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以,在只为外部类提供服务的情况下可以优先考虑使用内部类。
  2. 使用内部类间接实现多继承:每个内部类都能独立地继承一个类或者实现某些接口,所以无论外部类是否已经继承了某个类或者实现了某些接口,对于内部类没有任何影响。

内部类的分类

成员内部类(可以使用private、default、protected、public任意进行修饰。 类文件:外部类$内部类.class)

包括非静态内部类和静态内部类

匿名内部类

局部内部类

判断字符串相等

  1. equals方法用来检测两个字符串内容是否相等。如果字符串s和t内容相等,则s.equals(t)返回true,否则返回false。

  2. 要测试两个字符串除了大小写区别外是否是相等的,需要使用equalsIgnoreCase方法。

  3. 判断字符串是否相等不要使用"=="。
    字符串的比较"=="与equals()方法
    结果:
    在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值