面向对象高级1

本文介绍了面向对象编程中的关键概念,包括继承的优缺点、如何使用final和static修饰符、多态的应用与限制,以及接口的定义、特点和类与接口的关系。重点讲解了接口的使用和默认方法在Java 1.8中的作用。
摘要由CSDN通过智能技术生成

1.继承

概念:面向对象的三大特征之一,用来描述类和类的关系用的

好处:

  • 可以抽取子类共性的内容,提高代码的复用性,提高代码维护性,父类中定义非私有的东西,“子类”可以直接使用的!!!

弊端

  • 子类和父类的耦合度增强,父类一旦发生变化,子类不得不一起跟着变化

格式: extends

如:public class Fu{}
public class Zi extends Fu{}

注意:

不能下使用继承,满足 is a 才可以!!!是谁的一种情况才能使用!!!

java只支持单继承,不支持多继承,支持多层继承

1.2 子类可以使用父类的也可以使用自己的

1.21子类的成员变量和父类的成员变量一样

使用的是子类的, 因为遵循了就近原则!!!!!!如果非要访问父类的成员变量,需要使用super关键字

(不重要)因为以后父类的成员变量都会私有化, 是不能直接访问的!!!!!

1.22子类的成员方法和父类的成员方法一样

使用的是子类的, 因为遵循了就近原则!!!!!!如果非要访问父类的成员方法,需要使用super关键字

这种现象称为重写

注意:

我们可以通过@Override来校验是否正确重写, 就算没有这个注解, 如果满足重写的要求也算重写!!!!

1.23子类会默认走父类的构造

系统会默认帮你调用父类的无参构造

因为:子类随时都要使用父类的东西, 所以必须保证父类的数据在堆内存中初始化好才能使用, 所有一定要走父类的构造函数, 而且父类的构造要先走!!!!!!

使用场景

  • 一般我们习惯, 子类的无参调用父类的无参, 子类的满参调用父类的满参!!!!!

补充:

this用来调用本类的成员或者构造, 而super是用来调用父类的成员以及构造,当子类中没有的时候,this也能去父类中寻找

2.权限修饰符

2.1final

修饰符, 可以修饰类, 变量, 方法

修饰类

这个类是最终类, 不能在有子类!!!    所有的内容都不能被重写!!!!

修饰方法

这个方法不能重写了!!!!!

修饰变量

修饰局部变量

变量有且只能被赋值一次!!!!!     命名规范一般和普通变量命名规范一致!!!!!!

修饰成员变量

1.变量有且只能被赋值一次!!!!!

2.直接赋值(推荐的)    

3.通过构造赋值(极其不推荐!!!!)      必须保证每一个构造都要对final修饰的成员变量赋值才可以!!!!!!

4.命名规范需要大家每个单词每个字母都要大写, 多个单词之间用_隔开!!!   如:int MAX_AGE = 100;

5.被final修饰的变量就是常量!!!!!!

6.使用场景   可以让普通的常量更具备可读性!!!!!!!

2.2static

修饰符  修饰成员变量成员方法

修饰成员变量

  • 被这个类所有的对象所共享!!!!!
  • 可以使用类名.方式访问

修饰成员方法

  • 可以使用类名.方式访问

特点

  • 1.随着类的字节码的加载而初始化
  • 2.被所有对象所共享,属于整个类共享的数据
  • 3.可以直接拿类名去使用, 不需要依附对象, 而且也建议大家通过类名的方式来访问!!!!
  • 4.随着类的加载而加载, 随着类而消失, 驻留内存中时间比较长, 用慎用!!!!!!
  • 5.静态的只能访问静态

2.3 abstract

抽象的,是一个修饰符  : 可以修饰类和方法

修饰类:

成为抽象类:特点:抽象类无法直接创建对象使用! 因为抽象类中可能含有抽象方法,因为抽象方法是没有方法体的,是一个残缺的方法,残缺的方法不能用!

如何使用抽象类?

  1. 定义抽象类的子类
  2. 让子类完成(重写)残缺的方法(抽象方法)
  3. 创建子类对象来去使用

和普通类的区别

和普通类对比,仅仅只是可以多定义一个东西,就是抽象方法,剩下的和普通类一模一样

修饰方法

抽象方法, 特点: 没有方法体。  

注意:有抽象方法的类必须是抽象类

abstract和那些关键字是冲突的

private  例:private abstract void method();

典型错误, 因为private关键字不能被子类直接看到,   abstract是强制子类重写, 子类不能重写父类的私有方法!!!!!

final 例:public final abstract void method();

典型错误, final不让子类重写,  而abstract必须要子类重写!!!!!冲突!!!!!

 

3.多态

概念:面向对象的三大特征之一
特点:

  • 父类引用指向子类对象
  • 父类 对象名 = new 子类(); 动物 对象名 = new 猫();

前提:

  1. 必须有继承或者实现关系
  2. 必须有方法重写  (因为多态只能看到父类的东西,也只能使用父类中定义有的东西,如果子类对方法没有重写的话,干脆创建父类对象得了,多态将毫无意义)
  3. 必须有父类引用指向子类对象

由于多态格式中即出现了父类也出现了子类,我们需要搞清楚访问的到底是谁?

  1. 如果直接访问属性,我们看到的父类属性,不能访问子类特有的属性,因为看不到(不重要,以后的父类成员变量会用private修饰)
  2. 如果访问的功能,我么走的是子类的功能,不能访问子类特有的功能

好处:

经常用来提高方法的扩展性,将父类定义成方法的参数,可以接收其所有的子类

弊端:

多态不能使用子类特有内容!!(方法定义者在定义的时候使用父类类型来接收,他也不知道调用传入的到底是哪个子类,所以只能使用父类中共性内容不能使用特有内容)

如何解决?

用向下转型(不常用,不如直接new子类对象调用)

格式: 子类类型 对象名 = (子类类型) 父类引用 

Fu fu  = new Zi();
Zi zi = (Zi) fu;

注意事项:必须是还原操作否则会出现错误,java.langClassCastException(类型转换异常)

例如: Animal a = new Cat();  Dog d = (Dog)  a;

解决方案  对象instanceof 类型  得到的是一个boolean类型值,判断一个对象是否是某一个类型

 4.接口

4.1如何定义接口

public interface 接口名 {
    自定义常量
    抽象方法(重要的)
    默认方法
    私有方法
    静态方法

}

4.2定义接口内容

可以定义抽象方法

4.3接口的特点

1.由于里面可能含有抽象方法,所以不能直接使用!!

如何使用?

  • 定义一个类去实现接口 implements
  • 重写它所有的抽象方法
  • 使用接口的实现类

2.接口中的成员变量默认被public static final修饰(public static final被省略)

3.接口中没有构造方法函数的概念(构造函数的作用的在堆中对成员变量进行初始化用的)

4.接口中的方法默认被public abstract

5.在jdk1.8及以后可以定义默认方法

[public] default 返回值类型 方法名(参数列表) {
    方法体
    return 返回值;

}

作用:

接口升级比较难受,于是在jdk1.8的时候可以这样定义默认解决接口升级的问题

使用场景: 只有当接口中的升级方法都一样的话,才会使用默认方法

6.在jdk1.8以后可以定义静态方法

[public] static 返回值类型 方法名(参数列表) {
    方法体;
    return 返回值;
    
}

有啥用?

用处非常微小, 废物点心,  我们习惯将静态方法放到类中!

注意事项    接口中的静态方法只能使用接口名访问, 不能使用实现类访问!!!!!!

7.在JDK1.9的时候可以定义私有方法

开发过程中使用的目前都是1.8

他的出现为了抽取默认方法和静态方法的共性内容出现的

4.4类和接口的关系

类和类:单继承, 不能多继承, 但是可以多层继承

类和接口:多实现 (因为接口当初设计的时候只有抽象方法, 抽象方法是没有方法体, 所有没有冲突!所以没有冲突)

接口和接口:多继承

4.5接口和抽象类

抽象类的定义规则和规范的范围是强制所有的"子类" 必须实现(重写)抽象方法

接口的定义规则和规范的范围, 所有的实现该接口的实现类,灵活比较高,可以让类选择性的实现!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值