2019.7.28Java基础复习

一、Java基础知识
1、Java语言的优点:
Java为纯面向对象的语言;平台无关性;Java有丰富的内置类库;提供对web应用开发的支持;安全性健壮性;Java语言提供一个防止恶意代码攻击的安全机制(数组边界检测和Betycode校验等);
2、Java与c++的不同:
(1)Java为解释性语言而c++/c为编译型语言,Java执行速度比C++慢,却能跨平台行而C++不行;
(2)Java为纯面向对象语言,所有函数、变量等必须在类中实现,除基本数据类型外,所有类型都是类,C++兼具面向过程和面向过程编程的特点;Java中不存在全局变量和全局函数;
(3)Java没有指针的概念 可以防止C/C++操作指针可能引发的系统问题,从而使程序更安全
(4)Java不支持多继承,但是引入看接口的概念,接口具有多态性,Java通过实现多个接口实现多继承机制
(5)在C++语言中需要开发人员去管理对内存的分配,java提供了垃圾回收器来实现对垃圾的自动回收,不需要程序显式的管理内存的分配;在C++语言中通常会把要释放的资源放在析构函数中,Java没有析构函数,却引入了finalize()方法,当垃圾回收器将要释放无用对象的内存时,会首先调用该对象的finalize()方法
(6)C++支持运算符重载,Javav支持;Java不支持预处理功能但import与预处理功能相似,;C++支持默认函数参数,Java不支持;C/C++支持强类型转换(这会导致程序的不安全),Java不支持强类型转换,需手动显式的操作
(7)Java具有平台无关性,即对每种数据类型都分配固定长度;Java提供对注释文档的内建支持;Java提供一些标准库,如JDBC
3、main()方法:public static没有先后顺序 ,可以互换;也可以public static final void main(String[] args);也可以用synchronized来修饰main方法必须保证main()方法返回类型为void 并有public static修饰,不能用abstract修饰;只有与文件名相同并用public修饰的类中main方法才能作为程序入口
4、在Java语言中,由于静态块在类被加载时就会被调用,因此可以在main()方法执行前,执行静态块内容;*静态块不管顺序如何都会在main()方法之前执行
5、Java程序的初始化顺序
(1)当实例化对象时对象所在类的所有成员变量首先要进行初始化,当所有的类成员完成初始化后才会调用对象所在的类的构造函数创建对象
(2)(优先级逐次递减)静态对象(变量)优于非静态对象(变量),静态只能初始化一次;父类优先于子类;按照成员变量的定义顺序进行初始化,,先于方法前初始化
(3)执行顺序:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数
6、Java的作用域
(1)在Java语言中作用域由花括号确定,他决定其定义的变量名的可见性;
(2)变量类型:成员变量、静态变量、局部变量;成员变量生命周期与实例化对象的生命周期相同;static修饰的为静态变量被所有实例共享,只有类被加载,JVM才会给类静态变量分配存储空间,所以可以通过类名和变量名来访问静态变量
(3)Public:表明该成员变量或方法对所有类或对象都是可见的,所有都可以直接访问
Private:表明该成员变量或方法是私有的,只能当前类能访问
Protect:表明成员变量或方法对该类自身,与他在同一个包的其他类,在该类的子类都可见
Default:表明该成员变量或方法只有自己和与其位于同一包内的类可见,子类在同一包类可见 不在则不可见
这些修饰符只能修饰成员变量,不能用来修饰局部变量;private与protect不能用来修饰外部类(只有public 、abstract、或final能用来修饰外部类)但他们可以用来修饰内部类
7、一个Java文件可以有多个类但最多只能有一个类被public修饰,并且这个类必须与文件名相同

8、构造函数---->用来对象实例化时初始化对象的成员变量
(1)构造函数必须与类的名字相同且不能有返回值,返回值也不能为void
(2)每个类可以有多个构造函数,没有构造函数编译器会自动创建一个空构造函数,如果提供了构造函数则编译器不创建
(3)构造函数可以有0、1或多个参数
(4)构造函数总数伴随new操作一起调用 由系统调用;构造函数在对象实例化时被自动调用且只运行一次
(5)构造函数主要完成对象的初始化操作
(6)构造函数不能被继承,因此不能被覆盖但能被重载
(7)子类可以通过super关键字来显示的调用父类构造函数,父类无无参构造函数时子类必须显式调用父类构造函数,父类提供了则不用
(8)当父类和子类都没有定义构造函数时 编译器会为父类子类生成一个默认无参构造函数
(9)普通方法可以与构造函数名相同

9、没有任何方法声明的接口叫做标识接口:使用时用instanceof来判断实例对象的类型是否实现了一个给定的标识接口(P54)

10、Java中的clone方法******
(1)Java在处理基本数据类型采用按值传递(传递的是输入参数的复制)的方式执行,而其他类型采用引用传递的方式(传递的是对象的一个引用)执行,对象除了在函数调用时采用引用传递,在=赋值时也采用引用传递

(2)从一个对象A创建另外一个与A相同的对象B,且对B的修改不会影响A的状态 使用Java的clone()方法可以简单实现
(3)使用clone()方法的步骤:
1)实现clone的类首先需要继承Cloneable接口。Cloneable接口实际是一个标识接口没有任何接口方法
2)在类中重写Object类中的clone()方法
3)在clone()方法中调用super.clone()。
4)把浅复制的引用指向原型对象的新的克隆体
实例:class Obj implements Object Cloneable{

Public Object clone(){
Object o=null;
try{
o =(Obj)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}

5)当类中包含对象时 需要深复制,实现方法时在对对象调用clone()方法完成复制后,接着对对象中的非基本类型的属性也调用clone()方法完成深复制!

class Obj implements Cloneable{
private Date brith=new Date();
//getter和setter方法
public Object clone(){
Object o=null;
try{
o =(Obj)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
o.birth=(Date)this.getBirth().clone();
return o;

}
}
6)选择复制方式:首先检查有无基本类型(即对象)的数据成员,若没有则返回super.clone()即可;若有,确保类中包含的所有非基本类型的成员变量都实现的深复制
7)浅复制与深复制的区别:
浅复制:(Shallow clone)被复制对象的所有变量都含有与原来对象相同的值,而所有对其他对象的引用任然指向原来的对象。换而言之,浅复制仅仅复制所考虑的对象,而不复制他引用的对象
深复制:被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,将不再是原有的那些被引用的对象。换而言之深复制把复制的对象所引用的对象都复制了一遍

11、反射机制:反射机制是Java语言中非常重要的特性,它允许程序在运行时进行自我检查,同时允许对其内部成员进行操作。由于反射机制能够实现运行时对类进行装载,因此能够增加程序的灵活性。
反射机制提供的功能:得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法
Class.forName(“类的路径”);
类名.Class
实例.getClass()

Java创建对象的方式:
通过new语句实例化一个对象;
通过反射机制创建对象;
通过clone()方法创建对象;
通过反序列化的方式创建对象

12、如何实现类似与C语言中函数指针的功能
(回调函数通常用于截获消息、获取系统信息或处理异步事件)
方法:利用接口与类实现接口与类来实现,应先定义一个接口然后在接口中声明要调用的方法。接着实现这个接口,最后把这个实现类的一个对象作为参数传递个调用程序,调用程序通过这个参数来调用指定的函数,从而实现回调函数的功能。

二、面向对象技术
1、面向对象的主要特征:抽象、继承、封装、多态

2、面向对象的开发方式的优点:较高的开发效率;保证软件的鲁棒性;保证软件的高可维护性

3、继承
继承时面向对象中非常重要的特性,通过继承 子类可以使用父类的一些成员变量和方法,从而提高代码的复用性提高开发效率
继承的特性:
1)Java不支持多继承,子类只能有一个父类,但是可以通过实现多个接口来达到多继承目的
2)子类只能继承父类非私有的成员变量或方法
3)当子类中的方法与父类的方法具有相同的函数签名(相同的参数,相同的方法名,相同的参数个数)时,子类会覆盖父类的方法,而不时继承
4)当子类的定义的成员变量与父类定义的成员变量同名时,子类的成员变量会覆盖父类的成员变量。而不会继承

5)组合和继承的区别:组合:是指在新类里创建原有类的对象,重复利用已有类的功能
选泽规则:
两个类是is-a 的关系—>使用继承 ,不要轻易的使用继承,过多的继承会破坏代码的可维护性
不要仅仅为了实现多态而使用继承,采用接口与组合的方式比采用继承的方式据有更好的可拓展性,多使用组合少继承。

4、多态的实现机制

多态:表示同一个操作作用于不同对象时会有不同的语义
1)方法的重载:重载是同一个类中有多个同名的方法,但是方法参数不同。是编译时多态
2)方法的覆盖:子类可以覆盖父类的方法,因此同样的方法在父类与子类有着不同的表现形式。—>运行时多态
3)只有类的方法才有多态的概念,而类中成员变量没有多态概念

5、重载和覆盖的区别
1)覆盖是子类和父类之间的关系,是垂直关系;重载是方法同一个类方法之间的关系,是水平关系
2)覆盖只能由一个方法或一对方法产生关系;重载是多个方法之间的关系
3)覆盖要求参数列表相同;重载要求参数列表不同
4)覆盖关系中,调用的方法体是根据对象的类型来决定;而重载是根据调用的实参表与形参表来选择方法体;

6、抽象类与接口的异同
抽象类:如果一个类中包含抽象方法,那么这个类就是抽象类
接口:接口是一个方法的集合,接口的所有方法都没有方法体
抽象类与接口是支持抽象类定义的两种机制
1)接口与抽象类的相同点:
都不能被实例化;
接口的实现类与抽象类的子类都只有实现了接口或抽象类的方法后才能被实例化;
2)抽象类与接口的不同点
(1)Java8之前,接口只能定义,其方法不能在接口中实现,只有实现接口的类才能实现接口中定义的方法,而抽象类可以有定义和实现;
(2)接口需要实现,但抽象只能继承。一个类可以实现多个接口但只能继承一个抽象类
(3)接口强调特定功能的实现,其设计理念是has-a的关系,而抽象强调所属关系即is-a关系
(4)接口中定义的成员变量默认为public static final,而且必须赋初值,其所有成员方法都是public 、abstract的,而且只能由这两个关键字修饰。抽象类可以有自己的数据成员变量,也可以有非抽象的成员和方法,抽象类的成员变量默认为default 也可以被定义为private、protect、public;抽象类中抽象方法必须有abstract修饰,同时方法必须以分号结尾,并且不带花括号
(5)接口被用于实现比较常用的功能,而抽象类更倾向于充当公共类的角色

7、内部类
1)静态内部类:被声明为static的内部类,不依赖外部实例而被实例化,静态内部类不能与外部内部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类的静态成员和静态方法(包括私有型)
2)成员内部类:可以自由引用外部类的属性和方法,不可定义静态的属性和方法;只有在外部类被实例化后才能被实例化,不能有静态成员
3)局部内部类:作用范围为其所在的代码块,不能被public 、protect、abstract、default修饰,只能访问final类型的局部变量
4)匿名内部类:没有类名的内部类,不适应关键字class、extends、implements,没有构造函数,必须继承其他类或实现其他接口,
5)匿名内部类不能有构造函数、不能定义静态成员方法和类、匿名内部类不能是public、protect、abstract、static;只能创建匿名内部类的一个实例;一个匿名内部类一定是在new的后面,这个匿名内部类必须继承父类或实现一个接口

8、获取父类类名:getClass().getSuperclass().getName()

9、this和super的区别
this用来指向当前实例变量,一个非常重要的作用是用来区分对象的成员变量与方法的形参
super可以用来访问父类的方法或成员变量;当子类的方法或成员变量与父类相同时会覆盖父类的方法或成员变量,因此只能通过super来访问父类的方法或成员变量
当子类构造函数需要显示调用父类的构造函数时,super()必须为构造函数的第一条语句

三、关键字
1、变量名命名规则:Java语言规定标识符只能由字母、数字、下划线、$组成,且第一个字母不能为数字,标识符里不能包含空白字符(空格、换行符、制表符等)区分大小写

2、final、finally、finalize的区别
1)final用于声明属性、方法、类,分别表示属性不可变(引用不可变、对象不可变)、方法不可覆盖、类不可被继承
2)finally作为异常处理的一部分,它只能用于try/catch中 并且附带一个语句块,表示语句块最一定会执行,经常用于释放资源
3)Finalize时Object的一个方法,在垃圾回收器执行时会调用被回收的对象的finalize方法,可以覆盖此方法来实现对其他资源的回收
4)JDK中不可继承的类是final修饰的类,例如String,StringBuffer等

3、static关键字
1)static成员变量:static修饰的静态变量,在对象被创建后,实例变量才会被分配空间
2)Static成员方法:static是类的方法不需要创建对象就可被调用,非static方法是类的方法,类被创建才被调用;static方法中不能使用this和super,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,重要用途:实现单例模式
3)Static代码块:常用于初始化静态变量,按顺序执行,JVM在加载时就会执行static代码块
4)Static内部类

4、实例变量:变量归对象所有
局部变量:在方法中定义的变量,在使用前 必须初始化
类变量:拥抱static修饰的属性、变量归类所有,只要类被加载这个变量便可被引用
final变量:不可修改。常量;在Java语言中不可在函数内部定义static变量
Static final结合使用相当于全局变量,不可被修改或覆盖

5、volatile有什么作用
1)volatile是一个类型修饰符,被设计用来修饰被不同线程访问和修改的变量
2)被volatile修饰的变量系统每次使用它都是从直接从对应的内存中提取,而不会利用缓存
3)在使用volatile修饰成员变量后,所有线程任何时候看到的变量的值都是相同的
4)Volatile不能保证操作的原子性,使用它会阻止编译器对代码优化,会降低程序的执行效率,能不使用则不使用

6、instanceof作用
Instanceof是Java中一个二元运算符,用于判断一个引用类型的变量所指的对象是否是一个类的实例,返回Boolean类型数据
Eg:result =object instanceof class

7、strictfp用于确保浮点数运算的准确性,保证浮点数运算的精确性且在不同平台上有一致的运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值