Java介绍
Java是由SUN公司在1995年推出的一套编程语言。
James ArthurGosling(詹姆斯·高斯林),诞生于加拿大,生于20世纪的笨拙年代,他的职业生涯始于Sun Microsystems。他发明了Java语言,架构了SunSoft,领衔Java团队,最后以副总裁的身份在Sun Microsystems退休。他是Java编程语言的首席设计师,被誉为“Java之父”。
- JavaSE(Java2 Platform Standard Edition,java平台标准版)
- JavaEE(Java 2 Platform,Enterprise Edition,java平台企业版)
- JavaME(Java 2 Platform Micro Edition,java平台微型版)。
面向对象
概念
所谓“面向对象”指的是软件开发的一种思想,即把数据,功能等封装成一个“一个对象”,这样的好处是在开发需求的时候只需要操作这个“对象”,不需要关注实现功能时的每个步骤。Java面向对象的三个特性:封装、继承、多态。
封装
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。例如你玩电脑时只需要掌控鼠标和键盘就行,不需要关注电脑的光标如何打开软件,不需要关注电脑硬件如何支持软件运行的。
好处:把不必要暴露的数据可以封闭起来,而且又可以预留接口对属性或数据进行业务处理,这样既能在一定程度上保证数据的安全性,又方便、规范操作。
继承
继承是指Java中把某些类的共性不断抽取出来,从而定义一个最高级别的类(父类),然后由下一层的类(子类)去继承这个父类的一种开发思想。这样的好处是:1、让这些相关的类产生联系;2、提高代码复用性,子类可以直接复用父类的部分属性和功能;3、思想上便于程序设计,功能相关的类通过‘继承’这次关系绑定一起,便于代码修改和管理。
Java只支持单继承,但是可以多重继承,例如:A继承了B,那么A就不能再继承C,但是允许B继承C,形成A=》B=》C这种继承关系。
Super和This关键字:在需要区分父类和子类的属性、方法时可以用super访问父类,this访问本类。
多态
多态在Java中指同一个功能具有多种形式的实现方式。它的前提是两个对象存在这继承关系。实现形式为父类引用指向子类对象,假设Student是Person的子类那么:Person p = new Student()。多态的好处是提供代码的灵活性和可扩展性,虽然他们通过‘继承’关系联系在一起,但是又允许子类可以用不同的方式实现父类的功能。
方法的重载和重写
重载(overload):
在同一个类里存在名称一样的方法。只有方法名一样,参数可以属性不同也可以数量不同,不用在意返回结果是否相同。
重写(overwrite):
子类对父类某个功能实现方法的重新编写,只改变方法实现的内容,不改变参数属性、数量和返回值的属性。
访问权限
public(公开)表示任何人都可以访问和使用该元素。
protected(受保护)类似于 private,区别是子类可以访问protected的成员,但不能访问private 成员。
default(默认)被称为包访问,因为该权限下的资源可以被同一包(库组件)中其他类的成员访问。
private(私有)除了类本身和类内部的方法,外界无法直接访问该元素。
数据类型
数据类型的内存大小
1 Byte = 8 Bit
一个汉字具体所占空间大小,与数据库的编码格式有关。
GBK编码格式,一个汉字占2个字节
UTF-8编码格式,一个汉字占3个字节
UTF-16编码格式,一个汉字占2个字节
Unicode编码格式,一个汉字占2个字节
静态变量、成员变量与局部变量
初始值不同:
静态变量:系统会默认赋初始值,基本类型为0,引用类型为null
成员变量:系统会默认赋初始值,基本类型为0,引用类型为null
(若静态变量和成员变量被final修饰,则必须显示赋值)
局部变量:在使用前必须手动赋值
调用对象不同:
静态变量:可以由类名调用也可以由对象来调用,通常都是由类名来调用
成员变量:只能由对象调用
局部变量:在方法内被调用
存放位置不同:
静态变量:依附于class文件,存放在方法区
成员变量:随对象创建而创建,存放于堆中
局部变量:方法执行时被创建,存在于栈中
生命周期不同:
静态变量:随着类的创建而创建,随类的卸载而销毁
成员变量:随着对象的创建而创建,对象回收而销毁
局部变量:随着方法调用而创建,调用结束而销毁
JDK、JRE、JVM的区别
JVM(Java Virtual Machine)俗称Java虚拟机,Java代码实际运行的主要区域。
JRE(Java Runtime Environment)Java运行环境,包括一些Java运行依赖的jar包库和JVM。
JDK(Java Development Kit)Java程序环境的工具包,包括一些Java编译、执行的工具和JRE。
环境变量配置(Windows10)
1、打开系统变量,新建JAVA_HOME变量
配置:电脑上JDK安装的绝对路径:E:\Java\jdk1.8.0_91
2、新建/修改 CLASSPATH 变量
配置:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
3、修改Path变量
配置:
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin
关键字和标识符
关键字:其实就是某种语言赋予了特殊含义的单词。
保留字:其实就是还没有赋予特殊含义,但是准备日后要使用过的单词。
标示符:其实就是在程序中自定义的名词。比如类名,变量名,函数名。包含 0-9、a-z、$、_ ;
注意:
1)数字不可以开头。
2)不可以使用关键字。
常量:是在程序中的不会变化的数据。
final关键字:
1:这个关键字是一个修饰符,可以修饰类,方法,变量。
2:被final修饰的类是一个最终类,不可以被继承。
3:被final修饰的方法是一个最终方法,不可以被覆盖。
4:被final修饰的变量是一个常量,只能赋值一次。
static关键字:
1:static修饰表示静态或全局,被修饰的属性和方法属于类,可以用(类名.静态属性/方法名)访问。
2:static修饰的代码块表示静态代码块,当 Java 虚拟机(JVM)加载类时,就会执行该代码块,只会被执行一次。
3:static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,只会被创建一次,可以重新赋值。
4:static方法中不能用 this和super关键字,必须被实现,而不能是抽象的abstract,不能被重写。
接口和抽象类的区别
抽象类:可以被继承,用extends修饰,特点为:
a、抽象类不能被实例化只能被继承;
b、包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;
c、抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;
d、一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;
e、抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。
接口:Java中接口使用interface关键字修饰,特点为:
a、接口可以包含变量、方法;变量被隐士指定为public static final,方法被隐士指定为public abstract(JDK1.8之前);
b、接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题;
c、一个类可以实现多个接口;
d、JDK1.8中对接口增加了新的特性:
(1)默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;
(2)静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。
相同:
1、都不能被实例化
2、接口的实现类和抽象类的子类都必须实现了接口和抽象类的方法才能实例化
不同:
1、接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
2、实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
3、接口强调特定功能的实现,而抽象类强调所属关系。
4、接口成员变量默认为public,static ,final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
异常:
Try-catch-finally,哪部分可以省略?
catch和finally任意一个都行,但是不能同时省略!不同的是省略finally部分异常可以捕捉住,省略catch部分的编译可以通过但是异常无法捕捉还是会抛出去。
如果 catch 中 return 了,finally 还会执行吗?(会)
(1)finally的作用就是,无论出现什么状况,finally里的代码一定会被执行。
(2)如果在catch中return了,也会在return之前,先执行finally代码块。
(3)而且如果finally代码块中含有return语句,会覆盖其他地方的return。
(4)对于基本数据类型的数据,在finally块中改变return的值对返回值没有影响,而对引用数据类型的数据会有影响。
注:什么情形下,finally代码块不会执行?
(1)没有进入try代码块;
(2)System.exit()强制退出程序;
(3)守护线程被终止;
throw 和 throws 的区别?
(1)throw:在方法体内部,表示抛出异常,由方法体内部的语句处理;throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例,一般和try-catch联用;
(2)throws:在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理;表示出现异常的可能性,并不一定会发生这种异常。
String、StringBuffer、StringBuilder
1、String操作比较方便但是仅限于少量字符串的添加,无法直接进行删减和更改,如果操作大量字符串则选用StringBuilder或者StringBuffer。
2、因为StringBuffer线程安全,在需要保证线程安全时只能用StringBuffer。
3、在需要进行大量字符串操作又不需要考虑线程安全时选StringBuilder。
博客资料:https://www.cnblogs.com/Bernard94/p/12362318.html
String和Object常见方法
String
- length():获取字符串的长度,其实也就是字符个数
- charAt(int index):获取指定索引处的字符
- indexOf(String str):获取str在字符串对象中第一次出现的索引
- substring(int start):从start开始截取字符串
- String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end
- equals(Object obj):比较字符串的内容是否相同
- equalsIgnoreCase(String anotherString):比较字符串的内容是否相同,忽略大小写
- startsWith(String prefix):判断字符串对象是否以指定的字符开头(区分大小写)
- startsWith(String prefix,int toffset):判断字符串对象是否以指定的字符开头,参数toffset为指定从哪个下标开始
- endsWith(String str):判断字符串对象是否以指定的字符结尾
- trim():去除字符串两端空格
- split():去除字符串中指定的的字符,然后返回一个新的字符串
- replace(char oldChar, char newChar):将指定字符替换成另一个指定的字符
- replaceAll(String regex,String replasement):用新的内容替换全部旧内容
Object
- getClass:方法、获取对象的运行时 class 对象,class 对象就是描述对象所属类的对象。这个方法通常是和 Java 反射机制搭配使用的。
- hashCode:该方法主要用于获取对象的散列值。Object 中该方法默认返回的是对象的堆内存地址。
- equals:该方法用于比较两个对象,如果这两个对象引用指向的是同一个对象,那么返回 true,否则返回 false。一般 equals 和 == 是不一样的,但是在 Object 中两者是一样的。子类一般都要重写这个方法。
- clone:该方法是保护方法,实现对象的浅复制,只有实现了 Cloneable 接口才可以调用该方法,否则抛出 CloneNotSupportedException 异常。默认的 clone 方法是浅拷贝。所谓浅拷贝,指的是对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存。深拷贝则是会连引用的对象也重新创建。
- toString:返回一个 String 对象,一般子类都有覆盖。默认返回格式如下:对象的 class 名称 + @ + hashCode 的十六进制字符串。
- notify:方法,主要用于唤醒在该对象上等待的某个线程。
- notifyAll:方法,主要用于唤醒在该对象上等待的所有线程。
- wait(long timeout):wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait() 方法一直等待,直到获得锁或者被中断。wait(long timeout) 设定一个超时间隔,如果在规定时间内没有获得锁就返回。
- finalize:该方法是保护方法,主要用于在 GC 的时候再次被调用,如果我们实现了这个方法,对象可能在这个方法中再次复活,从而避免被GC 回收。
序列化
概念:
序列化:把对象转换为字节序列的过程称为对象的序列化。(由实体转到内存中)
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。(把内存转为实体)
关键字:
实现Serializable接口;
设置serialVersionUID值。
serialVersionUID值的作用:
通过该值来验证版本一致性,从而决定是否反序列化成功。(反序列化时,JVM会比较字节流中的serialVersionUID和本地class文件的serialVersionUID是否相同,相同则成功,不同则失败)
补充:
1、static属性不会被序列化
2、transient修饰的属性,也不会被序列化
通配符
为了给部分数据结构、集合指定一定的数据取值范围。
==和equals的区别
对于‘==’,如果作用于基本数据类型的变量(byte,short,char,int,long,float,double,boolean ),则直接比较其存储的"值"是否相等;如果作用于引用类型的变量(String),则比较的是所指向的对象的地址(即是否指向同一个对象)。
IO流
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。IO技术实际上就是让数据在电脑内存或程序系统和硬件(硬盘,内存卡)之间转换的技术。
1、按流向
输入流:读取数据,把持久设备的数据读取到内存中。
输出流:写出数据,把内存的数据写出到持久设备。
2、按种类
字节流:传输过程中,传输数据的最基本单位是字节的流,常用的文件(txt、图片、mp3、mp4等)都可以用字节流来进行IO操作。
字符流:传输过程中,传输数据的最基本单位是字符的流,一般只能用于文本文件进行IO操作。
字节流转换:字节流+编码 =》字符流 ;字符流 =》字节流 + 解码 。
Java基础数据类型和封装类
相同:基础数据类型和封装类都是用来处理数据的。
不同:
1、基础数据类型属于值类型,封装类是引用类型。
2、封装类是类,满足类的相关特点可以有方法、属性。
3、基础数据类型存放位置在栈中,封装类存放在堆中。
4、基础数据类型根据不同类型有不同默认值,封装类默认值都是null。
资料博客:https://blog.csdn.net/oLaoHuBuChiRen1/article/details/51079738