Java学习之:面向对象2

(一)代码块*

1.分类:

1)普通代码块:定义在方法中的代码块
2)静态代码块:
①定义:使用static定义的代码块
②特点:
a. 静态块优先于构造块执行。
b. 无论产生多少实例化对象,静态块都只执行一次。
3)构造块:
①定义:定义在类中的代码块(不加修饰符)
②特点:构造块优先于构造方法执行,每产生一个新的对象就调用一次构造块
4)同步代码块

2.代码块执行顺序:

范例:(<-请点击)

(二)内部类

1.定义:

在一个类的内部进行其他类结构的嵌套的操作

2.特点:

1)内部类方法可以访问该类定义所在作用域中的数据,包括被 private 修饰的私有数据
2)内部类可以对同一包中的其他类隐藏起来
3)内部类可以实现 java 单继承的缺陷

3.内部类与外部类关系

1)对于非静态内部类,内部类的创建依赖外部类的实例对象
2)①内部类可以直接访问外部类的元素(包含私有域),因为内部类的作用域;Outer.this.外部类的成员属性
②但是外部类不可以直接访问内部类的元素
3)外部类可以通过内部类引用间接访问内部类元素

4.内部类分类

1)成员内部类:
①成员内部类中不能存在任何static的变量和方法
② 成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类

2)静态内部类:使用static修饰的内部类
① 静态内部类的创建是不需要依赖于外围类,可以直接创建
②静态内部类不可以使用任何外围类的非static成员变量和方法
静态内部类外部类的创建外部类.内部类 内部类对象 = new 外部类.内部类();

3)方法内部类:
①局部内部类不允许使用访问权限修饰符 public private protected 均不允许
② 局部内部类对外完全隐藏,除了创建这个类的方法可以访问它其他的地方是不允许访问的。
③ 局部内部类要想使用方法形参,该形参必须用final声明(JDK8形参变为隐式final声明)

4)匿名内部类:没有名字的方法内部类
① 匿名内部类是没有访问修饰符的。
② 匿名内部类必须继承一个抽象类或者实现一个接口
③ 匿名内部类中不能存在任何静态成员或方法
④ 匿名内部类是没有构造方法的,因为它没有类名。
⑤ 与局部内部相同匿名内部类也可以引用方法形参。此形参也必须声明为 final

5)在外部类外部实例化内部类:

外部类.内部类 内部类对象 = new 外部类().new 内部类();
Outter.Inner in = new Outter().new Inner();

(三)继承

1.实现:

使用 extends 关键字

2.作用:

对类进行扩充以及代码的重用;发生了类继承关系之后,子类可以直接继承父类的操作

3.限制:

子类对象在进行实例化前一定会首先实例化父类对象。默认调用父类的构造方法再调用子类构造方法进行子类对象初始化。
注:如果父类里没有提供无参构造,那么这个时候就必须使用super()明确指明你要调用的父类构造方法

4.Java不允许多重继承,但是允许多层继承

(四)覆写:override

1.定义:

子类定义了与父类相同的方法或属性

2.方法覆写:

子类定义了与父类方法名称参数类型个数完全相同的方法。但是被覆写不能够拥有比父类更为严格的访问控制权
注:如果父类中方法或属性用private访问修饰符修饰,那么子类无法进行覆写的,因为子类根本不知道父类有这样的方法或属性

*(五)重载与覆写

在这里插入图片描述

(六)super关键字

1.用法:

1)如果父类里没有提供无参构造,那么这个时候就必须使用super()明确指明你要调用的父类构造方法
2)子类使用super.方法()/super.属性明确调用父类中的方法或属性

(七)final关键字

1.使用及注意事项:

1)类:
①使用final定义的类不能有子类(String类便是使用final定义)
final一旦修饰一个类之后,该类的所有方法默认都会加上final修饰。(不包含成员变量)
2)变量:
①final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误
②使用final定义的变量就成为了常量,常量必须在声明时赋值,并且不能够被修改public static final MAX_AGE = 120;
3)方法:
使用final定义的方法不能被子类所覆写

*2.数据类型转换

当使用 +、-、*、/、%、运算操作时,遵循如下规则:
1)只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型;
2)如果两个操作数中有一个是float类型的,另一个将会被转换为float类型,并且结果也是float类型;
3)如果两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型;
4)操作数为:byte、short、int 、char,两个数都会被转换成int类型,并且结果也是int类型。但是final修饰的域类型不会发生变化
*5)范例代码(请点击)

(八)多态性

1.方法的多态性:

①方法的重载:同一个方法名称可以根据参数的类型或个数不同调用不同的方法体
②方法的覆写:同一个父类的方法,可能根据实例化子类的不同也有不同的实现

*2.对象的多态(前提:方法覆写)

  1. 对象的向上转型:【自动,90%】父类 父类对象 = 子类实例
    注:不管是否发生了向上转型,核心本质在于:你使用的是哪一个子类(new在哪里),而且调用的方法是否被子类所覆写了。

2)对象的向下转型:【强制, 1%】子类 子类对象 =(子类)父类实例
向下转型指的是将父类对象变为子类对象,目的是为了子类扩充
范例代码(请点击)
注:不是所有的父类对象都可以向下转型 :如果要想进行向下操作之前,一定要首先发生向上转型,否则在转型时会出现ClassCastException

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值