Java面向对象学习的第四天,今天学习的内容感觉抽象,不太容易理解,但是多加练习,这部分内容并不难
今天学习的内容有:
|–内部类
|–多态
|–抽象类
|–匿名内部类
|–接口
|–接口的实现类
|–接口的命名规范
-
内部类
内部类,顾名思义是类内部的类,但他是如何定义的呢:
如何定义内部类内部类可以直接访问包裹着它的外部类任何属性和方法(包括私有的)
一般而言,定义内部类,注意的目的,肯定是在包裹着它的外部类中使用它。
他是存在于类的内部从而对类内部的各种属性和方法进行使用的
内部类有点跟继承相似,是相当于是利用类里面的方法和属性,而不同之处是内部类可以使用外部类的任何属性和方法包括私有属性和方法。
可以看到19行是定义的一个普通内部类,29行定义的是一个静态内部类,静态内部类顾名思义是在类前面加一个static修饰,定义普通类和静态类有区别,那么两者的初始化方法也是不同的:
|–如果在外界初始化内部类对象
Inner01 t1 = new TestInnerClass().new Inner01();
t1.say();|-- 如果是静态内部类,可以使用下面方式创建
Inner02 t2 = new TestInnerClass.Inner02();
t2.say();
为什么在Java中需要内部类?总结一下主要有以下四点:
1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,
2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
3.方便编写事件驱动程序
4.方便编写线程代码
Java语言的继承方式是单继承的,为了能够实现多继承的方法,我们可以利用内部类这一种方法类进行实现。
这一方法使得Java多继承的方式能够得以实现
-
多态
面向对象三大特征——多态
多态: 一个事务的多种状态
多态是在继承的基础上存在的,父类引用指向子类实例!!
多态的案例:
有个人,养了写宠物,宠物可能会生病,治疗宠物
下面来看一下代码的例子来直观的看一看多态是如何实现的:
先定义一个主类Master,然后定义几个属性,当然我们利用private定义属性是用到了封装的,故我们会用到setter和getter方法来能够被调用
可以看到这两段代码是极其相似的,所以我们为了简便的利用代码会用到多态:
定义一个cure方法,来集中实现cure中的方法,而不是像之前那样单独的经进行方法的构建,造成繁琐,因为同为一种方式,我们可以定义到一种方法里面去,从而实现代码的简便化,也能够使得程序更加清晰。
我们在子类QQ和Pigz中定义好cure方法(其中运用了继承的方法),这样我们把具体的方法具体到每一个类中,能够非常清晰的知道,这个类cure时要做什么,另一个类cure时要做什么,然后我们在主类中直接使用cure方法,不管是谁,只要满足哪个的条件就输出哪个类的结果,这样使得代码的实现更加精确,也是程序运行的更加高效。
-
抽象类
如果父类中的方法不需要实现(没有方法体),而是由子类实现的,
该方法就可以声明为抽象方法,抽象方法使用abstract关键字修饰。
如果某个类存在抽象方法,该类必须声明抽象类一个某个类中存在抽象方法,该类必须是抽象类;
如果一个类是抽象类,它里面的方法不一定是抽象方法!!
抽象方法,本质就是用来继承实现的。
如果一个类,继承了抽象类,没有实现里面的抽象方法,则该类必须也声明为抽象类,由其子类继续实现。
抽象类无法实例化!!!
文字解释过于抽象,我们用代码来展示:
抽象类是不能有结构体的,因为他不能够实例化,所以只能写成这样。
抽象的方法我们是通过继承来加以实现的
而抽象类的作用呢:
以理解为一种约定工具,在代码中抽象类在某种情况适合用来写出大体框架,具体实现流程由抽象类事先定义完毕,具体实现过程可以定义抽象方法,而抽象方法交由子类去具体实现。
抽象类是先定义好所有的内容,然后通过子类来加以实现,其实这种方法的好处也很明显,我们在父类中定义好了所有的抽象方法,然后我们能够很清晰的知道这个大的父类主要是做什么项目的,就相当于给人一个目录的感觉,具体内容我们写到子类里面去实现,就像一本书一样,父类给好了目录,然后子类里面是每一个故事。 -
匿名内部类
匿名内部类,来解决抽象类无法实例化的问题!!!
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
这是一个匿名类的实现
其中的16-20行都是定义匿名内部类的代码,可以看出这样比较简便的可以输出想要输出的方法
可以看到,我们直接将抽象类Person中的方法在大括号中实现了
这样便可以省略一个类的书写
并且,匿名内部类还能用于接口上
-
接口(interface):
java中的接口是一种特殊的抽象类,它里面的所有方法都没有实现1、接口中成员默认访问修饰符都是public,即便你不写!!!
2、一般接口中不写不同属性,写的要么是常量,要么是一些公共的变量(建议使用static修饰,方便访问)3、接口中的方法,都是抽象方法,没有实现体。
4、因此接口就是一种特殊的抽象类
可以看到我们在接口里面定义方法是不需要结构体的,也不需要返回值,他的特性也跟抽象类类似。
6.接口的实现类:
如果要实现接口中定义的方法,则需要写一个实现类
该类实现该接口
public 子类 implements 接口 {
// 需要实现所有该接口定义的方法
}
下面用代码实例来展示:
为了方便截图,我把两个类写在了一起,这两个类最好还是分开写
7.接口的命名规范:
这样的规范和习惯有助于以后做项目等的规范化
I + Xxxx 实现类:Xxx (前缀)
Xxxxx 实现类:Xxxx + Impl (后缀)
接口是可以多实现的,一定程度上,补全了java单继承的缺点。
在jdk8.0之前,接口中,没有实现了的方法(所有的方法都是没有实现的)!!!
8.0新特性:
1、接口中可以存在默认方法
default关键字来修饰
2、也可以静态方法,也就是说,此时接口就是一个工具类
例如3行的命名样式和20行的定义样式