前言
大家好,这篇文章主要就所有JAVA基础的下半段了,也就面向对象编程了,学了近两年的我,已经是非常的熟悉了。先跟大家在声明一下,我总结JAVA基础是为了让初学的JAVA的朋友看一看,了解一下,自己要学习什么。然后就是对基础已经学完,然后有些基础不是很牢固的(比如我自己)来复习,虽然很多!毕竟!这是一年所学习的内容,当然庞大!!!然后就是总结的不是很专业,但希望能帮助到大家,以后有些知识忘记了,也是可以回头看一看的
目录
1.面向对象编程概述
符合人的思维模式,编写的程序更加健壮和强大
2.面向对象简称OOP(Object Oriented Programming)
3.对象
对象是现实世界存在的实体,比如:人,电脑,汽车…
对象都是唯一的,每个对象都其各自的属性和行为
属性:外貌特征
行为:功能/能干什么
4.类
具有相同属性和行为的对象的集合,是面向对象思想的重要基础。如:人类,汽车类,动物类
类是一个独立的程序单元,有类名,属性,方法组成
5.对象和类之间的关系
类中包含很多个对象
类的实例化结果就是一个对象
类是对象的模板,对象是类的实例
类是对象的原型,所有属于同一个类的对象都有相同的属性和行为
对象是实际实体
对象是真实的模型
6.定义类的语法
class 类名
{
1.属性:
数据类型 变量名称1;
数据类型 变量名称2;
2.行为:方法
返回类型 方法名称([参数列表])
{
......
}
}
7. 定义方法的语法:
返回值类型 方法名称(参数类型1 参数名称...)
{
方法体
}
分类:
1.有参数函数和无参数函数
2.有返回函数和无返回值
注:类名,方法名需要遵循标识符的命名规则
8.对象的调用.
-
创建对象的语法:
类名 对象的引用名称 = new 类名();a.类名 对象的引用名称;
只是创建一个对象引用名称,系统会分配一个虚拟的存储空间
b.实例化
使用new关键字,进行实例化。此时系统会分配存储空间,每new出一个对象,会新开辟一个存储空间
c.初始化
当调用构造方法时,进行初始化 -
调用属性和方法
对象的引用名称.属性名或方法名称;
9.构造方法:
方法名称和类名一致,参数列表不一样(参数的个数,顺序,类型),没有返回类型
注:
1. 系统会默认给每个类提供无参数的构造方法
2. 分类:有参数构造方法和无参数构造方法
3. 如果一个类定义了构造方法,那么系统将不会提供无参数的构造方法;如果需要,则需要自己创建
10. 局部变量:
局部变量是定义在语句块中的.诸如:方法体,循环体,if或else语句后的一对大括号都是语句块
类体不是语句块.
局部变量的作用域:只在一个语句块内有效,
其生命周期是从开始执行声明它的语句开始到其所在的语句块结束而结束.在同一个局部同名的局部变量只能有一个
11.this关键字
-
this指当前对象
-
如果成员变量与局部变量同名,如何处理:
当局部变量与成员变量同名时,系统将访问的是局部变量,这种情况下,要想访问成员变量,就可以使用预定义对象引用this -
this在任何一个方法中使用,表示指向当前对象的自已的引用
-
this只能在属于对象的方法或语句块中使用,但是不能再static修饰的方法或语句块中使用
12.封装:隐藏对象的实现细节,不让用户看到
- 将属性进行私有化,使用private修饰变量
- 提供set()和get()方法
13.继承
-
特点:
1). 子类继承的父类的属性和方法,一个类只能有一个父类(单继承),可以用接口实现多继承
2). 具有层次结构 -
优点:代码可重用性高
可以轻松定义子类,(可以有自己的属性和方法)
子类可以调用父类的方法
设计程序更加简单 -
使用extends关键字实现继承
-
super关键字:
1). 所有类的父类是Object
2). 始终指向调用类的父类
3). 创建子类对象时,先调用父类的构造方法,然后再调用子类的构造方法
4). 子类的构造方法名称和类名相同
5). super的使用:
调用父类构造方法的方式:a. super();或super(参数); 注:1.只能在子类的构造方法中,并且只能放在子类构造方法中代码的第一行 b.调用父类的成员变量: super.变量名称; c.子类调用父类的成员方法: super.方法名称();
-
this关键字和super关键字比较
参见图片:this和super的区别
14.对象的引用
对象的引用的方式:
1. 父类对象的引用直接指向其自己
2. 父类对象的引用指向其直接或间接子类
3. 父类调用子类的方法:将父类强制转换成子类:(子类类名)父类对象引用名称;
4. 判断两个对象
==:判断两个对象是否相等,比较的是两个对象在内存中的存放地址
equals():比较的是内容是否相等
5. instanceof 类名 引用指向的对象和后面的类名是否兼容
15.多态:
-
Java的三大特性:封装,继承和多态
-
多态分为方法重写和方法重载
-
方法重载(Overloading):静态多态(编译时多态)
方法名称相同,参数列表不同(参数的个数,顺序,类型),返回值类型可以不同,但是返回类型不能代表重载方法
典型:构造方法重载 -
方法重写(Override):动态多态(运行时多态)
方法名称,返回类型,参数列表相同,实现不同注:1.方法重写发生在有继承关系的父子类中,且是非私有的方法
2.若子类重写了父类的方法,则子类调用子类的方法,否则调用父类的方法
3.子类方法不能比父类方法中被重写的方法有更严格的访问权限
4.重写的方法不能比被重写的方法抛出更多的异样
5.调用父类的中的方法:super.方法名称(); -
方法重载和方法重写的区别
16.访问修饰符
-
作用:信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因
信息隐藏的原因包括:
对任何实现细节所作的更改不会影响使用该类的代码
防止用户意外删除数据
此类易于使用 -
分类:
1). public(公开的):整个应用程序的类都能访问
2). protected(受保护的):同一个包的类,或是不同包且有继承关系的子类可访问
3). 默认:同一个包内的类可以访问
4). private(私有的):同一个类可以访问 -
访问控制从外往内依次为:包,类,成员
类的访问控制: public和默认的访问控制
public的类:可以在任何地方被任何类访问
默认的类:只能被在同一个包中的类访问成员的访问控制:private,默认,protected,public
注:一个文件中只能有一个类是public修饰的,一般情况下,public修饰的类的类名和文件名称是一致
17.方法的修饰符
-
static关键字
static修饰的变量叫静态变量(类变量)
static修饰的方法叫静态方法(类方法) -
静态方法语法格式:
访问修饰符 返回值类型 方法名称(参数列表)
{
方法体
}public static void add(int x,int y){
} -
调用静态变量和方法的语法:
列名.类变量/类方法;注: 1). 静态方法中,只能调用静态的变量和方法 2). 非静态的方法中,可以调用不仅可以调用非静态的变量和方法,也可以调用静态的变量和方法 3). static不能修饰局部变量 4). 静态方法中不能使用this和super关键字
-
修饰代码块
static{ //静态代码块 } 在JVM加载类时,执行一次。 静态代码块中不能访问非静态的数据,包含this,super *静态可以直接访问静态,不能访问非静态的。 *非静态可以直接访问静态。
-
final关键字
1). fianl修饰的变量不能被更改
2). final修饰的方法不能被子类重写final修饰的类(最终的类)不能被继承,final修饰的方法(最终方法)不能被重写。
final修饰的成员变量(最终变量)其值不能被修改。
final用来修饰一个类,方法,属性或局部变量
final 类不能被继承
final 方法不能被覆盖
final 变量的值不能被改变
final的局部变量在使用前把值赋上final修饰的成员变量必须在定义时或者在构造方法中初始化,建议定义时直接初始化
如果一个成员变量同时使用final和static修饰,则称为类常量,简称常量,常量命名一般大写
eg:private final static String SCHOOL_NAME=“襄阳英泰”; -
abstract修饰符
1). abstract修饰的类叫抽象类
abstract class 类名{}2). abstract修饰的方法叫抽象方法,抽象方法必须是放在抽象类中(如果一个类中有抽象方法,则此类一定是抽象类)
public abstract void show();注: 1.抽象方法没有方法体 2.抽象类中可以有非抽象的方法,此方法有方法体 3.抽象类不能被实例化 4.构造方法和static方法不能是抽象的 5.父类的抽象方法必须在子类中实现 6.抽象类可以具有指向子类对象的对象引用
18.接口
-
Java是单继承的,接口弥补了Java单一继承的弱点
-
可以把接口看成是一个“纯粹”的抽象类.
接口代表一个契约,表示实现其的类有什么样的功能。其也需要实现,默认为abstract修饰。
定义接口使用关键字interface,语法如下:public [abstract] interface 接口名称{ //成员变量和方法 } 注:1.abstract可以省略
-
接口中的成员变量使用:
public static final 数据类型 变量名称 = 变量值; -
接口中的方法是抽象方法,没有方法体,可由abstract修饰
public [abstract] 返回类型 方法名称(参数列表);
注:1.abstract可以省略 -
用关键字implements实现接口:
class 类名 [extends 类名] implements 接口名称{ //成员变量和方法 }
注:如果一个类实现了一个接口,但是没有重写接口中的方法,那么将此类定义为abstract修饰的抽象类
19.异常
-
程序的运行中发生的不正常的事件,它会中断正在运行的程序
-
Java中的异常类
Thrawable有2类:
1). Exception:应该捕获的异常
2). Error:程序中的错误,不建议程序捕获 -
Exception的子类:
Exception:异常类的根类
RuntimeException: java.lang 异常的基类
ArithmeticException:算术异常,除数为0
IllegalArgumentException:接收非法参数
ArrayIndexOutOfBoundsException:数组越界异常,小于或大于数组的大小
NullPointerException:空指针异常
ClassNotFoundException:加载不到指定类的异常
NumberFormatException:数字转化格式异常(类型转换异常)
IOException:文件读写异常
FileNotFoundException:找不到文件异常
EOFException:文件结束异常
InterruptedException:线程中断异常 -
异常的处理方式
4.1.try-catch处理异常方式: 1.try-catch处理异常有3种情况: try{ a.监控的代码块 }catch(异常类型 e){ b.异常处理程序 }finally{ c.在try结束前要执行的代码块 释放资源:关闭网络连接,关闭数据库连接 } a.监控的代码块 如果代码不产生异常---程序继续执行 b.监控的代码库产生异常--->异常类型匹配--->进入catch模块-->继续执行 c.监控的代码库产生异常--->异常类型不匹配 --->程序结束 2.finally块 无论程序是否有异常,finally块总是会被执行 资源释放:释放对象资源,网络连接,数据库连接 3.多重catch语句 1.发生异常时,会按顺序来查看每个catch语句,并执行第一个与异常语句匹配的catch语句 2.执行一个catch之后,其余catch将不会被执行 3.异常子类一定要位于异常父类之前 4.如果产生的异常对象不能和catch进行匹配,则中断程序 4.2使用throw和throws处理异常的方式 1.throws声明异常 a.throws一般用于方法声明,如果当前方法存在异常,不想在方法中解决,则可以使用throws在方法声中声明异常 b.语法: 访问修饰符 返回值类型 方法名称(形参列表) throws 异常类1,异常类2...异常类n{ 方法体 } c.多个异常类之间用逗号分隔 d.由调用者捕获异常信息 2.throw抛出异常 a.throw一般用在方法体中,如果方法中存在异常,不想再方法中解决,则可以在方法中使用throw抛出异常,使用new创建异常类对象 b.语法: throw new 异常类对象;
- 自定义异常
1.JavaAPI提供的内置异常不一定总能捕获程序中发生的所有错误。有时会需要创建用户自定义异常
2.自定义异常需要继承Exception 及其子类
3.语法:
class 自定义异常类名 extends Exception {
}
- 自定义异常
20.java.lang包
-
java.lang包是java最广泛使用的包,它会被系统自动导入到所有的程序中
-
包装类
2.1 定义变量使用的是基本数据类型(简单数据类型) 2.2 Java是完全面向对象的语言,有些时候程序中可能需要用到对象类型,这时需要将基本数据类包装成封装类 2.3 常见的包装类 基本数据类型 包装类 byte ----> Byte short ----> Short int ----> Integer long ----> Long float ----> Float double ----> Double boolean ----> Boolean char ----> Character 2.4 将基本类型转换成封装类的方式: 1.构造方法 2.valueOf()方法; 2.5 将封装类转换成基本数据类型的方式: 1. xxxValue()方法 2. parsetxxx()方法 如: public static int parseInt(String s,int radix) throws NumberFormatException @s :要解析的字符串 @radix:字符串中的字符必须全部是指定基数的数字 范围:2-36 出现异常的情况:第一个参数是null或是长度为零的字符串。 基数小于Character.MIN_RADIX或大于Character.MAX_RADIX 。 字符串的任何字符不是指定基数的数字,除了第一个字符可能是减号'-' ( '\u002D')或加号'+' ( '\u002B' ),前提是字符串长于长度1。 由字符串表示的值不是int类型的值。 自动打包:可以直接将基本数据类型的值当作封装类对象使用 自动解包:可以直接将封装对象赋值给基本的数据类型的变量
-
Character类常用的方法:
1). 判断是否为数字:isDigit()
2). 判断是否为大写字母:isUpperCase()
3). 判断是否为小写字母:isLowerCase()
4). 判断是否为字母:isLetter(char ch)
5). 判断是否是空格或换行:isWhitespace() -
Number类(超类)
基本数据类型平台类的超类byte , double , float , int , long和short (6种)
有返回上面不同数字格式的对象值得方法 -
String类
1). 字符串是常量,其值在创建后不能更改
2). 因为String对象是不可变的,它们可以被共享。
(Java虚拟机将它理解为编译时的常量,在内存中只会为它分配一次内存,然后就可以重复使用)
3). 比较字符串的常用方法:a.比较两个对象是否相等: == (对象在内存中是否占用同一块内存地址) b.比较两个对象的内容是否相等: equals() c.比较两个对象的内容是否相等,忽略大小写:equalsIgnoreCase() d.按照字典顺序比较两个字符串:compareTo() 结果:如果两个字符串相等,则返回 0; 如果字符串在该值之前,则返回值小于 0; 如果字符串在该值之后,则返回值大于 0 e.判断字符串以某种字符串开始:startWith(); f.判断字符串以某种字符串结尾:endsWith();
4). 搜索字符串的方法
1). charAt(index):从指定位置提取字符,index必须是非负 2). substring(beginIndex):从指定位置截取字符串,到结束 3). substring(beginIndex, endIndex):从beginIndex截取到endIndex位置,不包括结束位置的字符(前闭后开) 注:IndexOutOfBoundsException - 如果 beginIndex为负数,或 endIndex大于该 String对象的长度,或 beginIndex大于 endIndex 4). concat():字符串拼接 5). replace(oldChar,newChar):使用newChar字符替换oldChar字符 6). trim():去掉字符串的前后空格 7). toUpperCase():转大写方法 8). toLowerCase():转小写方法
-
StringBuffer和StringBuilder
1). String字符串创建后不可改变,若想改变,可使用StringBuffer和StringBuilder
2). 区别:a.都表示可变(可以修改)字符串 b.StringBuffer线程安全,比较适用于多线程的情况 c.StringBuilder线程不安全,比较适用于单线程的情况 d.在可能的情况下,建议优先使用StringBuilder ,因为它在大多数实现中将更快。
3). 常用方法
a.append():总是在缓冲区的末尾添加这些字符 b.length():返回字符串的长度 c.insert():将指定的字符串insert添加到指定点。 d.setCharAt(index,ch):将指定位置的字符替换为ch e.reverse():反转字符串 f.delete(int start, int end):从start位置删除到end-1的位置 g.deleteCharAt(int pos):删除指定位置的字符 h.replace(int start, int end, String s):将用替换字符串从 start 指定的位置开始替换,直到 end-1 指定的位置结束,前闭后开 注:StringBuilder的用法与StringBuffer一样
7.Math类
1). Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数。
2). 没有子类
3). 常用的方法:
random():产生0.0-1.0之间的随机数
round(double d):返回参数中最接近的long ,其中long四舍五入为正无穷大。
round(float a):返回参数最接近的int ,其中int四舍五入为正无穷大
floor(double d):返回小于或等于参数的最大(最接近正无穷大) double值,等于数学整数,不会四色五入
ceil(double a):返回大于或等于参数的最小(最接近负无穷大) double值,并等于数学整数
8.Object类
-
Object类是所有类的父类,java中的类都是直接或间接继承自Object类
-
用户自定义的类扩展子Object类
-
常用的方法:
toString():将对象以字符串的形式表示 equals():比较两个对象 hashCode():重写父类的hashCode() void finalize():当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。
-
JVM垃圾回收机制
1.Java有垃圾回收机制,会自动是释放内存
2.对象被Java虚拟机视为垃圾有2中情况:
a.对象引用超过其作用范围,则将这个对象视为垃圾
b.将对象赋值为null,如b = null
9.System类
常用的方法:
-
使用currentTimeMills()记录程序执行时间
-
赋值数组 System.arrayCopy()
-
使用exit()退出程序,0代表正常退出,常用图像界面
-
获取常用系统环境的值
java.version、java.home :运行版本和安装目录 os.name、os.version: 系统名称和版本 user.name、user.home: 用户账户和主目录 user.dir 用户当前工作目录
21.堆(heap)和栈(stack)
-
java在程序运行时,在内存中划分5片空间进行数据存储,分类:
a.寄存器 b.本地方法区 c.方法区 d.堆 e.栈 -
堆(heap)
a.new 创建的实例化对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期的自动消除 b.可以将堆看作一个管道,先进先出,后进后出 c.动态分配内存,存储器不必告诉编译器 d.存取速度比较慢
-
栈(stack)
a.基本数据类型(byte,short,int,long,float,double,char,boolean),局部变量存放在栈内存中,用完就消失 b.可以将栈看作一个矿泉水瓶,先进后出,后进先出 c.数据大小与生存期必须是确定的,缺乏灵活性 d.速度快,仅次于寄存器,数据可以共享
20.java.util包
-
Date类的用途:获取当前的系统时间
-
DateFormat和simpleDateFormat类
作用:1.将日期转换成字符串:format()
2.将字符串转换成日期格式:parse() -
Calendar日历类
1). Calendar获取月份从0开始,范围:0~11
2). 星期对应的整数L:17,对应是星期日星期六Calendar.SUNDAY 1 Calendar.MONDAY 2 Calendar.TUESDAY 3 Calendar.WEDNESDAY 4 Calendar.THURSDAY 5 Calendar.FRIDAY 6 Calendar.SATURDAY 7
3). add()
4). set() -
Random生成随机数
1). 构造方法
2). nextInt()nextLong() nextBoolean():true和false nextDouble():0.0和 1.0之间的
nextInt(int bound): 返回伪随机的,均匀分布 int值介于0(含)和指定值(不包括),从该随机数生成器的序列绘制。
总结:终于总结完了,手是真的累,话已经说完了,希望大家能认真学习,不要辜负我,累了睡觉去了,拜拜!!!