Java期末复习

天大地大妈咪最大 提交于 2020-02-08 05:00:13

类变量也叫静态变量,也就是在变量前加了static 的变量;
实例变量也叫对象变量,即没加static 的变量;
区别在于:
类变量和实例变量的区别在于:类变量是所有对象共有,
其中一个对象将它值改变,其他对象得到的就是改变后的结果;
而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象;
2.
在类中定义的成员变量如果你没有初始化java会自动帮你初始化,
如果是数字会自动初始化成0,字符会初始化成’o’,对象引用会初始化成null.
当然如果你定义的是局部变量就必须初始化了,否则编译会报错
这正是java的特点,极大的提高了代码安全性

3.定义方法p176(方法调用用栈)

访问修饰符 修饰符 返回值类型 方法名(){
方法体
}

4.对象和类

区别:对象可以使用类中的方法和变量,而变量不行;变量声明之后要进行赋值,而对象不用
联系:类是封装对象的属性和行为的载体,而对象的属性以成员变量的形式存在。
对象的方法以成员方法的形式存在,在成员方法内定义的变量为局部变量。

变量:成员变量/类变量/数据域(静态变量(有static),实例变量),局部变量(在方法体中定义的变量)
局部变量必须先赋值再使用,成员变量有默认值
公共类必须与文件同名
源代码中的每个(※每个类)类(※编译后为。class)编译成.class文件
uml图+为public修饰符
p283:构造方法就是构造对象的,通常类会提供一个无参构造方法(最好提供)
对象是通过对象引用变量访问的,用点操作符(.)
创建一个对象,但并不明确赋给一个变量,这种对象叫匿名对象
static静态变量被类class中所有对象共享
类中 常量 被该类所有对象共享,so常量应定义为final static:final static double PI=3.14
uml图中,静态变量,静态方法都有下划线
“类名。方法名(参数)/静态变量”说明此方法/数据 为静态的
静态变量是被static修饰的变量,有效范围可以跨类,使用类名.静态变量名访问
静态方法只能访问静态方法和数据域,不能访问非静态的;实例方法可访问静态及非静态方法及数据域
数据类型:基本类型(整形(byte,short,int,long),字符型(char),浮点型(float,double),逻辑形(Boolean)),
引用类型(类,接口,数组)

文件{
(public)(abstract)类{
(public/private)(static)成员变量/类变量/数据域(作用域:整个类)

(public/private)(abstract)(static)方法(参数){
局部变量(作用域:一个方法内)
this.数据域/同一类中的另一个构造方法
(构造方法:1.方法名与类名相同2.没有返回值类型,void也无
3.创建对象时new调用,作用为初始化对象)
}
}
}

abstract一般修饰方法和类,修饰方法时只有一个方法头。包含抽象方法的类一定要加abstract
抽象类可以被继承,若子类非抽象,则子类一定实现了父类中的抽象方法
可见性修饰符(指明类中数据域和方法是否能在 类外 被访问)public(无限)private(类内)默认(包内)
父类中受保护的数据域或方法可以在其子类中访问protected
局部变量上用public/private会编译错误
Java只有一种参数传递方式:值传递(传递 基本类型值/引用值)
p306string类为不可变类

5.继承和多态

接口interface:一个类,但是只包含常量和抽象方法
修饰符 interface 接口名{
变量类型 变量名;
修饰符 返回类型 方法名(形参列表);
}
public interface fly{
public void howFly();
}
实现接口的语法implements
修饰符 class 类名 implements 接口名{
修饰符 返回类型 方法名(形参列表){
……
}
}
public class Bird implements fly{
public void howFly( ){
System.out.println(“鸟依靠翅膀飞行”);
}
}
Java中不允许多重继承。一个子类,只允许有一个父类。but多重继承可以通过接口实现
静态方法不能引用this和super
父类的 构造方法 不会被子类继承。用super调用父类的 构造/普通 方法
调用构造方法:super(参数);;调用普通方法:super.方法名(参数)
显式调用父类的构造方法:super()必须出现在子类 构造方法 的第一行
构造方法可以调用 重载的构造方法/父类的构造方法,如果他们都未被显式调用,则默认super()为构造方法的第一条语句
方法重写:@override判断是否重写成功
1.重写的方法与被重写的方法有相同的 方法签名 及 一样/兼容 的 返回值(重载 只对 方法签名 有要求,返回值 不作要求)
(方法声明的两个组件构成了方法签名 - 方法的名称 和 参数类型。)
2.实例方法可访问时,才能被重写;静态方法不能被重写(可被继承)
p370多态条件:1.继承2.重写3.父类引用指向子类对象Animal a = new Cat();
instanceof :是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
1.类的实例包含本身的实例,以及所有直接或间接子类的实例
2.instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系,
也就是说需要位于同一个继承树,否则会编译错误、
3.左边的对象实例不能是基础数据类型
4.null用instanceof跟任何类型比较时都是false
5.instanceof一般用于对象类型强制转换
Animal a1 = new Bird();
if(a1 instanceof Bird){
Bird b1 = (Bird)a1;
b1.fly();
}
(将函数体和函数调用关联起来,就叫绑定)
早绑定的优点是:1. 编译效率2. 代码提示(代码智能感知)3. 编译时类型检查
晚绑定的优点是:1.不用申明类型2.对象类型可以随时更改

6.异常处理

异常处理模型的三种操作:声明(关键字throws)/抛出(关键字throw)/捕获(catch) 一个异常
要在方法头中声明它会抛出异常public void takeRisk() throws BadException,IOException{…}
异常可能通过:try中throw语句直接抛出/调用一个可能会抛出异常的方法而抛出
try中异常被抛出后,try中剩余语句不执行
重新抛出异常:catch内throw(不能处理,只是希望调用者能注意到)
catch参数是exception类型的 ex引用变量
catch只会在有抛出异常时执行
在catch代码块中可以访问异常信息,通过如下方法:
getMessage() 得到异常的最简单的描述
toString() 得到比较详细的异常信息
printStackTrace() 会把异常信息输出在默认的输出设备中。
多个catch时,先安排子类再安排父类(从小到大),异常是对象
finally语句是任选的,但catch和finally至少存在一个
不管 try 块、catch 块中是否有 return 语句,finally 块都会执⾏,在执行return语句前执行了finally块中的代码
finally 不是永远执行,什么时候不会被执行:任何语句要执行都只能在return前执行(除非碰到exit函数)
若覆盖一个方法,则必须声明覆盖方法 同样的异常/异常的子类
throw创建抛出异常:当程序检测一个错误时,程序可以创建一个恰当的异常类型的实例并抛出它。这就被称为抛出一个异常

7.文本I/O

File类包含获得一个文件/目录的属性,以及对文件/目录进行改名和删除的方法。但是,File类不包含读写文件内容的方法
使用PrintWriter写数据:PrintWriter类可用来创建一个文件并向文本文件写入数据。
可先创建一个PrintWriter对象,然后调用print、println和printf方法向文件写入数据
相对路径:相对当前工程的根目录
File f = new File(path);例:new File(“c:\book”) 为c:\book创建一个File对象
if(f.exists() ){…}
I/O流的异常属于必检异常
必须使用 close()方法 如果没有使用的话,数据就不能正确地保存在文件中。
使用try-with-resources自动关闭资源???
java文件读取的两种方式FileReader:https://blog.csdn.net/qq_41901915/article/details/81234833

8.静态代码块

https://www.cnblogs.com/ggds/p/8553414.html(具体)
静态代码块是自动执行的,而静态方法是被调用的时候才执行的
区别:
静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;
非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,
    一般在代码块中对一些static变量进行赋值。
不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。
    静态代码块只在第一次类加载时执行一次,之后不再执行,而非静态代码块在每new
    一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。
构造方法链:构造一个类的实例时,会 调用 沿着继承链的所有父类的构造方法
对象的初始化顺序: 静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
且子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。
如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

9.string

string,既不是基本数据类型,也不是字符数组,是引用数据类型
字符串是不可变对象
函数:获取字符串长度s.length(),从字符串中获取字符s.charAt(index),
连接字符串s3=s1.concat(s2)/s3=s1+s2,字符串大小写转换s.toLowerCase()/s.toUpperCase()
从控制台读取字符next()/nextLine(),字符串比较equals(s1) (boolean)/compareto(s1) (int),
获得子串/字符♥subString(sIndex,eIndex)左闭右开/indexOf(ch/s),字符串与数字转化
String类型比较
equals和比较的区别:https://blog.csdn.net/qq_37476266/article/details/89344302
//深入理解Java中String(坑):https://blog.csdn.net/qq_34490018/article/details/82110578
"
“判断引用是否指向堆内存的同一块地址
String作为一个对象来使用:对象不同,内容相同,”“返回false,equals返回true:同一对象,”“和equals结果相同
String作为一个基本类型来使用:如果值不相同,对象就不相同,所以”==" 和equals结果一样
String池:
String是不可改变的,为了进步效率Java引用了字符串池的概念,例如new String(“abc”);
首先会在String池中创建一个对象“abc”由于有NEW的存在所以会分配地址空间,复制String池的内容。
当出现的String对象在String池中不存在时即在String池中创建该对象
String对象的理解:
如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,
并存放在String缓冲池内。
如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,
而直接返回已存在的String对象的引用。
Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,
池中没有就在池中创建一个。

10.安装jdk后没有配置环境变量也能运行java
即使没有配置环境变量,只要你在执行java命令的时候指定java命令所在目录就能正常执行,
配置环境变量只是方便你无论在哪个目录下都能找到命令程序执行而已。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!