第九章 面向对象编程(高级)

本文详细介绍了Java面向对象编程中的类变量、静态方法、main方法、代码块、单例模式、final关键字、抽象类、接口以及内部类的使用,探讨了它们的语法、应用场景和注意事项,包括多态特性和设计模式的应用。
摘要由CSDN通过智能技术生成

在这里插入图片描述

1.类变量(静态变量)和类方法

1.类变量引出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这种方法最大的问题就是count变量不是属于所有变量
在这里插入图片描述

2.类变量快速入门

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.内变量内存剖析

在这里插入图片描述
在这里插入图片描述

一般在jdk8以前,我们认为count变量在方法区(静态域)里面
在jdk8以后,我们认为在堆中
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
注意:同一个类所有对象共享

4.类变量定义访问

在这里插入图片描述
在这里插入图片描述
将访问修饰符改正private之后,将不能访问
在这里插入图片描述

5.类变量使用细节

在这里插入图片描述
在这里插入图片描述

6.类方法快速入门

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.类方法的使用场景

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.类方法注意事项

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第四条
在这里插入图片描述

第五条
在这里插入图片描述
在这里插入图片描述
第六条
在这里插入图片描述

9.类成员课堂练习

第一题
在这里插入图片描述
在这里插入图片描述

第二题
在这里插入图片描述
在这里插入图片描述
第一个中:getTotalPerson()方法是静态方法,可以直接通过 类·方法 的方式调用

第三题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.理解main方法语法

1.main方法语法说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.main特别说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.main动态传值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.代码块

1.代码块快速入门

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.代码块使用细节

1.代码块使用细节1(类什么时候被加载)

在这里插入图片描述
第一种类加载情况
在这里插入图片描述
在这里插入图片描述
第二中类加载情况
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第三种使用类的静态成员时
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但如果是普通代码块,每创建一个对象就执行一次
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
普通代码块只有在创建对象时才会被执性且每创建一个对象就会执行一次,这里的DD.n1并没有创建对象。
DD.n1使用了类的静态成员,发生了类的加载,所以静态代码块会被执行。
在这里插入图片描述

2.代码块使用细节2

在这里插入图片描述
第四条(1)
在这里插入图片描述
在这里插入图片描述

如果换一个顺序
在这里插入图片描述
在这里插入图片描述

第四条(2)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果顺序颠倒
在这里插入图片描述
在这里插入图片描述

第四条(3)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.代码块使用细节3

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中有两个隐藏的super()和调用本类普通代码块
在这里插入图片描述
在这里插入图片描述
如果在父类AAA中再加一个普通代码块,则
在这里插入图片描述
在这里插入图片描述

4.代码块使用细节4

在这里插入图片描述
注意:创建对象 第一步是:类加载,1和2
第二步才是:创建对象,3,4,5,6

第六条 下面是第一步,类加载
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面是第二步:创建对象
先找构造器,先找到子类的构造器运行super()
在这里插入图片描述

之后就运行到父类的构造器
在这里插入图片描述
即执行下面的(5)(6)两个步骤
在这里插入图片描述
再执行(7)
在这里插入图片描述
上面就是将子类中super()执行完毕
下面就继续执行子类的普通代码块和普通属性的初始化
在这里插入图片描述
即执行(8)(9)
在这里插入图片描述

最后再执行(10)
在这里插入图片描述
下面就是最后的结果
在这里插入图片描述
在这里插入图片描述
第七条
在这里插入图片描述
静态代码块只能调用静态成员
在这里插入图片描述
普通代码块可以调用任意成员
在这里插入图片描述

3.代码块课堂练习

在这里插入图片描述
调用Person.total语句时会完成类的加载,
类的加载则导致static方法块中的两条语句的执行,只会执行一次。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意,没有继承关系
在这里插入图片描述

4.单例设计模式

在这里插入图片描述
在这里插入图片描述

1.单例模式饿汉式

在这里插入图片描述
下面就是不是单例了,因为创建了两个GirlFriend对象
在这里插入图片描述
在这里插入图片描述
如果上面的new GirlFriend前面没有static
那么下面的return gf的static方法(下面那个方法必须是static,不然的话要调用这个方法就必须先new一个对象,但是这里无法new一个带一个参数的对象,因为构造器是private)就会报错,因为
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们也可以加一个toSring方法将名字打出来
在这里插入图片描述
在这里插入图片描述
下面我们也可以再调用一次,但实际上instance和instance2对象是同一个对象,因为调用getInstance方法时直接返回的是gf,而这个gf是静态的,所以只会初始化一次,因为
静态相关的在类加载时就调用了,而且只会调用一次
在这里插入图片描述
小结 饿汉式步骤
在这里插入图片描述

2.单例模式懒汉式

饿汉式就是你没有使用这个实例,但他已经被创建了
懒汉式就是只有在你使用的时候,他才给你创建这个实例
下面我们再来看一下饿汉式,这里我使用了他的静态变量n1,实际上这个时候我并没有使用到gf,但我们在使用静态属性n1的时候会导致我们的GirlFriend这个类被加载,那么这句话,
在这里插入图片描述

即静态属性的初始化会被执行,一旦这句话被执行,我们的构造器也会被调用
在这里插入图片描述
在这里插入图片描述
饿汉式可能会有创建了对象但没有使用,造成资源的浪费,所以我们又设计出了懒汉式

下面就是懒汉式,就算我们这边的类被加载了,但我们的构造器仍然不会被调用
在这里插入图片描述
我们这边使用了他的静态属性,导致了类加载,但我们这边并没有new
在这里插入图片描述
在这里插入图片描述
如果想要创建这个猫对象,我们调用下面这个方法即可,为了更好地看清楚instance,我们加了一个toString()方法
在这里插入图片描述
在这里插入图片描述
如果我们再次调用getInstance()方法,它不会创建一个新的cat,因为此时cat已经不等于null了
下面看见构造器没有并没有被调用两次
并且instance和instance2是同一个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.final关键字

1.final的基本使用

在这里插入图片描述
第(1)个
在这里插入图片描述
第(2)个
在这里插入图片描述
第(3)个
在这里插入图片描述
在这里插入图片描述
第(4)条:局部常量的规范写法一般要大写
在这里插入图片描述

2.final使用细节

在这里插入图片描述
第一条
在这里插入图片描述
第二条
在这里插入图片描述
第三条
构造器不行,因为构造器只有在创建对象的时候才会被触发,而静态变量的初始化是在类加载时就要给值,所以这里会报错
在这里插入图片描述
第四条
这里不会报错
在这里插入图片描述
在这里插入图片描述

第五条
虽然我不能重写,但调用的话是完全可以的
在这里插入图片描述
在这里插入图片描述

3.final使用细节

在这里插入图片描述
第五条
语法没有问题,但是有点画蛇添足,这个AAA是一个final类,不能被继承,其中的cry()方法也不可能被重写,因为cry()方法加final就防止被重写,但AAA类连被继承的机会的都没有,更不可能重写其中的方法。
在这里插入图片描述
第七条
一般情况下,我们使用其中静态属性,会导致类的加载,会造成其中的静态代码块同时被执行,但是有时候我们不想同时执行这个静态代码块,就可以使用final,使用final之后再使用这个属性就不会导致类的加载,也就不会调用这个静态代码块。
在这里插入图片描述
下面是加过final之后的结果
在这里插入图片描述

其中final与static顺序可以颠倒
在这里插入图片描述
第八条
输入ctrl + B可以查看源码
在这里插入图片描述
在这里插入图片描述

4.final课堂练习

第一题
在这里插入图片描述
下面我也发现了final定义的属性,在生成构造器时并没有自动加上它
在这里插入图片描述
在这里插入图片描述

第二题
在这里插入图片描述
在这里插入图片描述

6.抽象类

1.抽象类引出

在这里插入图片描述
当一个方法没有上面实际意义,我们不准备实现它,不实现它,我们就将其申明为抽象方法,同时要将这个类申明为抽象类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.抽象类细节

在这里插入图片描述

加了方法体会报错
在这里插入图片描述
在这里插入图片描述

第一个
在这里插入图片描述
第二个
在这里插入图片描述
第三个
在这里插入图片描述
在这里插入图片描述
第四个
在这里插入图片描述
在这里插入图片描述
第五条
在这里插入图片描述

第七条
在这里插入图片描述

有方法体就叫实现
在这里插入图片描述
在这里插入图片描述
因为将来子类可能要重写这个abstract方法,但是private就无法重写,
final是最终的意思,肯定是不希望将来对其修饰的方法进行修改,
而static与abstract是不允许组合在一起的。

3.抽象类课堂练习

在这里插入图片描述

第一题
错误
final是不可以被继承的,但abstract又是希望子类继承去重写其方法
在这里插入图片描述

第二题
错误
abstract是不能与static相组合的,静态方法是不能重写的
在这里插入图片描述

第三题
错误
私有的方法不能重写
在这里插入图片描述

第四题
在这里插入图片描述

Employee类
在这里插入图片描述

Manager类
在这里插入图片描述

在这里插入图片描述

CommonEmployee类
在这里插入图片描述

Main方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.抽象模板模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
首先用容易想到的方法做
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面我们对它进行一个改进
AA类
在这里插入图片描述
在这里插入图片描述

BB类
在这里插入图片描述
在这里插入图片描述

Main方法
在这里插入图片描述
如果我们又有一个cc,我们可以用如图所示方法在对其进行改进
上面那个父类就是一个模板
在这里插入图片描述
在这里插入图片描述

Template类
在这里插入图片描述
在这里插入图片描述

AA类
在这里插入图片描述

BB类
在这里插入图片描述

main方法
在这里插入图片描述

7.接口

1.接口快速入门

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Usbinterface接口类
在这里插入图片描述
Phone类
在这里插入图片描述

Camera类
在这里插入图片描述

Computer类
在这里插入图片描述

Main方法
在这里插入图片描述

2.接口基本介绍(默认方法)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在接口类中直接写方法会报错,必须有default关键字修饰
在这里插入图片描述
在这里插入图片描述

静态方法不用default关键字
在这里插入图片描述

3.接口应用场景

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接口类 下面A与B程序员写的方法名必须与接口中一样,这样子十分规范
在这里插入图片描述

A程序员写的Mysql类
在这里插入图片描述

B程序员写的oracle类
在这里插入图片描述

Mian方法
在这里插入图片描述

在这里插入图片描述

4.接口使用细节1

在这里插入图片描述

第一个
接口不能被实例化
在这里插入图片描述

第二
前面的public与abstract都可以省略
在这里插入图片描述

第三条
在这里插入图片描述

快键方法,将光标放在标红的提示处,输入alt+enter
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接口中的方法必须都是public,其他都会报错
在这里插入图片描述
在这里插入图片描述

第四条
在这里插入图片描述
在这里插入图片描述

5.接口使用细节2

在这里插入图片描述
第五条
在这里插入图片描述
第六条
在这里插入图片描述
第八条
在这里插入图片描述

6.接口课堂练习

最后一个B.a与继承是一个道理
在这里插入图片描述

7.接口VS继承

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里的继承是单继承,我们的littlemonkey虽然可以继承了monkey的爬树能力,但是如果我们同时想要鸟的飞行能力和鱼的游泳能力就无法做到了。
我们可以使用接口的方式来解决
先加一个getname方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.接口的多态特性

在这里插入图片描述

第一条
在这里插入图片描述
在这里插入图片描述
下面对比一下接口和继承的多态
就是向上转型
在这里插入图片描述
在这里插入图片描述
第二条
usb[i].work()也是有多态绑定机制的
当执行到usb[0].work()时,它会去调用phone_的work方法
当执行到usb[1].work()时,它会去调用camera_的work方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.接口的多态传递

在这里插入图片描述
在这里插入图片描述
上面这样写就会出错
但是我们extends一下
在这里插入图片描述
在这里插入图片描述

10.接口课堂练习

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面进行修改
在这里插入图片描述
在这里插入图片描述

8.内部类

1.四种内部类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.局部内部类1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.局部内部类2

在这里插入图片描述
我在这个内部类中也设置了一个n1,根据就近原则,我们输出的会是内部类的n1.
在这里插入图片描述
如果我们想要访问外部类的n1,可以使用以下方式
在这里插入图片描述
下面解读一下Outer02.this
在这里插入图片描述
在这里插入图片描述
我们查看他们的哈希地址,发现确实如此
在这里插入图片描述

4.匿名内部类

匿名内部类其实有名字,表明上看不见,其实在系统的底层jdk的底层给他分配了名字。
在这里插入图片描述
下面是基于接口的匿名内部类的使用
在这里插入图片描述
在这里插入图片描述

上面的写法十分麻烦,下面我们使用匿名内部类来简化开发。
我们怎么样可以既不用创建这个tiger,又能输出老虎叫唤…
在这里插入图片描述

效果是一样的
在这里插入图片描述
下面我们来看看具体实现
在这里插入图片描述
getclass()就是用来获取对象的运行类型,他的运行类型就是这个内部类,名字就叫Outer04 1 , 这个是系统分配的,以后我们看见 X X X X 1,这个是系统分配的,以后我们看见XXXX 1,这个是系统分配的,以后我们看见XXXXX之类,首先想到可能是匿名内部类。
这个匿名内部使用一次就没了,不能再使用
在这里插入图片描述
在这里插入图片描述
重新创建这个匿名内部类会出错
在这里插入图片描述

下面是基于类的匿名内部类的使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
有大括号跟没有大括号完全不一样,比如上面没有大括号,就创建一个father的对象。
此时的编译类型跟运行类型都是Father。
但下面这个加了大括号的就是创建一个匿名内部类了。运行类型就要发生变化
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面我们看一下输入的jack的情况
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面是基于抽象类的匿名内部类的使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.匿名内部类细节

在这里插入图片描述
调用匿名内部类的方法一
在这里插入图片描述
在这里插入图片描述
调用匿名内部类的方法二
在这里插入图片描述

我们也可以传参数进去
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第三条
在这里插入图片描述
在这里插入图片描述
第七条:匿名内部类用完一次就没有了
第八条:与前面的局部内部类一个道理
在这里插入图片描述
在这里插入图片描述

6.匿名内部类实践

在这里插入图片描述

下面是匿名内部类的方式
在这里插入图片描述
在这里插入图片描述
下面是传统方式、
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.成员内部类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第四条
不管是属性还是方法(不管私有还是公有)都可以直接访问
在这里插入图片描述
第五条
注意,这里private也是可以直接访问的,因为是在同一个类Outer08中
在这里插入图片描述
第六条
外部其它类,有二种方式来访问内部成员类
第一种方法
在这里插入图片描述
第二种方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.静态内部类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第四条
在这里插入图片描述

第五条
在这里插入图片描述

在这里插入图片描述

第六条
方法一
在这里插入图片描述

方法二
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第七条
这里不用加this,因为static可以用 类名.类变量名 来访问
在这里插入图片描述
在这里插入图片描述

9.课堂练习

在这里插入图片描述
在这里插入图片描述
这里有一个错误,第一个5是上面的new Test()时调用构造器时输出的

9.本章练习

1.本章练习1

在这里插入图片描述
new Car()会调用静态属性color,将white赋给color
new Car(100)不会调用静态属性color,因为静态部分只会随着类的加载执行一次
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.本章练习2

在这里插入图片描述
静态属性是所有对象共享的,所以第二次的值是100200,而不是100100
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.本章练习3

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.本章练习4

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上面是老师写的,下面是我写的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.本章练习5

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.本章练习6

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.本章练习7

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值