第一章 介绍
1、特性
1、计算机编程语言,交互标准、协议(机器语言、汇编语言、高级语言)
2、Java发展史:1995年sun公司为占领智能电子消费市场,开发OAK(橡树)语言,目前sun被Oracle收购
-
1996年JDK1.0诞生
-
Java开发工具包(JDK)
Java三大块:
-
JavaSE(标准版)
-
JavaEE(企业版)
-
JavaME(微型版)
3、java语言特性【开源、免费、纯面向对象、跨平台】
-
简单性:java不支持多继承,屏蔽指针概念,低层是C++实现
C++支持多继承,多继承复杂,有指针
-
面向对象:符合人的思维、易理解(封装、继承、多态)
-
可移植性:java程序可做到一次编译,到处运行。操作系统内核肯定不同,执行指令方式也不一样。让java程序运行在java虚拟机(JVM),java虚拟机(版本分Linux和Windows,下载JDK即可)再和底层操作系统打交道。
-
多线程、安全性
-
健壮性:自动垃圾回收机制(GC机制),运行过程产生的垃圾自动回收(回收的主要是堆里面的垃圾:new的对象呀之类)
2、Java加载与执行
1、java程序运行包括两阶段
编译(检查语法)
-
(.java称源文件)编译成(.class字节码文件),字节码文件不是纯粹的二进制,无法在操作系统直接执行(javac.exe编译器,DOS窗口使用)java程序员用此编译。
-
一个java源文件可编译成多个.class文件,【以后再谈】
-
编译结束后,可将.class拷贝到其他操作系统中运行【跨平台】
运行
-
JDK有个工具java.exe负责运行阶段
-
java.exe命令启动java虚拟机(JVM),JVM启动类加载器classloader,classloader会去硬盘搜索A.class,找到文件装到JVM,JVM将A.class解释成二进制,操作系统执行二进制与底层硬件交互。
java命令启动JVM,JVM启动类加载器,类加载器搜索.class文件,装到JVM,解释成二进制,操作系统执行二进制与底层硬件打交道。
3、开始第一个java程序
1、JDK包含JRE包含JVM
-
JDK:开发工具包
-
JRE:运行时环境
-
JVM:虚拟机
2、目录介绍
JDK/bin 放了 javac.exe(编译)和 java.exe(运行)
3、无法找到 javac 命令文件
-
先从当前目录下搜索
-
找不到,从环境变量path指定路径中搜索某个命令
-
找不到就报错
配置环境变量path是属于Windows操作系统的一个知识点。
4、注释
-
单行注释: //
-
多行注释: /* */
-
Javadoc注释:/**
*Javadoc注释
*Javadoc注释
*/
解析提取并生成帮助文档。
4、public class 和 class 区别
-
一个java源文件中可定义多个class
-
public class不是必须的
-
一个class会定义生成一个xxx.class字节码文件
-
一个java源文件当中定义公开类的话,只能有一个,并且类名需和java源文件名称一致
-
每一个class中都可编写main方法,设定程序入口,如执行B.class的main方法:java B
注意:在命令窗口执行java hello,hello中必须有main方法
5、总结第一章内容
-
搭建java开发环境
-
编写helloworld
-
path原理及配置
-
classpath原理及配置
-
注释,加载与执行
-
public class和class区别
第二章、java语言基础
1、标识符、关键字、字面值
1.1标识符
1、什么是标识符
-
在java中有权利自己命名的单词
-
标识什么:类名、变量名、方法名、接口名、常量名
2、命名规则
-
合法标识符只能有数字、字母、下划线、$组成
-
不能数字开头
-
严格区分大小写
-
关键字不能做标识符
-
理论上无长度限制
3、命名规范(规范、不属于语法、不遵守不会报错)
-
见名知义
-
遵守驼峰命名方式:SystemService
-
类名、接口名、首字母大写,后面每个单词首字母大写:UserService
-
变量名、方法名,首字母小写,后面每个单词首字母大写
-
常量名全部大写
1.2关键字
小写
public、class、static
1.3字面值
-
10、100、3.14、“abc”、‘a'、true、false
-
字面值就是数据
-
是java源程序的组成部分之一,还包含标识符和关键字
-
数据有类型, 整型、浮点型、布尔型、字符串型、字符型
2、变量、数据类型
2.1变量
1、什么是变量
-
本质上是内存中的一块空间,有数据类型、名字、字面值
-
变量包含:数据类型、字面值【数据】、名
-
变量是内存中存储数据最基本的单元
-
Java 中主要有如下几种类型的变量
-
局部变量
-
类变量(静态变量)static
-
成员变量(非静态变量)
-
2、数据类型作用
-
不同数据类型底层分配不同大小的空间
-
指导程序分配多大内存空间
3、要求
-
数据应与类型一致
4、声明/定义变量语法格式
-
数据类型 变量名
-
首字母小写,后每个单词首字母大写
5、int i=520
-
类型 变量名 运算符 字面值
-
可重新赋值
6、访问变量方式
读取变量保存数据 get
修改变量保存的具体数据 set
7、赋值
-
int a,b,c=300; a,b未赋值,c=300
-
int i=100; i=200; 不能再int i=90;
8、变量作用域(有效范围)
-
在什么范围之内可以被访问,只要出了范围该变量无法访问
-
在不同作用域变量名可相同,同一作用域不能重名
-
类体中不能直接编写java语句【除变量声明外】
for(int a=0;a<10;a++){} System.out.println(a) //报错
9、变量分类
-
局部变量 -在方法体当中声明的变量叫做局部变量
-
成员变量 -在方法体外【类体之内】声明的变量叫做成员变量,会赋默认值0,null
-
成员变量赋默认值,局部变量不赋初值
2.2数据类型
类型作用:不同数据类型数据占用空间大小不同,指导JVM在运行程序时给该数据分配多大内存空间。
-
基本数据类型
-
整数(byte、short、int、long)(1,2,4,8)(字节)
-
浮点型(float、double) (4,8)
-
布尔型(boolean) (1)
-
字符型(char) (2)
-
-
引用数据类型
-
字符串
-
类
-
1、计算机只能识别二进制【现代计算机底层采用交流电,接通和断开,只识别1或0】
2、字节是什么
一个字节等于八个比特位(1或0)
-
1 byte=8 bit
-
1 kB=1024 byte
3、数字有正负,一个二进制位表“符号位”,0表正,1表负
byte类型最大值:01111111(127),最小值(-128)人为规定的,用(1000 0000表示),因为补码0的表示有两个,用-0表示-128.
3.总结
标识符、关键字、字面值、变量、数据类型、字符编码(Ascll码)(a-97、A-65、0-48)
-
’a‘-->01100001(解码)
-
01100001-->’a'(编码)
-
编码和解码时采用用一套字典/对照表,不会乱码
-
国际化标准组织ISO制定,向上兼容ASCII码,仍不支持中文,ISO-8859-1,称为latin-1
-
GB2312《GBK《GB18030,支持繁体中文:大五码(big5)
-
支持中文编码方式:GB2312/GBK/GB18030
-
java语言采用Unicode编码方式,标识符可用中文 Unicode分为:UTF-8(居多),UTF-16,UTF-32
3.1数据类型取值范围
-
byte【-128~127】 0
-
short【-32768~32767】0
-
int【-2^31~2^31-1】 0
-
long【-2^63~2^63-1】 0
-
char【0~65535】 \u000 什么也没有
3.2转义字符 \
-
\n 换行符
-
print和println区别,输出之后不换和换行
-
\t 制表符tab 制表符和空格不同,ASCII不同
-
\\ 反斜杠 \'单引号
JDK中自带native2ascii.exe命令,将文字转换成Unicode编码形式
char g=\u4e2d
3.3整型
-
整数型字面值默认为int类型
-
小容量可自动转换成大容量 Cat子类可自动转换为Animal父类
-
大容量转小容量需强制类型转换(可能损失精度) 父类Animal转换成Bird类需要强制类型转换 Animal ani = new Animal(); Bird bird = (Bird)ani
-
int y=(int)x(原为long),将前面四个字节砍掉,然后赋给y
long k=2147483648L
int m=(int)k(损失精度)
-
默认十进制10
-
八进制0开头
-
十六进制0X开头
-
long a=2147483648(编译错误,超出范围)。 字面值后需加L(一个数字默认是int型的,不能超出int的范围)
-
byte b=50(可以,不用强制类型转换)**
-
4、原码、反码、补码
-
符号位和数值位
-
正数补码原码相同
-
计算机在任何情况下底层表示和存储数据时采用补码形式
5、float double
double精度太低【相对而言】,不适合做财务软件。因为财务要求精度高,sun公司准备了一种引用数据类型,不属于基本数据类型,是:java.math.BigDecimal
SE类库字节码: C:\Program Files(X86)\java\jdk\jre\lib\rt.jar
SE类库源码: C:\Program Files(X86)\java\jdk\src.zip
-
float A=5.2 //编译错误
-
float a=5.20f
-
float b=(float)5.20 // 默认小数为double类型,整数为int类型
6、Boolean
-
只有两个值 true、false
-
逻辑运算和条件控制
7、类型转换
-
八种基本数据类型当中除布尔类型外剩七种可相互转换
-
小容量转大容量称自动类型转换 byte<short(cahr)<int<long<float<double , char可取更大的整数
-
大容量转小容量叫强制类型转换,加强制类型转换符,可能损失精度(类中强制类型转换需要判断 instanceof )
-
当整数没有超byte、short、char的取值范围,可赋值给byte、short、char类型的变量
-
当byte、short、char混合运算时,先转换成int类型再运算
-
多种数据类型混合运算,先转换成容量最大类型再运算
8、运算符
8.1逻辑运算符
两边算子都是bool类型
-
逻辑与& 逻辑或|
-
短路与&& 短路与||(判断前面条件,如果可以的话不执行后面语句)
8.2位运算
-
<<左移
-
右移>>
8.3剩下运算符
-
赋值运算符
-
三目运算符 A ?B :C A为true结果为B
-
条件运算符
-
字符串连接运算符 +
8.4键盘输入
java.util.Scanner s = new java.util.Scanner(System.in) //工具类util String str = s.next();//键盘输入字符串 //或者 int num = s.nextInt();//键盘输入数字
复盘
标识符、字面值、关键字、数据类型、变量、进制转换、字符编码、运算符、控制语句(if,switch)
9、switch语句
9.1switch(*)
-
*可以是int,或者字符串(string)
-
case穿透,没有break语句,不跳出继续执行
-
case合并
9.2练习一
public static void main(String[] args){ java.util.Scanner s = new java.util.Scanner(System.in); System.out.println("欢迎使用"); System.out.print("请输入第一个数字:"); int num1=s.nextInt(); System.out.print("请输入第一个运算符:"); String operator = s.next(); System.out.print("请输入第二个数字:"); int num2=s.nextInt(); int result = 0; switch(operator){ case"+": result=num1+num2; break; ... } System.out.println("结果为:" + num1 + operator + num2 "=" +result); }
9.3练习二
10、循环结构
-
代码重复使用,放到循环体
-
联合计数器,控制需要的代码
-
for,while,do while
-
for(初始化表达式;布尔表达式;更新表达式){}
10.1九九乘法表
分析清除编译和运行
10.2判断素数
10.3break和continue
-
break中断的是最近的循环语句,干扰不了外层循环
-
continue终止此次循环,进行下一次循环
-
continue/break + 名称,终止这个名称的循环
11、方法
-
复用性
-
invoke(方法调用)
-
方法定义,语法结构
-
[修饰符列表] 返回值类型 方法名(形式参赛列表){
方法体;}
public static void add(int x,int y){}
-
修饰符列表中有“static”的话,如何调用方法
-
类名.方法名(实际参数列表)
-
-
-
方法调用,只有调用时才会执行
-
只要带有return关键字的语句执行,return语句所在的方法结束,结束当前方法
-
方法名只要是合法的标识符就行,见名知义,动词,首字母小写,后首字母大写
-
4.在一个类中一个方法调用另一个方法时,可以直接写方法名调用,若在不同类,则是类名.方法名来调用。
12、方法内存
-
方法只定义不调用不分配内存空间
-
JVM内存划分上有三块主要内存空间
-
方法区内存
-
-
堆内存
-
栈内存
-
-
方法调用,内存分配
-
-
13、重载
-
方法名相同,类型,顺序,参数个数不同
-
与返回值类型无关
-
与修饰符列表无关
深克隆和浅克隆、println方法自动调用toString(C++底层)、数组下标越界异常\空指针异常\类型转换异常
14、重载具体应用
public class u { public static void p(int,或者float,double,boolean){ System.out.println(); } }
重载打印输出 u.p(类型)
15、递归
-
自身调用自身
-
递归算法很耗费栈内存
-
必须有结束条件,不然发生栈内存溢出错误
-
尽量不使用递归,有些情况必须用(目录拷贝)
第三章 面向对象
3.1面向过程和面向对象区别
面向对象
-
关注的是功能,独立体
-
低耦合,高扩展
-
前期投入成本高,需要进行独立体的抽取,大量的系统分析与设计
面向过程
-
实现的具体过程,因果关系
-
简单程序快速开发
-
很难解决复杂的业务逻辑,耦合度高,无法达到组件复用
3.2面向对象三大特性
-
封装
-
继承
-
多态
采用面向对象的方式开发一个软件,生命周期当中:(分析,设计,编程)
-
面向对象分析:OOA (analyse)
-
面向对象设计: OOD (devise)
-
面向对象编程: OOP (programming)
3.3类与对象概念
-
什么是类?
-
类是高度抽象的,是一个模板,一个概念,代表一类事物
-
-
什么是对象?
-
现实世界实际存在的个体
-
-
类 实例化 对象(实例 instance)
对象 抽象 类
-
类的属性和方法(状态信息,动作信息)
-
对象与对象之间有共同特征,但具体数据不同
3.4类的定义
-
语法结构
-
【修饰符列表】 class 类名{ 属性(数据类型): 方法: }
-
属性用变量定义(成员变量)
-
类属于引用数据类型(类,字符串String)
-
3.5对象的创建和使用
3.5.1创建
-
new的对象在堆内存中存储
-
程序员不能直接操作堆内存,只能通过引用访问堆内存内部的实例变量
-
局部变量在栈内存中存储,成员变量中实例变量在堆内存的Java对象内部存储
3.5.2使用
-
引用可以是局部变量,也可以是成员变量
3.6面向对象的封装性
为什么封装?
-
封装之后,看不到事物复杂一面,只看到简单一面。复杂性封装,对外提供简单的操作入口,不关心内部的实现原理。
-
封装之后形成真正的“对象”,真正的独立体
-
封装意味着以后的程序可重复使用,适应性强,任何场合可使用
-
提高了安全性
封装的步骤
-
所有属性私有化,private,只能在本类中访问
-
对外提供简单操作入口(get,set(没有返回值))
set和get方法没有static关键字
-
有static关键字修饰的方法如何调用:类名.方法名(实参)
-
没有static关键字修饰的方法怎么调用:引用.方法名(实参)
3.7构造函数(构造方法,构造器)
构造方法语法结构
-
【修饰符列表】 构造方法名(形式参数列表){构造方法体}
-
对于构造方法来说,返回值类型无需指定,也不能写void,写了就是普通方法
-
构造方法的方法名与类名一致
构造方法作用
-
通过构造方法调用可以创建对象
-
给实例变量赋值,实例变量存储在JVM的堆内存java对象内部
构造方法调用
-
普通方法调用:类名.方法名(实参)、引用.方法名(实参), new 构造方法名(实参列表)
-
构造方法调研执行之后有返回值,不徐写return 值,返回值类型是构造方法所在类的类型,是类本身。
-
当类中没有定义构造方法时,默认给该类提供一个无参的构造方法,此方法称为缺省构造器
-
当定义了构造方法时,系统不再默认提供缺省构造器,建议提供无参构造方法
-
构造方法支持重载机制
3.8对象和引用
3.8.1对象和引用概念
-
对象:在使用new运算符在堆内存开辟的内存空间称对象
-
引用:是一个变量,不一定是局部变量,可以是成员变量,引用保存内存地址,指向堆内存对象
-
访问实例相关数据,需要通过”引用.“访问
-
只有一个空的引用,访问对象的实例相关数据会出现空指针异常,Computer com;// com是一个引用
-
3.8.2参数的传递
传递的永远是变量中保存的值
-
值传递
-
地址传递(引用)
3.9 this关键字(对象)
-
this是一个关键字
-
-
当一个行为执行过程中需要对象参与,那么这个方法要定义为“实例方法”,不需要带static关键字
-
this可以出现在实例方法中,this指向当前执行这个动作的对象
-
this多数情况下可以不写,什么情况不能省?用来区分局部变量和实例变量时不能省
public void setId(int id){ this.id = id; //实例变量 = 局部变量 }
-
this除了可以使用在实例方法中,代表当前对象,可以使用在构造方法中,通过当前构造方法调用其他构造方法
public void Data(int year,int month,int day){ this.year=year; this.month=month; this.day=day; } public void Date(){ this(1970,1,1); }
-
this不能用在含有static的方法中,static方法调用不需要对象,直接类名.方法,没有当前对象
-
带有static方法可以采用类名或者引用方式访问,即使采用引用方式访问,实际上执行的时候和引用指向的对象无关
3.10 static关键字(类相关)
-
国籍声明为静态变量,属于类级别的特征,可以提升为整个模板的特征。
-
静态代码块在类加载时执行,只执行一次,可编写多个,自上而下依次执行
-
和具体需求相关,在类加载时刻执行代码完成日志的记录,写到静态代码块中
static{ System.out.println(""); }
-
实例代码块
1、可编写多个,自上而下
2、在构造方法执行前执行 ,需要new对象后才能执行
3、方法什么时候定义为静态?方法描述的动作不需要创建对象来执行时,加static,无法访问实例变量和实例方法。
-
总结
-
类中:静态代码块(类加载器执行一次),实例代码块(构造方法执行前),静态变量,实例变量,构造方法(创建对象),静态方法,实例方法
-
工具类一般是静态方法
3.11单例模式初步<u></u>
3.12类的继承
-
继承的作用:代码复用,最重要的作用:有了继承才有以后的“方法的覆盖”和“多态机制”
-
只支持单继承,一个类只能继承一个类
-
私有的、构造方法不支持继承,其他数据都可以被继承
-
java任何一个类中都有Object类的特征
3.13方法覆盖
-
方法覆盖又称方法重写,override
-
什么时候用方法重写,父类方法无法满足子类的业务需求,方法重写发生在具有继承关系的父子类之间
-
返回值类型相同,方法名相同,形参列表相同。访问权限不能更低,抛出异常(讲完异常解释)不能更多
-
私有方法,构造方法不能继承,所以不能覆盖,静态方法不存在覆盖(讲完多态解释)
-
覆盖只针对方法,不针对属性
3.14 super
-
this能出现在实例方法和构造方法中
-
this的语法:“this."和”this()“
-
this不能使用在静态方法中
-
this()只能出现在构造方法第一行,通过当前的构造方法去调用“本类”中其他的构造方法,目的是代码复用。
-
super能出现在实例方法和构造方法中
-
super的语法:“super."和”super()“
-
super不能使用在静态方法中
-
super()只能出现在构造方法第一行,通过当前的构造方法去调用“父类”中其他的构造方法,目的是创建子类对象时,先初始化父类型特征。
-
当一个构造方法第一行:既没有this()又没有super()的话,默认会有一个super();表示通过当前子类的构造方法调用父类的无参数构造方法,必须保证父类的无参构造的方法是存在的。
-
-
this()和super()不能共存
-
super代表的是当前对象的父类型特征
-
父类和子类有同名属性,子类中想访问父类的属性,不能省略。区分子类父类同名属性。
-
super不是引用,super也不保存内存地址,super也不指向人和对象。super只是代表当前对象内部的那一块父类型的特征。
-
super.属性名 【访问父类的属性】
-
super.方法名(实参)【访问父类的方法】
-
super(实参)【调用父类的构造方法】
-
3.15 final
-
final关键字表示最终的,不可变的
-
一旦赋值后,不可重新赋值
-
修饰的类无法被继承
-
修饰的方法无法被覆盖
-
学习类库需学习以下三个方面
-
源码(观看源码理解程序)
-
字节码(程序开发过程中使用的就是这部分)
-
帮助文档(对开发提供帮助)
-
-
final修饰的引用虽然指向某个对象之后不能指向其他对象,但指向的对象内部的内存是可以修改的
-
final修饰的实例变量,一般和static联合使用,被称为常量
-
final修饰实例变量,可在变量后面直接赋值,也可以在构造方法中赋值
-
常量和静态变量都是存储在方法区,在类加载时初始化
3.16 抽象类
-
什么是抽象类
-
-
抽象类无法创建对象,类和类之间有共同特征,进一步抽象形成抽象类,类本身不存在,无法创建对象。
-
抽象类和抽象类实际上可能还有共同特征,进一步抽象
-
-
抽象类属于什么类型
-
引用数据类型
-
-
怎么定义
-
public abstract class Account{ }
-
-
final和abstract不能联合使用,抽象类是为了继承使用,抽象类的子类也可以是抽象类
-
抽象类虽然无法实例化,但可以有构造方法
-
抽象类关联到抽象方法
-
什么是抽象方法,没有实现的方法,没有方法体的方法
-
抽象类中可以无抽象方法,抽象方法一定出现在抽象类中
-
-
一个非抽象类继承抽象类,必须将抽象类中的抽象方法实现 ,这里的覆盖或者重写叫做实现。
-
java语言中凡是没有方法体的方法都是抽象方法(X),还有调用C++的底层代码可以。
-
3.17 接口(行为)
-
接口也是一种引用数据类型,编译之后也是一个class字节码文件
-
接口是完全抽象的(抽象类是半抽象),也可以说接口是特殊的抽象类
-
接口怎么定义
-
(public) interface 接口名{ }
-
-
接口支持多继承,一个接口可以继承多个接口,弥补了类的单继承
-
接口中只包含常量和抽象方法(不带有方法体)
-
接口中所有元素都是public修饰,抽象方法的public abstract可以省略
-
接口中方法不能有方法体,因为是完全抽象的,抽象方法无方法体。
-
常量的public static final也可以省略,因为接口中只能是常量。
-
一个非抽象类实现接口时,必须将接口中所有方法加以实现
-
一个类可以实现多个接口
-
extends和implements可以共存,extends在前,implements在后
-
使用接口时,可以使用多态(父类型引用指向子类型对象)
3.18 接口在开发中作用
-
接口在开发中作用类似于多态在开发中作用
-
面向抽象(父类)编程,降低耦合度,提高程序扩展力
-
-
接口是完全抽象的
-
面向接口编程
-
有了接口可插拔,扩展力强
-
-
接口的使用离不开多态机制
3.19多态
3.19.1多态语法
-
向上转型(upcasting)
-
子类型-->父类型
-
自动类型转换
-
-
向下转型(downcasting)
-
父类型-->子类型
-
强制类型转换(加强制类型转换符)
-
当调用的方法是子类特有的,父类型当中不存在,必须向下转型
-
Cat c2 = (Cat)a2;//a2是animal类型
-
-
无论是向上转型还是向下转型,都需求存在继承条件
-
能用多态就用多态
-
向上转型只要编译通过,运行一定不会出问题
-
向下转型编译通过,运行可能出错,instanceof运算符可以避免以上异常
-
(a instanceof Animal),结果为true表示a这个引用指向的对象是一个Animal,而不是Bird类型
-
Animal a1 = new Cat();//cat继承animal,子类型转换成父类型,向上转型(自动类型转换) a1.move(); //编译阶段编译器检查,静态绑定,编译阶段绑定,去animal.class中找move方法,找不到就静态绑定失败 //在程序运行阶段,JVM堆内存创建cat对象,调用cat对象的move方法,多态绑定,运行阶段绑定
-
无论cat类重写方法与否,运行阶段一定调用cat的move方法,底层真实对象就是cat对象
-
父类型引用指向子类型对象这种机制导致程序在编译阶段绑定和运行阶段绑定两种不同的形态/状态,称为多态语法机制
3.19.2多态作用
-
使用多态,降低耦合度,提高扩展性
-
面向抽象编程,不是面向具体编程,猫狗抽象成宠物
-
父类型引用指向子类型引用
3.20 接口和抽象类区别
-
抽象类基础语法
-
接口基础语法
-
类和类之间叫做继承,类和接口之间叫做实现,可将实现看做继承
-
继承是extends,实现是implements
-
-
结论
-
当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖,重写)
-
-
一个类可以实现多个接口
-
实现多个接口,类似于多继承,弥补了单继承的缺陷
-
-
经过测试,接口和接口之间在进行强制类型转换时,没有继承关系,也可以强制转换,注意:运行时可能出现ClassCastException异常
-
-
继承和实现都存在的话
calss Cat extends Animal implements Flyable{ public void fly(){ System.out.println("猫起飞!") } }
-
-
抽象类半抽象,有构造方法,只能单继承
-
接口完全抽象,没有构造方法,支持多继承,只允许存在常量和抽象方法,对行为的抽象
-
3.21类之间关系
3.22 is-a、like-a、has-a
-
has a,统一以属性方式存在,关联关系 A{ B b; }
-
is a ,可设置为继承 A extends B
-
like-a 类实现接口表示“实现关系” A implements B
3.23 Object类
protected Object clone() // 负责对象克隆的 int hashCode() //获取对象哈希值的方法 boolean equals(Object obj) //判断两个对象是否相等 String toString() //将对象转换成字符串形式,官方的是(类@十六进制)最好需要自己重写,简洁可读 protected void finalize() //垃圾回收器负责调用的方法
-
tostring方法
-
equals方法判断两个对象是否相等
-
-
==不能判断两个对象是否相等,比较的是内存地址
-
-
结论:Java中什么类型数据可用==判断(基本数据类型)
-
引用数据类型(string)用equals判断是否相等
-
System.out.println(引用);这里自动调用“引用”的toString()方法
-
String类是sun写的,toString,equals方法已重写,其他所有类的equals方法也需要重写,
-
-
-
-
java中垃圾回收器不是轻易启动的 protected void finalize()垃圾回收
-
3.24 包和import
-
java引入package这种语法机制主要为了方便程序管理,不同功能类被分门别类到不同软件包中,查找比较方便
-
怎么定义package,在java源程序的第一行上编写package语句 -------package 包名
-
包的命名规范:公司域名倒序+项目名oa+模块名+功能名
-
包名要求全部小写,也是标识符
-
一个包将来对应一个目录
com.bjpowernode.javase.day11; //4个目录
-
使用了package机制之后,如何编译?类名是
com.bjpowernode.javase.day11.Test01
-
import语句导入其他类,同一个包下的类不需要导入,不在同一个包需要手动导入
-
import 类名
-
import 包名.*
8.可以import导入包或者用完整类名创建对象
3.25 访问控制权限
-
-
类只能采用public和缺省的修饰符进行修饰【内部类除外】
-
私有属性只能在本类中访问,可以调用父类的构造方法
3.26 内部类
-
匿名内部类
-
没有名字的内部类,只能用一次,代码乱,可读性差
-
-
内部类:类的内部又定义了一个新的类,称为内部类
-
静态内部类:类似于静态变量
-
实例内部类:类似实例变量
-
局部内部类:类似局部变量
-
总结笔记
-
java命令启动JVM,JVM启动类加载器,类加载器搜索.class文件,装到JVM,解释成二进制,操作系统执行二进制与底层硬件打交道。
-
类名、接口名、首字母大写,后面每个单词首字母大写:UserService
-
变量名、方法名,首字母小写,后面每个单词首字母大写
-
变量是内存中存储数据最基本的单元
-
Java 中主要有如下几种类型的变量
-
局部变量
-
类变量(静态变量)static
-
成员变量(非静态变量)
-
-
成员变量赋默认值,局部变量不赋初值
-
数字有正负,一个二进制位表“符号位”,0表正,1表负
byte类型最大值:01111111(127),最小值(-128)人为规定的,用(1000 0000表示),因为补码0的表示有两个,用-0表示-128.
-
小容量可自动转换成大容量 Cat子类可自动转换为Animal父类
-
大容量转小容量需强制类型转换(可能损失精度) 父类Animal转换成Bird类需要强制类型转换 Animal ani = new Animal(); Bird bird = (Bird)ani
-
double精度太低【相对而言】,不适合做财务软件。因为财务要求精度高,sun公司准备了一种引用数据类型,不属于基本数据类型,是:java.math.BigDecimal
-
类型转换
-
八种基本数据类型当中除布尔类型外剩七种可相互转换
-
小容量转大容量称自动类型转换 byte<short(cahr)<int<long<float<double , char可取更大的整数
-
大容量转小容量叫强制类型转换,加强制类型转换符,可能损失精度(类中强制类型转换需要判断 instanceof )
-
当整数没有超byte、short、char的取值范围,可赋值给byte、short、char类型的变量
-
当byte、short、char混合运算时,先转换成int类型再运算
-
多种数据类型混合运算,先转换成容量最大类型再运算
-
-
方法调用,只有调用时才会执行
-
方法调用,内存分配
-
通过构造方法调用可以创建对象
-
构造方法调研执行之后有返回值,不徐写return 值,返回值类型是构造方法所在类的类型,是类本身
-
引用:是一个变量,不一定是局部变量,可以是成员变量,引用保存内存地址,指向堆内存对象
-
this不能用在含有static的方法中,static方法调用不需要对象,直接类名.方法,没有当前对象
-
静态代码块(类加载器执行一次),实例代码块(构造方法执行前),静态变量,实例变量,构造方法(创建对象),静态方法,实例方法
-
继承的作用:代码复用,最重要的作用:有了继承才有以后的“方法的覆盖”和“多态机制”
-
方法覆盖
-
返回值类型相同,方法名相同,形参列表相同。访问权限不能更低,抛出异常(讲完异常解释)不能更多
-
私有方法,构造方法不能继承,所以不能覆盖,静态方法不存在覆盖(讲完多态解释)
-
-
super不是引用,super也不保存内存地址,super也不指向人和对象。super只是代表当前对象内部的那一块父类型的特征。
-
super.属性名 【访问父类的属性】
-
super.方法名(实参)【访问父类的方法】
-
super(实参)【调用父类的构造方法】
-
-
final和abstract不能联合使用,抽象类是为了继承使用,抽象类的子类也可以是抽象类
-
一个非抽象类继承抽象类,必须将抽象类中的抽象方法实现 ,这里的覆盖或者重写叫做实现。
-
接口
-
接口是完全抽象的(抽象类是半抽象),也可以说接口是特殊的抽象类
-
接口怎么定义
-
(public) interface 接口名{ }
-
-
接口支持多继承,一个接口可以继承多个接口,弥补了类的单继承
-
接口中只包含常量和抽象方法(不带有方法体)
-
接口中所有元素都是public修饰,抽象方法的public abstract可以省略
-
接口中方法不能有方法体,因为是完全抽象的,抽象方法无方法体。
-
一个非抽象类实现接口时,必须将接口中所有方法加以实现
-
一个类可以实现多个接口
-
extends和implements可以共存,extends在前,implements在后
-
使用接口时,可以使用多态(父类型引用指向子类型对象)
-
-
多态
-
Animal a1 = new Cat();//cat继承animal,子类型转换成父类型,向上转型(自动类型转换) a1.move(); //编译阶段编译器检查,静态绑定,编译阶段绑定,去animal.class中找move方法,找不到就静态绑定失败 //在程序运行阶段,JVM堆内存创建cat对象,调用cat对象的move方法,多态绑定,运行阶段绑定
-
父类型引用指向子类型对象这种机制导致程序在编译阶段绑定和运行阶段绑定两种不同的形态/状态,称为多态语法机制
-
-
引用数据类型(string)用equals判断是否相等
-
System.out.println(引用);这里自动调用“引用”的toString()方法
-
String类是sun写的,toString,equals方法已重写,其他所有类的equals方法也需要重写,
-
-
访问控制权限
-
类只能采用public和缺省的修饰符进行修饰【内部类除外】
-
私有属性只能在本类中访问,可以调用父类的构造方法
-