Java基础篇

262 阅读28分钟

Java基础篇

Part1 Java语言基础

一、 IT和计算机

1. IT的发展史

IT业务 代表公司
第一代 大型机 IBM
第二代 PC/Mac机 MS、Apple
第三代 互联网 Goole、Baidu
第四代 移动互联网 Google、Apple、MS、Alibaba、IBM等

移动互联网:就是移动通信和互联网二者结合起来,成力一体。是指互联的接术、平台、商业模式和应用与移动通技术结合并实践的活动的总容。 物联网:利用局部网络或互联网等通信技术把传感器、控制器、机器、人员和物等通过新的联在一起,形成人与物、物与物相联,实现信息化、远程管理控制和智能化的网络。物联网是互联网的延申,它包括互联网及互联网上所有的资源,兼容互联网的所有应用,但物联网中有的元素(所有的设备、资源及通信等)都是个性化和私有化。

2. 操作系统和平台相关性

  • 操作系统:Operating System是管理和控制计算机与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。

  • 平台相关性:我们称能支持程序运行的硬件或软件环境为平台。不同的平台都有其特定的指令格式,也就是说win支持的指令格式和Linux支持的指令格式是不一样的。进而导致了windows的可执行文件不能再Linux平台上运行。反之也不行,把这种情况称为平台相关性。

比如windows系统的exe文件,Mac系统的app文件等等。 平台的相关性,应用软件的迁移问题就暴露出来了。

3. 计算机很二

①进制 进制也就是进位制,是人们定的一种进位方法。对于任何一种进制一X进制,就表示某一位置上的数字运算时是x进一位。十进制是逢十进一、十六进测是十六进一、二进数量逢二进一,以此类推。

二进制由两个基本数字0,1组成。规律是逢二进一,计机都使用二进制表示数

八进制:由0、1、2、3、4、5、6、7组成,规律是逢八进一

十进制:由0、1、2、3、4、5、6、7、8、9组成

十六进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这六个字母来分别表示10,11,12,13,14,15。字母不区分大小写。

②进制转换进制转换的核心思想是余数定理

十进制转二进制

③原码、反码和补码 原码反码和补码操作: 在计算机内,有符号数有3种表示法:原码、反码、补码。所有的数据运算都是采用补码进行的。 正数的原码反码补码都相同,负数稍微复杂。

原码:就是二进制定点表示法,即最高位为符号位,‘0’表示正,其余位表示数值的大小。

反码:负数的反码是对其原码逐位取反,但符号位除外。

补码:负数的补码是在其反码的末位加1。

求反码的时候,最高位是符号位不能改变。 正数的符号位是0, 负数的符号位是1.

  1. SUN公司和Java

①计算机语言和编程:

什么是计算机语言:

计算机语言(Computer Language)指用于人与计算机之间通讯的语言。计算机语言是人与计算机之间传递信息的媒介。计算机系统最大特征是指令通过一种语言传达给机器。为了使电子计算机进行各种工作,就需要有一套用以编写计算机程序的数字、字符和语法规划,由这些字符和语法规则组成计算机各种指令(或各种语句)。这些就是计算机能接受的语言。 计算机语言分类:(语言的发展总是朝着人类更容易理解的方向发展)

1)机器语言:直接用二进制语言表达,指令是用0和1组成的一串代码,它们有一定的位数,并分成若干段,各段的编码表示不同的含义(如0000代表加载(LOAD),0001代表存储(STORE))。

2)汇编语言:使用一些特殊的英文字母和符号串来代替机器语言的二进制码(又称符号语言),计算机是不认识这些符号的,这就需要一个专门的程序,专门负责将这些符号翻译成二进制数的机器语言,这种翻译程序被称为汇编程序。汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。 3)高级语言:使用一定格式的自然语言进行编写源代码,通过编译器将源代码翻译成计算机直接识别的机器语言,之后再由计算机执行,不直接操作硬件,把繁琐的翻译操作交给编译器来完成。

编程:人与计算机之间交流的过程,称之为编程。

②sun公司和java平台

Java由James Gosling(JAVA之父)和同事们共同研发,并在1995年正式推出。Java最初被称为Oak,是1991年为消费类电子产品的嵌入式芯片而设计的。1995年更名为Java,并重新设计用于开发Internet应用程序。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Javaapplet。另一方面,Java技术也不断更新。Java自面世后就非常流行,发展迅速,对C++语言形成有力冲击。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。2010年Oracle公司收购Sun Microsystems。

体系: Java分为三个体系,分别为:

Java SE(J2SE,Java2 Platform Standard Edition,标准版)

JavaEE(J2EE,Java 2 Platform, Enterprise Edition,企业版)

Java ME(J2ME,Java 2 Platform Micro Edition,微型版)

二、 类型和运算

1、 8种基本数据类型

  1. 四种整数类型(byte、short、int、long):

    • byte:8 位,用于表示最小数据单位,如文件中数据,-128~127
    • short:16 位,很少用,-32768 ~ 32767
    • int:32 位、最常用,-2^31-1~2^31 (21 亿)
    • long:64 位、次常用 注意事项: int i=5; // 5 叫直接量(或字面量),即 直接写出的常数。 整数字面量默认都为 int 类型,所以在定义的 long 型数据后面加 L或 l。 小于 32 位数的变量,都按 int 结果计算。 强转符比数学运算符优先级高。见常量与变量中的例子。
  2. 两种浮点数类型(float、double):

    • float:32 位,后缀 F 或 f,1 位符号位,8 位指数,23 位有效尾数。
    • double:64 位,最常用,后缀 D 或 d,1 位符号位,11 位指数,52 位有效尾数 注意事项:二 进 制 浮 点 数 : 1010100010=101010001.02=10101000.102^10(2次方)=1010100.0102^11(3次方)= . 10101000102^1010(10次方) 尾数: .1010100010 指数:1010 基数:2 浮点数字面量默认都为 double 类型,所以在定义的 float 型数据后面加F 或 f;double 类型可不写后缀,但在小数计算中一定要写 D 或 X.X float 的精度没有 long 高,有效位数(尾数)短。 float 的范围大于 long 指数可以很大。 浮点数是不精确的,不能对浮点数进行精确比较。
  3. 一种字符类型(char):

    • char:16 位,是整数类型,用单引号括起来的 1 个字符(可以是一个中文字符),使用 Unicode 码代表字符,0~2^16-1(65535) 。 注意事项: 不能为 0个字符。 转义字符:\n 换行 \r 回车 \t Tab 字符 " 双引号 \ 表示一个\ 两字符 char 中间用“+”连接,内部先把字符转成 int 类型,再进行加法运算,char 本质就是个数!二进制的,显示的时候,经过“处理”显示为字符。
  4. 一种布尔类型(boolean):true 真 和 false 假。

  • 数据类型转换:

满足自动类型转换的条件:

两种类型要兼容:例如 数值类型(整形和浮点型)互相兼容

目标类型大于原类型:例如 double型大于int型

float 转double 可以正确转换;

double 转float会出现损失。

你可以这样来定义一个double型的 double d = 0.1; 然而,你不可以通过 float f = 0.1;来定义一个float型的,这是因为默认的小数是double型的 要定义一个float型的,有两种方式 float f = 0.1f; 或者 float f = (float)0.1;

java中可以自动隐式转换float为double,但是不能转化double为float。

java在运算时会自动的提升变量的精度来进行运算,double比float精度更高,所以可以自动的从float转化至double再进行运算。 其他类型转换也同理,精度低的可以自动向精度高的进行隐式转换。

  • 运算符的优先级:

最高级:小括号 ()

最低级:赋值运算符 =

运算符优先级顺序:

算术运算符(+-*/)>关系运算符(>、<、>=、<=、!=)>逻辑运算符(||、&&、!)

位运算符(了解):<<左移 3<<2=12-->322=12 即3*2^2=12

2、 逻辑运算符

"&","&&","|","||" 逻辑运算符用于连接布尔型表达式。在Java中不同于数学的逻辑表达 3<X<5 ,java 中应该写成 x>3 & x<5

"&" 和"&&" 的区别

单个"&",左边无论真假,右边都进行计算。(没有短路功能:两边表达式都执行;当两边表达式都为TRUE,整个表达式为true)

双个"&",左边为假,右边不进行计算。(短路与:当前面条件不成立时,后面不执行;当两边表达式都为TRUE,整个表达式为true)

"|"和"||" 的区别;

单个"|",左边无论真假,右边都进行计算。

双个"|",左边为真,右边不进行计算。

"|"和"&" 做位运算

二进制进行|位运算,只有0|0时候为0 ,其他为1,比如6|5 先把6和5换成二进制。6的二进制为110,5的二进制为101 那么用位运算0|0得0 只要有1得1,算出为111,111换成十进制为7,所以6|5等于7

二进制进行&位运算,只有1&1得1,其他得0,同理可得6&5算出二进制得100,100换成十进制为4

"^"异或运算和"~"反码

任何相同二进制异或运算都得0,1^1=0,0^0=0,不相同的异或运算都得1,1^0=1,0^1=1。同理6^5的011

那么011的十进制是3。提示一个数异或两次变回本身。比如6^5^5的 110,101,101。先得011,再得110所有又变回原来的数值,此技巧可以用来转换数值,不需要第3个变量即可两个变量值互转。

反码:二进制进行反码计算时。1变成0,0变成1。举例子~6,6的二进制是110在机器上补足32位在110之前补码0。那么反码为111.....001,此时的反码减去1得111.....111000,那么原反码减去相减的码得到0000....000111此时的十进制为-7那么加上原来减去的1得到-7+1就是~6了。(这个我也不是很懂。大牛们指正下)

"<<"左移">>"右移">>>"无符号右移

左移:空缺补0,被移除的高位丢弃,空缺位补0,比如32位二进制 0000....00011左移3位变成了0...00011xxx,则xxx补足000即可。规律左移是基数乘以2的移位幂次方,比如3<<2则是322也就是3乘以2的2次幂。

右移:最高位是什么就补什么。高位是1补1,是0就补0.,规律左移是基数除以2的移位幂次方,比如3>>1则是3/2也就是3除以2的1次幂。

无符号右移:无论高位是0还是1都补0

三、 方法

1. 方法重载

  • 在同一个类体
  • 方法名相同
  • 参数列表不同:类型不同、参数个数不同、参数顺序不同

四、 数组、数组高级

1. 数组初始化

数组必须初始化才能使用,所谓初始化就是给数组元素分配内存,并为每个元素赋值。

初始化数组的两种方式:

静态初始化;

特点:由我们自己来为每一个数组元素设置初始值,而数组的长度由系统决定。

int[] nums=new int[]{1,2,3,4,5};

动态初始化;

**特点:**由我们来设置数组的元素i个数(数组的长度),而每一个数组元素的初始值由系统决定。 int【】 nums=new int【5】;

无论以那种方式初始化数组,一旦初始化完成,数组的长度就固定了。如果要改变必须重新初始化。

NEW关键字;每new一次就开辟一次内存;

int[] nums =new int[5]{1,2,3,4,5};//写法是错误的,不能同时使用静态初始化和动态初始化。

什么时候使用静态初始化,什么时候使用动态初始化?

当我们事先知道需要存储哪一些数据的时候,选用静态初始化;

当我们事先不知道需要存储哪一些数据的时候,选用动态初始化。

数组是用来存放一组相同类型数据的容器

2. 数组在内存的存储形式

栈区:一般用来存储比较小的数据,开辟的变量空间一般都是在栈区。特点:计算机自动开辟空间,速度快但是小。栈内数据(局部变量等)使用完后,会自动释放空间;

堆区:一般无法自动开辟空间,都是需要手动开辟的,用来存储比较大的数据。特点是堆区空间大,但是速度慢。

数据区:一般用来存储静态变量和全局变量。

代码区:存储二进制程序代码。

数组在内存中的存储形式

3. 访问引用数据类型和基本数据类型的区别

基本数据类型(值传递),值会直接存储在栈区的变量当中。Var a=10;var b=a; a=11;console.log(b);也就是说我们在栈区开辟了两个变量空间a和b。在a和b中都存储了一个10;当a改变为11的时候,他们的空间不是同一个,b的值还是10;

引用数据类型(址传递),变量空间会在栈区开辟,但是值不是直接存储在栈区的,值是在堆区存储的。栈区变量只是存储值的引用(本质是一个地址);var a={};var b=a;a.name =”liu”;console.log(b);我们发现b里面也有name属性,属性值也是liu。因为a和b都存储了同一个对象的引用,当有一个去对值改变的时候,另一个访问的是同一个空间的值,也会发生改变。

4. 数组是引用数据类型

5. 特例

特例:String是引用数据类型,但是是值传递。

6. 多维数组

数组的语法:数组的元素类型【数组名;

二维数组:把一个一维数组作为一个元素,那么此时元素的类型为:int[]

int[][]   arr={{1,2,3,},{4,5,6,},{7,8,9}};

一维数组中的每一个元素都是一个值(基本数据类型和引用数据类型的值);

二维数组中的每一个元素又是一个一维数组;

三维数组中的每一个元素又是一个二维数组;

严格上说,在java中不存在多维数组的概念,和c语言做区分,一般称之为数组中的数组。

二维数组的初始化:

静态初始化:

int[][]  arr=new int[][]{
{1,2,3},
{4,5},
{6}
}

动态初始化:

int[][] arr=new int[3][5];//创建一个长度为3的二维数组,每一个元素(一维数组)的长度为5.		
int[][]  arr=new int[0][5];//可以创建一个0维数组(没什么意义)。

Part2 面向对象

一、类和对象

  • 同一个源文件只能有一个类使用public修饰,并且源文件名要和public修饰的类名相同。

  • 类是对象的抽象,对象是类的实例

1. 构造方法

2. Static修饰符的特点

  • static修饰符的成员(字段/方法),随着所在类的加载而加载

当JVM把字节码加载进JVM的时候,static修饰的成员已经在内存中存在了。

  • 优先于对象的存在

对象是手动通过new关键字创建出来的

  • static修饰的成员被该类型的所有对象所共享

根据该类创建出来的任何对象,都可以访问static成员;

表面上通过对象去访问static成员,其本质依然通过类名访问,和对象没有任何关系(通过反编译看到的)

  • 直接使用类名访问static成员

因为static修饰的成员直接属于类,不属于对象,所以可以直接使用类名访问static成员。

3. 类成员和实例成员

  • 类中的成员有:字段,方法,代码块
  • 类成员:使用static修饰的成员
  • 实例成员:没有使用static修饰的成员
  • 类成员只能访问类成员
  • 实例成员只能访问实例成员
  • 类成员直接属于类,可以通过类来访问static字段和static方法
  • 实例成员只属于对象,通过对象来访问非static字段和static方法(对象其实可以访问类成员,但底层依然是使用的类名访问)
  • 在static方法中,只能调用static成员

4. 类里 成员变量、局部变量、类变量 的区别

  • 成员变量和局部变量的区别

  • 类变量

static 类对象:属于类--所有对象共享 作用域:随着类的加载而加载,随着类的消失而消失 访问方式不同:可以通过类名.方法名直接调用,是因为静态成员加载顺序优先于对象 静态方法不能访问非静态成员;非静态成员可以直接访问静态方法 --因为静态方法/变量 随main主方法优先加载进内存 ;而非静态成员随着对象的实例化才被加载 ---所以非静态成员调用静态方法/变量时,肯定能在内存找到; ---而反之,静态方法/变量调用非静态成员时,不一定能找到,因为可能它还没被加载 也可以理解 :静态方法/变量 属于这个类 ,不属于某个方法。

  • 匿名对象

    System.out.println(new Teacher().age);//匿名对象:只能使用一次,一般作为参数传递
    

二、封装

封装的概念有2个,其一是封装,其二是隐藏

1. 什么是封装(面向对象三大特征之一)?

把对象的状态和行为看成一个统一的整体,将二者放在一个独立的模块中(类);

“信息隐藏”,把不需要让外界知道的信息隐藏起来,尽可能隐藏对象功能实现细节,向外暴露方法,保证外界安全访问功能;把所有的字段使用private私有化,不允许外界访问,把方法使用public修饰,允许外界访问。

把所有数据信息隐藏起来,尽可能隐藏多的功能,只想外暴露便捷的方法以供调用。

2. 封装的好处

①、使调用者正确、方便的使用系统功能,防止调用者随意修改系统属性,

②、提高组件的重用性,

③、达到组件之间的低耦合性(当某一个模块实现发生变化时,只要对外暴露的接口不变,就不会影响到其他模块)

3. 通过什么来实现隐藏和暴露功能呢?

高内聚:把该模块的内部数据,功能细节隐藏在模块内部,不允许外界直接干预。

低耦合:该模块只需要给外界暴露少量功能方法。

4. 权限访问修饰符

封装其实就是让有些类看不到另外一些类里面做了什么事。所以java提供了访问权限修饰符来规定在一个类里面能看到什么,能暴露什么。

5. 访问权限控制

private:表示私有的,表示类访问权限,只能在本类中访问,离开本类之后,就不能直 接访问

**不写(缺省):**表示包私有,表示包(package)访问权限,访问者的包必须和当前定义的包相同才能访问。

**protected:**表示子类访问权限(继承中),同包中的可以访问,即使不同包,但是有继承关系,也可以访问。

**public:**表示全局的,可以公共访问权限,如某个字段/方法,使用了public修饰,则可以在当前项目中任何地方访问。

修饰类:public 缺省 final abstract

修饰成员属性:public protected 缺省 private final static

修饰成员方法:public protected 缺省 private final abstract static

--------------------------------------------------------------------------------------------------------------------------

权限修饰符:public protected 缺省 private

状态修饰符:finnal static

抽象修饰符:abstract

三、 继承

1. 什么是继承关系

基于某个父亲对对象的定义加以扩展,而产生新的子类定义,子类可以继承父类原来的某些定义,也可以增加原来父亲所没有的定义,或者覆写父亲中的某些特性。

从面向对象中的角度上说:继承是一种从一般到特殊的关系,是一种is a的关系,即子类是对父类的扩展,是一种特殊的父类,比如:狗是动物的一种特殊情况,狗属于动物。

在java语言中,存在多个类的时候,我们使用“extends”关键字来表示父类和子类的关系。

语法格式:在定义子类的时候表明自己需要拓展于哪一个父类。

public class 子类类名  **extends**  *父类类名*{

	//TODO 编写自己特有的状态和行为;

}

在java中,类与类之间的关系只允许单继承,不允许多继承

也就是说一个类A,只能有一个直接的父亲,不能出现类A同时继承于类B和类C。

但是java中允许多重继承;

在java中,除了Object类之外,每一个类都有一个直接的父亲

比如class Student extends Person{}

我们就说此时Student的直接父亲是Person

问题:class Person{},此时Person的父类又是谁?

Object类是java语言的根类(老祖宗,任何类都是Object的子类)

class Person{}等价于class Person extends Object{}

Object类要么是一个类直接父亲,要么是一个类间接父亲,(没有爷爷一说)

2. 继承关系的作用

①、解决代码的重复问题

②、真正的作用,表示出一个体系

3.先写父类还是子类

一般的,我们在开发工程中先写多个自定义类,写完之后,发现多个类之间存在共同的代码,此时可以抽取出一个父类,我们以后做开发,都是 基于框架/组件来做的,我们是在别人的基础之上,继续做开发。

4. 子类到底继承了父亲的那些成员

(根据访问修饰符来判断)

①、如果父类中的成员使用public修饰,子类继承;

②、如果父亲中的成员使用protected修饰,子类也继承,即使发父亲和子类不在一个包中;

③、如果父类和子类在同一个包中,此时子类可以继承父类中缺省修饰符的成员。

④、如果父亲中的成员,使用private修饰,子类打死都继承不到,因为private只能在本类中访问。

⑤、父类的构造器,子类也不能继承,因为构造器必须和当前的类名相同。

5. 方法覆盖

判断是否覆写方法的必杀技:@Override标签;若方法是覆写方法,在方法前或上 贴上该标签,

编译通过,否则报错。

只有方法存在覆盖的概念,字段没有覆盖

方法覆盖解决的问题:当父亲的某一个行为不符合子类具体的特征时,此时子类需要重新定义父类的方法,并重写方法体。

public class Bird extends Animal {

    @Override
    public void action() {
        System.out.println("鸟会飞");
    }
}

6. final关键字

final修饰类:这个类不能被继承(断子绝孙类)

final修饰方法:final修饰方法时,该方法不能被覆盖(重写)

final修饰成员变量:叫常量,只能初始化一次,并且常量名要大写;static和final组合使用叫静态常量

示例:final修饰变量只能初始化一次

final经常和static一起使用来声明常量

关于final的重要知识点

  1. final关键字可以用于成员变量、本地变量、方法以及类。
  2. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
  3. 你不能够对final变量再次赋值。
  4. 本地变量必须在声明时赋值。
  5. 在匿名类中所有变量都必须是final变量。
  6. final方法不能被重写。
  7. final类不能被继承。
  8. final关键字不同于finally关键字,后者用于异常处理。
  9. final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。
  10. 接口中声明的所有变量本身是final的。
  11. final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
  12. final方法在编译阶段绑定,称为静态绑定(static binding)。
  13. 没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
  14. 将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。
  15. 按照Java代码惯例,final变量就是常量,而且通常常量名要大写
private final int COUNT = 10;
  1. 对于集合对象声明为final指的是引用不能被更改,但是你可以向其中增加,删除或者改变内容。譬如:
private final List Loans = new ArrayList();
list.add(“home loan”);  //valid
list.add("personal loan"); //valid
loans = new Vector();  //not valid

四、 多态

1. 属性没有多态

2. 构造方法没有多态

3. 多态的前提

要有继承关系(类和类)也可以是实现关系(接口和实现类),开发中多态一般都指第二种

4. 多态的特点

把子类对象赋给父亲对象,在运行时期会表现出具体的子类特征

五、 抽象类

在有继承关系时,父类中的方法基本不会被使用,所以干脆不写实现,写成抽象方法,由子类去实现

1. abstract关键字

​ abstract修饰类表示抽象类,修饰方法表示抽象方法

2. 非抽象类里不能有抽象方法

3.抽象类里可以有非抽象方法

4.抽象类不能被实例化

因为抽象类里可能有抽象方法,实例化后便可以调用这个抽象方法,而这是没有意义的

5. 抽象类有构造方法

6. 什么时候用抽象类和抽象方法?

当确定子类和方法全都会覆盖父类时,可以把父类写成抽象类

六、 接口

1.接口里不能有非抽象方法

java中的接口:

---多个抽象类的抽象就是接口;

---在java中最小的程序单元就是类,接口其实是一个特殊的类.

java中的接口表示规范,用于定义一组抽象方法,表示某一类事物必须具备的功能,要求实现类必须来实现该接口并提供方法实现.

定义接口和定义类语法相同**;[public] interface 接口名{}**

接口起名问题:表示具有某些能力的,有人习惯以able/handle结尾,Walkable表示可以行走的.

有的公司或个人习惯以I打头,表示接口,如 IWalkable

成功编译之后,和类一样,具有一分字节码.

2.接口存在的成员

1)接口中没有构造器 : 所以就扣不能创建对象(不能new), 接口不能定义普通方法

2)接口中定义的成员变量,实质是全局静态常量,默认使用public static final来修饰

3)接口中定义的方法都是公共的抽象方法,默认使用public abstract来修饰

4)接口中定义的内部类都是公共的静态内部类,默认使用public ststic来修饰内部类

特点:接口只能继承接口,不能继承类,且接口支持多继承(类是单继承).

**[修饰符]	interface  接口名  extends  接口1,接口2{}**

标志接口:接口中没有任何的成员,就仅仅是一个接口的定义,就是一个标志,其他的类实现该接口就属于这个家族,我们可以通过第三方代码赋特殊功能予该接口实现类的(不推荐);

常量接口:有人喜欢使用接口来封装多个常量信息,我们称之为常量接口,其目的和常量类相同(不推荐)

abstract如果不写,系统会默认加上abstract;建议手动加上

int num=100;//表示是静态常量,等同于 public static final int num=100;
		      //不写时,系统会默认加上

3.接口的实现关系

接口的实现者:实现类

接口仅仅是定义了某一事物应该具有的某些功能,但是没有提供任何实现.

此时 我们得提供类,再让该类去实现接口,并覆盖接口中的方法,从而实现类接口中定义的功能.

接口和实现类之间的关系严格上称之为"实现关系",使用implements来表示.

但是在开发,有时候为了方便也把这个 实现类称之为特殊继承关系.

所以可以这样理解:接口是实现类的父类,实现类就是接口的子类,

4.面向接口编程

接口 变量=创建实现类对象;//体现了多态思想

接口和实现类的多态关系才是我们见的最多的.

一个类可以实现多个接口,从而也弥补了累的单继承关系.

[修饰符] class 类名 extends 父类 inplemrnts  接口1,接口2{}

5.接口和抽象类的区别

相同点:

1)都位于继承的顶端,用于被其他继承和实现

2)都不能实例化

3)都可以定义抽象方法,其子类/实现类都必须覆写这些抽象方法.

不同:

1)接口没有构造方法,抽象类有构造方法.

2)抽象类可包含普通方法和抽象方法,接口只能包含抽象方法(java8之前);

3)一个类只能继承一个直接父类 (可能是抽象类),接口是多继承的并且支持一个类实现多个接口(接口弥补了java的单继承).

4)成员变量:接口里默认是public static final,抽象类是默认包权限.

5)方法:接口里默认是public abstract ,抽象类默认识包访问权限.

6)内部类:接口里默认是public static ,抽象类默认是包访问权限.

如果接口和抽象类可以完成相同的功能,尽量使用接口,面向接口编程.

设计模式:接口 和抽象类 结合使用的(适配器模式)

七、内部类

内部类:类内包含一个类

内部类成员可以访问外部类成员,包括私有

1.普通内部类

内部类成员的调用方法:

2.静态内部类

3.局部内部类

4.匿名内部类

标签:网易云课堂 JAVA 微专业