JAVA概念
2022-05-23 10:13:58 0 举报
AI智能生成
java基础知识,概念性知识图谱
作者其他创作
大纲/内容
1、对象入门
1.1抽象的进步
所有的东西都是对象
程序是一大堆对象的组合
每个对象都有自己的存储空间,可容纳其他对象
每个对象都有一种类型
同一类所有对象都能接收相同的消息
1.2对象的接口
1.3实现方案的隐藏--封装
1.4方案的重复使用
1.5重新使用接口--继承
1.6多类对象的互换使用--多态与动态绑定
1.7对象的创建和存在事件--单根结构、集合与继承器、下溯造型与模板/通用性、垃圾回收
1.8异常与错误
1.9多线程
1.10永久性
1.11java和因特网
2一切都是对象
2.1用引用操纵对象:如String s;创建的只是句柄,并不是对象,若此时向s发送一条消息,就会获得一个错误(运行期)
2.2创建对象
2.21可供存储的位置
寄存器--处理内部,根据需要由编译器分配
堆栈
驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持,堆栈指针若向下移,会创建新的内存;若向上移,会释放内存,这是一种特别快、特别有效的数据保存方式,仅次于寄存器。
存储java对象句柄(引用);java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”这是由于它必须生成相应的代码,以便向上和向下移动指针。
堆
一种常规用途的内存池(也在RAM区域)编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。
存储java对象
静态存储
静态(static)是指“位于固定位置”也在RAM里。
程序运行期间,静态存储的数据将随时等候调用
常数存储
通常直接置于程序代码内部,这样做是安全的,因为它们永远都不会改变,有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)
非RAM存储
2.22主要类型:主类型大小 最小值最大值 封装器类型
void:无返回值
boolean:1位--Boolean
char:8位--(-128 ~+127)--Byte
char:16位 Unicode0 Unicode2的16次方-1--Character
short:16位-2的15次方+2的15次方-1-- Short
int:32位-2的31次方+2的31次-1--Integer
float:32位IEEE754 --Float
long:64位-2的63次方+2的63次方-1--Long
double:64位IEEE754--Double
2.2.3java数组
2.3类
字段与方法
主要成员的默认值
boolean :false
char:'\u0000'(null)
byte:0
short:0
int:0
long:0L
float:0.0f
double:0.0d
2.4创建java程序
static关键词
static数据或方法就不会同那个类的任何对象实例联系到一起
非static成员和方法必须同一特定的对象关联到一起
2.5注释和嵌入文档
/* 这是一段注释,它跨越多行 */
// 这是单行注释
将代码同文档“链接”起来:javadoc
@see:引用其他类
类文档标记
@version:版本信息
@author:作者信息
变量文档标记
方法文档标记
@param:参数名 说明
@return:返回说明
@exception:完整类名说明
@deprecated:弃用
3控制程序流程
运算符
优先级
赋值运算符
算术运算符
自增/自减
前递增++a/前递减--a
后递增a++/后递减a--
关系运算符
小于< 大于> 小于或等于<= 大于等于>= 等于== 不等于!=
等于和不等于适用于所有内建数据类型,但其他比较不适用于boolean类型
逻辑运算符
逻辑运算符AND(&&)、OR(||)、NOT( !)
短路
按位运算符
移位运算符面向的运算对象也是二进制的“位”
左移位运算符“<<”:能将运算符左边的运算对象向左移动运算符右侧指定的位数,在低位补0
有符号右移位运算符“>>”:能将运算符左边的运算对象向右移动运算符右侧指定的位数;若值为正,则在高位插入0;若值为负,则在高位插入1
三元运算符
if-else运算符
布尔表达式?值1:值2
逗号运算符
字符串运算符+
造型运算符
将一种数据类型自动转换成另一种
执行控制
真和假
if-else
反复
while(布尔表达式)语句
do-while
do语句while(布尔表达式)
while 和do-while唯一的区别就是do-while肯定会至少执行一次
for
for(初始化表达式;布尔表达式;步进)语句
逗号运算符
中断和继续
break:用于强行退出循环,不执行循环中剩余的语句
continue:停止执行当前的反复,然后退回循环起始和开始新的反复
switch:实现多路选择
java1.7+:可以选择字符串
每个case均以一个break结尾,若省略break,会继续执行后面的case语句的代码,直到遇到一个break为主。
4初始化和清除
4.1用构造器自动初始化
4.2重载
每个重载的方法都必须采取独一无二的自变量类型列表
主类型的重载:方法参数
返回值重载:不能根据返回值类型来区分重载的方法
构造器重载
4.3初始化
4.3.1成员初始化
4.3.2构造器初始化
4.3.3数组初始化
4.3.4初始化顺序
1、先静态对象,后非静态对象
2、变量、构造器、方法
3、在初始化继承父类的子类时,先初始化父类,子类的静态对象,然后按照1、2、
5访问权限控制
5.1包
库单元,包含一组类,在单一的名字空间里被组合在了一起
5.2访问权限控制符
1)public:用public修饰的类,属性和方法,包内及包外的任何类(包括子类和普通类)均可以访问。
2)protected:用protected修饰的类、属性和方法,包内的任何类及包外那些继承了该类的子类才能访问。protected重点突出继承
3)default:如果一个类、属性和方法没有用任何修饰符,则访问权限为default(默认访问权限);包内的任何类(包括继承了此类的子类)都可以访问它,而包外的任何类都不能访问它。default重点突出包。
4)private:用private修饰的类、属性和方法,只有本类可以访问,而包内包外的任何类均不能访问它。
复用类 6
6.1组合
将对象引用置于新类中
6.2继承
1)基类初始化在子类之前
2)调用基类带参数的构造器,需要使用关键字super(Object...)
3)在导出类中也可以出现基类的private方法,只不过不是覆盖,而是生成了一个新的方法
6.3代理
将一个成员对象置于所要构造的类中(类似组合)但同时在新类中暴露了该成员对象的所有方法(类似继承)中庸之道。
6.4final
6.4.1数据
一个永不改变的编译时常量
一个在运行时被初始化的值,而你不希望它被改变。
一个final和static修饰的域只占据一段不能改变的存储空间。
对于基本类型,final使数值保持恒定不变,对于对象引用,final使引用恒定不变。
6.4.2方法的参数
参数被final修饰,便无法更改引用所指向的对象。
6.4.3方法
把方法锁定,防止行为变化或被覆盖
提升效率--编译器将针对该方法的所有调用转为内嵌调用
注:类中所有private方法都隐式的被指定为是final的
6.44类
不被继承
6.5this
this关键字可用类引用当前类的实例变量
this关键字可用于调用当前类方法(隐式)
this()可以用来调用当前类的构造函数,它用于重用构造函数
this关键字可作为调用方法中的参数传递
this关键字可作为参数在构造函数调用中传递
this关键字可用于从方法返回当前类的实例
6.6super
super可以用来引用直接父类的实例变量
super可以用来调用直接父类方法
super()可以用于调用直接父类构造函数
7多态
7.1向上转型
当父类的引用变量引用子类的对象时,称为向上转型
丢失被转型类具体的类型信息,导出类扩展的方法不可用。
7.2向下转型
需要进行类型检查(如:instanceof)
7.3绑定
方法调用连接到方法体
前期绑定:将一个方法调用与方法主体关联起来叫做绑定,若在程序执行前进行绑定(由编译器和连接程序实现)则为前期绑定。java中只有static和final方法属于前期绑定。
后期绑定(动态绑定):运行时根据对象的类型进行绑定,因此可以编写对基类打交道的程序,这些对导出类都可以正常运行。
高层的基类一直到底层的导出类:声明顺序的成员;导出类构造器的主体(编写构造器的一条准则:用尽可能简单的方法使对象进入正常状态;尽量避免调用其他方法。)
8接口与抽象类
8.1抽象类
1)包含了抽象方法的一个类叫做“抽象类”,如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象);
2)抽象类中可以有方法的实现
3)抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过,只有抽象类的非抽象子类可以创建对象。
4)抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
5)抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的类必定是抽象类
6)构造方法,类方法(用static修饰的方法)不能声明为抽象方法
7)抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非子类也是抽象类
8.2接口
1)interface关键词前public,默认包访问权限;接口的方法被实现是,实现类中该方法必须为public
2)接口中国的任何域都是static和final的,权限为public
3)从java8开始,它也可以有默认和静态方法
8.3抽象类和接口区别
1)抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
2)抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是public static final 类型
3)接口中不能含有静态代码块以及静态方法(用static修饰的方法)而抽象类是可以有静态代码块和静态方法的。
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口
9内部类
9.1成员内部类
位于另一个类的内部,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员,如果要访问外部类同名成员需要以下形式:外部类.this.成员变量或者外部类.this.成员方法
创建成员内部类对象的一般方式
Outter outter=new Outter(); Outter.Inner inner=outter.new Inner();
Outter.Inner inner1=outter.getInnerInstatnce();//封装了内部类的获取方式
9.2局部内部类
定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部类的访问仅限于方法内或者该作用域内
局部内部类就象是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
9.3匿名内部类
匿名内部类是唯一一种没有构造器的类,因此匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。
匿名内部类在编译时由系统自动起名为Outter$1.class。一般说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
9.4静态内部类(嵌套类)
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键词static
静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法
9.5使用场景和优势
1)每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口)实现,对于内部类都没有影响,内部类使得多继承的解决方案变得完整。
2)方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏
3)方便编写事件驱动程序
4)方便编写线程代码
9.6成员内部类的继承
1)成员内部类的引用方式必须为Outter.Inner
2)构造器中必须有指向外部类对象的引用,并通过这个引用调用super()
9.7内部类的标志符
先是外围类的名称,再跟随一个$,再跟随内部类的名称,例,由InheritInner.java创建.class文件包括:InheritInner.class WithInner$Inner.class WithInner.class
10容器
10.1List
10.2迭代器
10.3LinkedList
10.4Stack
10.5Set
10.6Map
10.7Queue
10.8Collectios和Iterator
10.9持有引用
强引用:如new的对象
强引用不会被GC回收,并且在java.lang.ref里也没有实际的对应类型。
软引用:SoftReference
软引用在JVM报告内存不足的时候才会被GC回收,否则不会回收,正是由于这种特性软引用在caching和pooling中用处广泛。
弱引用:WeakReference
当GC一旦发现了弱引用对象,将会释放WeakReference所引用的对象,弱引用使用方法与软引用类似,但回收策略不同。
虚引用:PhantomReference
当GC一旦发现了虚引用对象,将会将PhantomReference对象插入ReferenceQueue队列,而此时PhantomReference所指向的对象并没有被GC回收,而是要等到ReferenceQueue被你真正处理后才会被回收。
11异常
11.1Throwable对象
Error编译和系统错误
Exception 可抛出的异常
11.2RuntimeException
11.3自定义异常类
必须从已有的异常类继承
12字符串
12.1String对象不可变
12.2格式化输出
printf()、System.format()、Formatter类、String.format()
12.3重载+与StringBuilder
产生新的字符串对象
StringBuilder非线程安全与StringBuffer线程安全
12.4StringTokenizer
分隔字符串
13类型信息
13.2Class对象
类加载子系统
13.1在运行时使用类型信息,就必须首先获得对恰当的Class对象的引用
13.3类型转换检查
1)Class.forName(" ");
2)泛化的Class引用:Class intClass=int.class;Class<Integer>genericIntClass=int.class; Class<?extends Number> bounded=int.class;bounded=double.class;
3)instanceof(isInstance);保持类型的概念,你是这个类(或者派生类)吗;equals(==);比较事件的Class对象,未考虑继承。
13.4反射
1)RTTI与反射的区别
RTTI:编译器在编译时打开和检查.class文件
反射:.class文件在编译时时不可获取的,在运行时打开和检查.class文件
2)Filed、Method、Constructor类
3)看起来没有任何方式可阻止反射到达并调用那些非公共访问权限的方法,对于域来说,的确如此,即便是private域。
13.5动态代理
代理是为了提供额外或者不同的操作,而插入的用来代理实际对象的对象,充当着“中间人”角色。
通过静态方法Proxy.newProxyInstance()创建动态代理,此方法需要传入三个参数,类加载器,代理实现的接口(不是类或者抽象类)InvocationHandler接口的一个实现。动态代理可以将所有调用处理器,因此通常会向调用处理器O构造器传递一个实际对象引用,从而使得调用处理器在执行其中介任务时,可将请求转发。
14泛型
泛化主要的目的之一就是用来指定容器要持有什么类型的对象,并由编译器来保证类型的正确性
可以创建一个元祖类库在一个方法调用中返回多个对象
泛型方法
public<T>void f(T x){}
加上可变参数:public<T>void f(T...args){}
泛型类
泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分
和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开,一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符,因为它们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。
类型通配符
1)类型通配符一般是使用?代替具体的类型参数,如List<?>在逻辑上是List<String>,List<Integer>等所有List<具体类型实参>的父类
2)类型通配符上限通过形如List来定义,如此定义就是通配符泛型值接受Number及其下层子类类型。
3)类型通配符下限通过形如List<?super Number>来定义,表示类型只能接受Number及其三层父类类型,如Object类型的实例。
擦除
在编译时,具体类型被擦除。
0 条评论
下一页