一.抽象类

抽象类的概念:

1、Java中能够定义没有办法体的办法,还办法的具体实现由子类实现,该办法称为形象办法,蕴含形象办法的类就是抽象类;

2、如,shape类计算周长和面积的办法无奈确定,那么就能够将这样的办法申明为形象的,以便在具体的子类中实现

3.抽象类也叫做形象基类,抽象类是根底类和接口两头的一个中庸之道,即有根底类个性(已实现的办法体),又有接口个性(形象办法),抽象类用abstract润饰,抽象类中能够有形象办法也用abstract来润饰。

抽象类的特色:

形象办法的申明

修饰符abstract 返回值类型 办法名([参数列表]);

留神:因为形象办法无奈确定具体执行的性能,所以形象办法没有办法体,须要在小括号后加上分号

抽象类的申明

语法:修饰符 abstract class 类名 extends 父类名

抽象类和一般类除了应用abstract润饰外和一般的类类似;

抽象类中能够没有形象办法;然而一旦某个有形象办法,那么这个类必须被申明为抽象类

static final private不能和abstract共存

抽象类的应用:

因为抽象类不是一个具体的类,所以无奈实例化,然而抽象类能够用于申明变量;

抽象类能够被继承,在子类中实现所有抽象类的所有形象办法,以达到抽象类的具体化;

留神:因为形象办法无奈确定具体执行的性能,所有形象办法没有办法体,须要在小括号后加上分号;

形象办法:不容许蕴含办法体;子类中须要重写父类的形象办法,否则,子类也是抽象类

格局:
public abstract void eat();

形象办法:java 中能够定义一些不含办法体的办法,它的办法体的实现交给该类的子类依据本人的状况去实现。 抽象类:蕴含形象办法的类叫抽象类。一个抽象类能够有一个或多个形象办法。

抽象类必须应用abstract修饰符来定义,形象办法也必须用abstract来润饰。 抽象类不能被实例化,不能用new关键字去产生对象。 形象办法只能申明,不能实现。 含有形象办法的类必须被申明为抽象类,抽象类的子类必须笼罩所有的形象办法后能力被实例化,否则这个子类还是个抽象类。

二. 接口

接口的概念:

接口为咱们提供了一种将接口与实现拆散的更加结构化的办法。接口是一个齐全的抽象类,它没有提供任何模式的具体实现,它容许创建者确定办法名,参数类表,返回类型没有任何办法体的办法。

接口被用来建设类与类之间的协定。接口类修饰符必须是public,default(默认的,本包内有拜访权限)或者前边两个和abstract组合,接口也能够蕴含域,然而这些域隐士地是public static final类型的,所有接口域必须初始化值。接口中办法默认拜访级别都是public,如果定义拜访级别小于public,编译将不能通过。

接口是用来实现类间多重继承性能的构造. 接口不能实例化,即不能用new运算符创建对象。 一个类通过应用关键字implements申明本人实现一个或多个接口。 在类体中能够应用接口中定义的常量,而且必须实现接口中定义的所有办法 接口中的办法是主动私有的,在实现接口时必须把办法申明为public 。接口中的办法都是形象的。

一个接口能够继承另一个接口。

任何类(包含一般类,外部类,抽象类)能够实现一个接口。

接口的特色:

在Java中接口不仅仅是程序开发过程中“约定”,更是更加抽象化的抽象类

无奈归纳到一个类的但某些特色雷同

语法:

修饰符 interface 接口名{[常量];[形象办法];}

接口中形象办法能够不写abstract关键字,拜访修饰符默认public

当类实现接口时,须要去实现接口中的所有形象办法,否则须要将该类设置为抽象类;

接口中能够蕴含常量,默认public static final

接口也能够实现继承,并且能够继承多个父接口

接口的作用:

进步程序的重用性;进步程序的可扩展性;升高程序的耦合度;实现了多继承 。

default:默认办法 能够带办法体 jdk1.8后新增;能够在实现类中重写,并且能够通过接口的援用调用

static:静态方法 能够带办法体 jdk1.8后新增;不能够在实现类中重写,能够通过接口名调用

三.外部类

什么是外部类? 在Java中,能够将类定义在另一个类外面或者一个办法外面,这样的类称为外部类

定义:

在一个类外部定义类

外部类的写法:class 类名{ } 它能够间接拜访和援用他的外部类的所有变量和办法,与外部类相比,外部类能够申明为private或protected.

用static润饰一个外部类时(嵌套类),这个类相当于是一个内部定义的类,所以static的外部类中可申明static成员 static外部类不能应用外部类的非static成员变量

函数的局部变量(形参也是局部变量),外部类的成员变量,外部类的成员变量重名,用以下形式来明确指定咱们真正要拜访的变量。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n311" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> public class Outer {  private int size;   class Inner {   private int size;   public void doStuff(int size) {   size++; // 援用的是doStuff函数的形参   this.size++; // 援用的是Inner类中的成员变量   Outer.this.size++; // 援用的Outer类中的成员变量 } }}</pre>

办法中定义外部类?

外部类并非只能在类里定义,也能够在几个程序块的范畴之内定义外部类。例如在办法或for循环体外部,均能够. 在办法中定义的外部类只能拜访办法中的final类型的局部变量。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n362" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> public void testClassInMethod(final String arg) { class ClassInMethod { void test() { System.out.println(arg); } } }</pre>
外部类如何被外部类援用?

外部类能够通过创建对象从外部类之外被调用,只有将外部类申明为public

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n330" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">public class Outer { private int size; class Inner { private int size; public void doStuff(int size) { size++; // 援用的是doStuff函数的形参 this.size++; // 援用的是Inner类中的成员变量 Outer.this.size++; // 援用的Outer类中的成员变量 } } public static void main(String[] args) { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); inner.doStuff(1); }}</pre>

外部`类分类:

成员外部类:将一个类定义在另一个类的成员地位; 获取外部类对象实例,

形式1:new外部类.new 外部类
形式2:外部类对象.new 外部类
形式3:外部类对象.获取办法

1、外部类在内部应用时,无奈间接实例化,须要借由外部类信息能力实现实例化;

2、外部类的拜访修饰符,能够任意,然而拜访范畴会受到影响;

3、外部类能够间接拜访外部类的成员;如果呈现同名属性。优先拜访外部类中定义的;

4、能够应用外部类.this成员的形式,拜访外部类中同名的信息;

5、外部类拜访外部类信息,须要通过外部类实例,无奈间接拜访;

6、外部类编译后.class文件命名:外部类$外部类.class;

7、外部类中是否能够蕴含与外部类雷同办法签名的办法

部分外部类:

将一个类定义在另一个类的办法体中或者代码块中;

1、定义在办法外部,作用范畴也在范畴内

2、和办法外部成员应用规定以用,class后面不能够增加public、private、protected、static

3、类中不能蕴含动态成员

4、类中能够蕴含final,abstract润饰的成员

动态外部类:

将一个类定义在另一个类的成员地位,并且static修饰符;

1、动态外部类中,只能间接拜访外部类的动态成员,如果须要调用非动态成员,能够通过对象实例

2、动态外部类对象实例时,能够不依赖于外部类对象

3、能够通过外部类.外部类.动态成员的形式,拜访外部类中的动态成员

4、当外部类属性与外部类属性同名时,默认调用外部类中的成员;如果须要拜访外部类中的动态属性,则能够通过外部类.属性的形式;如果须要拜访外部类中的非动态属性,则能够通过new外部类().属性的形式

匿名外部类:

匿名外部类没有名字

只须要为部分外部类建设一个对象,不用为该类指定一个名字。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n293" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">public Inner testAnonyClassInMethod() { return new Inner() { // 此处为一个匿名类定义,没有类名,意思为创立一个继承自Inner外部类的对象 @Override public void doStuff(int size) { super.doStuff(size); } };}</pre>

1、匿名外部类没有类型名称、实例对象名称

2、编译后的文件命名:外部类$数字.class

3、无奈应用private、public、protected、abstract、static润饰

4、无奈编写构造方法,能够增加结构代码块

5、不能呈现动态成员

6、匿名外部类能够实现接口也能够继承父类,然而不能兼得

抽象类和接口的区别与分割?

一个类能够实现多个接口, 而一个类只能继承一个抽象类。 接口只定义方法,实现一个接口就是要实现接口的所有办法。而抽象类能够实现局部办法。 多个无关的类能够实现同一个接口,一个类能够实现多个无关的接口