Java语言程序设计 选填题知识点总结
第一章
- javac.exe是JDK提供的编译器
- public static void main (String args[])是Java应用程序主类中正确的main方法
- Java源文件是由若干个书写形式互相独立的类组成的
- Java语言的名字是印度尼西亚一个盛产咖啡的岛名
- Java源文件中可以有一个或多个类
- Java源文件的扩展名是.java
- 如果源文件中有多个类,那么至少有一个类必须是public类 (错)如果源文件中有多个类,这些类可以都不是public类
- JDK的全称是Java Development Kit
- 源文件中如果有多个类,那么至多有一个类可以是public类
- 如果一个源文件中有public类,那么源文件名必须和这个public类的类名相同(即类名.java)
- Java语言是1995年5月Sun公司推出的编程语言
- 开发Java应用程序的基本步骤是:编写源文件->编译源文件->运行程序
- 编译java源文件时,将根据java源文件中类的个数产生相应数量的字节码文件
第二章
- Java声明数组时,不能在声明时就定义数组长度
- int [] a,b[];是声明了1个int型一维数组a和1个int型二维数组b
- 1e2和2.05E2都是double型常量
- Boolean yes = false;是正确的boolean变量声明
- System不是Java关键字,只是java.lang包里提供了这个类,我们也可以自己创建类名为System
- char型字符在Unicode表中的位置范围是0至65535
- _class可以作为标识符
- 对于int a = new int[3];a.length的值是3
- good-class不能作为标识符是因为出现了非法符号,标识符只能由标识符由26个英文字符大小写(a~zA~Z)、数字(0~9)、下划线(_)和美元符号($)组成,同时不能以数字开头,区分大小写,不可以是关键字和保留字,标识符长度不限
- float变量的声明中,float foo = 1;是对的,因为整数类型的精度小于浮点类型,不会造成赋值后精度缺失,而float foo = 1.0;是错的,因为没有注明类型的浮点数都默认为double类型,而double类型的精度要高于float类型,赋值后会导致精度丢失,因此不允许
- char类型数据的声明需要使用单引号,例如char c = ‘c’,也可以使用整数赋值,支持十进制、八进制和十六进制声明,范围是0~65535。也可以使用unicode编码声明,例如char c = ‘\u数字’,当然编码值需要正确,其中的数字是十六进制数。还有一些特殊的声明也可算作正确,如’\\’,’\n’,’\t’
- Java中int,byte,short,long类型的数组的默认值是0,float和double数组默认0.0,char类型数组默认值是空格,boolean类型数组的默认值为false
- 对于int a[][] = new int [2][9];a.length = 2,a[0].length = 9,a[1].length = 9
- byte类型的数据范围是-128~127
第三章
- 精度从‘低’到‘高’的排列顺序是byte->short->char->int->long->float->double
- 在java中计算算术表达式使用下列精度运算规则:
- 如果表达式中的最高精度高于int,则表达式结果的精度就是最高精度,例如5.0/2+10,其中5.0是double型数据,故运算结果12.5也为double型数据
- 如果表达式中的最高精度低于int型,那么就按int精度进行运算。而同时java允许把不超出byte、short和char的取值范围的常量算术表达式的值覆给byte、short和char型变量。例如byte x = (byte)30+‘a’;这刚好是127,可以赋值。其次为什么要对常量标红呢,如果计算表达式中有变量,则无法进行赋值,例如byte x = 97+1是对的,但byte x = 97+y是不对的,即使byte y = 1,因为编译器不会检查表达式中变量y的值,只会检查y的类型,并认为97+y此时是int型精度,赋给byte会导致精度损失,因此编译失败;需要注意的是,对于 +=,*=,/=,-= 缩略运算符,编译器自动将赋值符号右侧的表达式的值转换成左边变量所要求的类型,例如b += 120等同于b =(byet)(b+120)
- switch语句中不一定要有default选项
- 关系运算符和逻辑运算符的运算结果都是boolean型数据,关系运算符即“大于小于等于”,逻辑运算符即“或且非”
- while(表达式2)...语句和for(表达式1;表达式2;表达式3)...语句中的“表达式2”的值必须是boolean型数据,很好理解,都是用来判断是否符合循环条件的语句
- 12 = 12是非法的表达式,因为“=”实际上是赋值表达式
第四章
- Java应用程序由若干个类所构成,这些类可以在一个源文件中,也可以分布在若干个源文件中,其中必须有一个源文件含有主类
- 局部变量没有默认值,在Java中,成员变量会有默认的初始值,而局部变量不同,局部变量没有默认值,如果试图使用一个局部变量的值,而这个局部变量尚未初始化,就会产生编译错误
- 构造方法不定义返回类型,连void也不需要写
- 如果没有编写任何构造方法,则编译器会默认一个无参构造方法,如果写了构造方法,则编译器不再提供默认构造方法
- 构造方法的重载方法,方法名称相同,参数类型不同
- this不能出现在static方法中,也叫静态方法,因为一个类的static方法会在类的任何一个对象之前初始化,而this是当前对象,因此在static方法初始化时,this所对应的对象还未构造,自然static方法无法处理this的,因此this不能出现在static方法中
- 类的实例方法无法通过类名调用,因为类的实例方法在类初始化的过程中,没有被分配入口地址,只有在该类创建对象以后,才会分配入口地址,所以实例对象只能通过对象调用,而类方法在类初始化时就分配了入口地址,因此可以通过类名调用,有static修饰的是类方法,没有的是实例方法
- 构造方法的访问权限可以是public、protected、private或友好的
- 方法中声明的局部变量不可以使用访问修饰符
- this可以出现在实例方法和构造方法中
- 成员变量的名字可以和局部变量的相同,方法编译时局部变量会隐藏成员变量。
- static方法可以重载,不能被重写
- 类所声明的变量被称为对象
- 方法的参数名不能与方法内的局部变量名相同
- 类体中成员变量的声明和方法的定义可以交叉进行
- 进行重载时,参数类型不能相同
- 类体中定义的非构造方法是为了体现对象的行为
第五章
- Java中子类不会继承父类的构造方法,如果子类中没有声明构造方法,那么在子类声明对象变量时,会默认调用父类的无参构造方法
- 抽象(abstract)类的子类也可以是抽象类
- 子类继承的方法只能操作子类继承和隐藏的成员变量
- 不可以同时用final和abstract修饰同一个方法
- 抽象类中的非抽象方法可以使用final修饰
- 不允许使用static修饰abstract方法
- Java中继承关系是可传递的
- Java继承中可以提高父类方法的访问权限,但是不能降低父类方法的访问权限
- 对父类方法进行重载的时候,必须更改参数类型或参数个数或参数顺序
- 关于重写方法:1.重写方法必须和被重写方法具有相同的参数列表,返回类型必须和被重写方法的返回类型相同或者是返回类型的子类型。2.重写方法的访问控制修饰符不能比被重写方法更严格(比如一个在父类中声明为public的方法重写成一个protected的方法)。3.只有实例方法才能被重写。
- 如果父类中没有无参构造方法,那么需要在子类的构造方法中以super()方法调用父类的构造方法
- 子类中想使用被子类隐藏的实例成员变量或实例方法就需要使用关键字super
- 不可以使用final修饰构造方法
- 如果在子类的构造方法中,没有显示地写出super关键字来调用父类的某个构造方法,那么编译器默认地有:super()调用父类的无参构造方法,如果父类没有无参构造方法,则会出现编译错误,即第11条
- 如果一个类中的所有构造方法的访问权限都是private,那么这个类不能有子类,因为一个类的private方法不能在其他类中被使用,但子类的构造方法中一定会调用父类的某个构造方法
- 子类在方法重写时,不可以把父类的实例方法重写为类(static)方法,也不可以把父类的类方法重写为实例方法
- abstract类中可以有非abstract方法,但非abstract类中不能有abstract方法,即一个类中如果有abstract方法,那么这个类必定是abstract类
- 一个类只能有一个父类,但是可以有多个子类
- Java.lang包中的object类是所有其他类的祖先类
- 如果子类和父类不在同一个包中,子类不继承父类的友好成员
- 所谓子类继承父类的成员变量作为自己的一个成员变量,就好像它们在子类中直接声明一样,可以被子类中自己定义的任何实例方法操作。
- 多态性就是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为(多:子类数目,态:父类某个方法)
第六章
- 允许接口中只有一个抽象方法
- 一个抽象类实现接口后,不需要重写接口中的所有方法,其他未重写的方法可以由这个抽象类的子类进行重写
- 一个非抽象类实现接口后,需要重写接口中的所有方法
- 一个类只能继承一个父类,但可以实现多个接口
- 类实现接口中方法是必须加上public,因为接口中方法权限为public,类中默认访问权限是default,小于public,而类重写接口方法时,只能提供权限,不能降低权限,因此要加上public
- 接口中不能声明变量,但可以有常量
- Java8之后,接口中也能定义非抽象的不加default修饰的方法
- Java8之后,接口中可以定义private方法
- 关于7,8点的解释
- 接口中声明常量时一定要给初值
- 可以在接口中只声明常量,不定义任何方法
- 一个源文件中既可以定义接口,也可以定义类
- 接口中可以有abstract方法或default修饰的带方法体的方法(JDK8版本)(对,不用理为啥对)
- 接口中int x= 10等价于public static final int x =10,即默认是常量
- 接口中不能定义非abstract方法()
(没有给定jdk版本,jdk8之后可以有static方法,jdk9之后可以有private方法)青览题库答案是“否”,考试如果遇到选择“是”
- 可以使用接口名直接访问接口中的常量
- 不能用final修饰接口,因为final意味着接口中的方法不再更改,而接口中的方法是需要实现接口的类去重写的,即对方法进行修改
- 接口中的方法的访问权限一定都是public()
jdk9以后有private方法,清览答案是对,考试遇到选错
- 子接口将继承父接口中的全部方法和常量()
子接口不能继承private方法,清览答案提供的是对,考试遇到选错
- 抽象类中既可以有常量也可以有变量
- 把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法
- 接口变量中可以存放实现该接口的类的实例的引用(对象的引用)
第七章
- 一个方法使用throws关键字声明要产生的若干个异常,使用throw关键字抛出异常对象
- 非匿名内部类也可以实现接口
- 不能用匿名类声明对象,但却可以直接用匿名类创建一个对象
- 匿名子类(和子类有关的匿名类)可以继承父类的方法也可以重写父类的方法
- 匿名子类(和子类有关的匿名类)的类体中不可以声明static成员变量和static方法
- 接口匿名类(和接口有关的匿名类)的类体中不可以声明static成员变量和static方法
- 匿名类一定是内部类
- try~catch语句可以由几个catch组成,分别处理发生的相应异常
- 匿名类不能是抽象类
- 匿名类有构造方法
- 匿名类一定是final类,所以匿名类一定不是抽象类
- 和类有关的匿名类一定是该类的一个非抽象子类
第八章
- String类是final类,不可以有子类
- String类在java.lang包中
- int m = Short.parseShort(“567”)正确,将字符串转为对应的short型数据。
- int m = Float.parseFloat(“567”)错误,将字符串转为对应float型数据,但int型数据无法接收float型数据,因此错误
- float m = Float.parseDouble(“2.9”)错误,首先float不能接收double类型数据,其次调用parseDouble方法需要用Double调用
- new Date(1000)对象含有的时间是距1970年1月1日相差1000毫秒的时间
- “\\hello\n”是正确的字符串,而“\hello”是错误的字符串,因为“\”后应该是转义字符,可以写“\\”,“\h”不是正确的转义字符,因此出错
- “9dog”.matches(“\\ddog”)的值是true,\d用于匹配数字
- “12hello567”.replaceAll(“[123456789]+”,“@”)返回的字符串是“@hello@”
- Random对象的nextInt(int n)方法随机返回[0,n)之间的一个整数
- "RedBird".indexOf("Bird")的值是3,从零开始数
- 表达式“\t\nABC”.length()的值是5,一个转义字符记一个长度
- “Bird”.compareTo(“Bird fly”)的值是-4,“Bird”.compareTo(“Bird”)的值是0,“Bird”.compareTo(“Bir”)的值是1,具体的计算方式暂时不用在意,关注正负即可
- "I love this game".contains("love")的值是true
- Integer.parseInt("12.9");会触发NumberFormatException异常
- 表达式"89762.34".startsWith("89")的值是true
- 表达式"89762.34".endsWith("34")的值是true
第九章
- 一个应用程序可以有多个窗口
- JFrame创建的窗口默认是不可见的,需要调用setVisible(boolean b)设置窗口的可见性
- 不可以向JFrame窗口中添加JFrame窗口
- 窗口可以调用setTitle(String s)方法设置窗口的标题
- 对于有监视器的JTextField文本框,如果该文本框处于活动状态(有输入焦点)时,用户即使不输入文本,只要按回车键也可以触发ActionEvent事件
- 监视KeyEvent事件的监视器必须实现KeyListener接口
- 监视WindowEvent事件的监视器,必须实现WindowListener接口
- 使用BorderLayout布局的容器被划分为5个区域
- Jpanel的默认布局是FlowLayout布局
- JDialog的默认布局是BorderLayout布局
- 使用FlowLayout布局的容器最多可以添加的组件数量由窗口和组件的大小决定,如果一行放不下则会移动到下一行
- 没有实现ActionListener接口的类的实例不能被注册为监视器
- javax.swing包中JComponent类是java.awt包中Container类的子类
- java.awt包中的Container类是java.awt.Component类的子类,javax.swing包中JComponent类又继承自Container类。因此,JComponent类是AWT和Swing的联系之一
- Container类提供了一个public方法:add(Component com),一个容器可以调用这个方法将组件com添加到该容器中
- Java提供的JFrame类的实例是一个底层容器,即通常所称的窗口
- 窗口默认地被系统添加到显示器屏幕上,因此不允许将一个窗口添加到另一个容器中
- 容器不可以添加JFrame实例到其中,因为JFrame已经是底层容器了,不能把一个大容器装进小容器里
- JTextField文本框允许用户在文本框中输入单行文本
- JTextArea文本域允许用户在文本域中输入多行文本
- JFrame类的对象的默认布局是BorderLayout布局
- JTextField可以触发ActionEvent事件
- addXXXListener(XXXListener listener) 将某个对象注册为自己的监视器,方法中的参数是一个接口,listener可以引用任何实现了该接口的类所创建的对象,当事件源发生事件时,接口listener立刻回调被类实现的接口中的某个方法
- MVC是: 模型(model) 用于存储数据的对象。 视图(view) 为模型提供数据显示的对象。 控制器(controller) 处理用户的交互操作,对于用户的操作作出响应,让模型和视图进行必要的交互
- 一个容器可以调用setLayout(LayoutManager mgr)方法更改自己的布局
- 能触发ActionEvent事件的组件调用addActionListener(ActionListener listen)方法为自己注册一个监视器
第十章
- BufferedWrite流可以指向FileWrite流(字符输出流),BufferedRead流可以指向FlieRead流(字符输入流)
- 创建File对象不会发生异常,创建新文件时可能发生IOException异常
- RandomAccessFile流指向文件时,不会刷新文件,插入内容时才会刷新该文件
- File类在java.io包中
- 输入流的指向称为流的源,输出流的指向称为流的目的地
- 程序如果需要读取程序“外部”的数据,可以创建指向外部的输入流,例如,FileInputStream输入流、FileReader输入流;程序如果需要将程序中数据,写入到程序“外部”,可以创建指向外部的输出流,例如,FileOutputStream输出流、FileWrite输出流,其中FileInputStream流和FileOutputStream流都是按字节(byte)操作数据的,FileReader流和FileWrite流都是按字符(char)操作数据的
- 创建File对象f时:File f = new File("perrty.txt"),要求磁盘上不必有真实有perrty.txt文件,如果没有系统会创建的
- File类的long length()返回文件的长度(单位是字节)
- FileOutputStream流顺序地写文件,只要不关闭流,每次调用write方法就顺序地向目的地写入内容,直到流被关闭
- FileInputStream流顺序地读取文件,只要不关闭流,每次调用read方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭
- FileInputStream流的int read(byte b[]) 方法从源中试图读取b.length个字节到字节数组b中,返回实际读取的字节数目。如果到达文件的末尾,则返回-1
- FileNotFoundException类是IOException类的子类
- 创建FileInputStream 对象,即文件字节输入流可能触发FileNotFoundException异常
第十一章
- Win10操作系统,然后键入:net start mysql(Win7 键 入mysqld),回车确认,启动MySQL数据库服务器
- 在MySQL安装目录的bin子目录下键入mysql 启动MySQL数据库服务器(错)亲测不行,需要键入mysql.exe
- MySQL服务器默认占用的端口是3306
- MySQL服务器的默认用户是root,对Win10 系统,root的初始密码是随机的,对于Win7系统,root 初始是无密码
- Navicat for MySQL是一款MySQL客户端管理工具
- 对于 MySQL8.0,Class.forName("com.mysql.cj.jdbc.Driver")是加载的JDBC-MySQL数据库驱动
- ResultSet对象和数据库连接对象(Connection对象)实现了紧密的绑定,一旦连接对象被关闭,ResultSet对象中的数据立刻消失
- ResultSet对象一次只能看到一个数据行,使用next()方法移到下一个数据行,next()方法最初的查询位置,即游标位置,位于第一行的前面
- ResultSet对象其实就是结果集,用于存放查询语句所返回的结果的一种对象
- SQL语句:select * from mess where height>1.6 and height<=1.8 是查询mess表中字段(列)height值在1.6和1.8之间的记录(记录的各个列值都要)
- SQL语句 select * from mess where name like '%林%' 是查询mess表中字段(列)name值包含有“林”的记录(记录的各个列值都要)
- SQL语句 update mess set height =1.77 where name='张三' 是将mess表中name字段(列)值是张三的记录(行)的height的值更新为1.77
- SQL语句 insert into mess values ('R1008','将林','2010-12-20',1.66),('R1008','秦仁','2010-12-20',1.66) 是向表mess里添加了两条记录(两行)
- SQL语句delete from mess where number = 'R1002' 是删除了mess表中字段number值是R1002的记录
- 事务由一组SQL语句组成,所谓事务处理是指:应用程序保证事务中的SQL语句要么全部都执行,要么一个都不执行
- PreparedStatement对象被习惯地称作预处理语句对象
- 程序使用PreparedStatement对象不仅减轻了数据库的负担,而且也提高了访问数据库的速度
- 连接对象调用prepareStatement(String sql)方法对参数sql指定的SQL语句进行预编译处理,并返回一个PreparedStatement对象
- 结果集rs执行rs.getString(1)按字符串返回结果集当前行第1列的值
- "jdbc:mysql://localhost:3306/students?useSSL=true"中的"students"是用户数据库的名字
- JDBC-MySQL数据库驱动:"com.mysql.cj.jdbc.Driver"
- JDBC-SQLServer数据库驱动:"com.microsoft.sqlserver.jdbc.SQLServerDriver"
- JDBC-Oracle数据库驱动:"oracle.jdbc.driver.oracleDriver"
- JDBC-Derby数据库驱动:"org.apache.derby.jdbc.EmbeddedDriver"
- 加载对应数据库驱动的代码格式是:try{Class.forName(“驱动”);} catch(Exception e){},如果没有进行捕获异常,则代码报错,如例题18
- sql=con.createStatement();也需要捕获异常,否则会报错,如果在写数据库相关代码题时,找不到语句本身的错误,那就留意一下是不是没有进行try..catch捕获异常
第十二章
- 线程新建后,需要调用start方法,才有机会获得CPU资源
- 如果两个线程需要调用同一个同步方法,那么一个线程调用该同步方法时,另一个线程必须等待
- 目标对象中的run方法可能不启动多次
- 默认情况下,所有线程的优先级都是5级
- 线程不是进程,但其行为很像进程,线程是比进程更小的执行单位
- 这个程序段中共有两个线程,一个是main,即主线程,一个是thread,通过start方法有机会获得cpu资源,是一个thread线程
- 这个程序段中只有主线程,虽然创建了thread对象,但是没有通过调用start方法,jvm会认为只有一个主线程
- 一个进程在其执行过程中,可以产生多个线程
- Java应用程序总是从主类的main方法开始执行,JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称为“主线程”(main线程),该线程负责执行main方法
- 线程在它的一个完整的生命周期中通常要经历如下的四种状态:1.新建, 2.运行 ,3中断,4.死亡
- 可以使用Thread类或其子类创建(新建)线程
- 线程不调用start方法,JVM就不会把它当作一个线程来对待,仅仅当作一个普通的对象而已
- 线程调用start方法将启动线程,使之从新建状态进入就绪队列排队. 一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了
- 线程处于“新建”状态时(在调用start方法之前),线程调用isAlive()方法返回的值是false,进入运行状态的线程,调用isAlive方法后返回的值是true
- currentThread()方法是Thread类中的static方法,该方法返回当前正在使用CPU资源的线程
- 线程调用interrupt()方法将使得处于speep方法或wait方法中断的线程触发InterruptedException异常
- 当一个线程调用synchronized方法时,其他线程想调用这个synchronized方法时就必须等待,直到线程A调用完该synchronized方法
- wait()、notify()和notifyAll()都是Object类中的final方法, 被所有的类继承、且不允许重写的方法
- 一个线程在执行同步方法时,如果执行wait()方法,使本线程进入中断,就允许其它线程使用这个同步方法,而由sleep方法进入中断的线程不允许其他线程使用这个同步方法
- 一个因执行wait方法进入中断状态的线程,需要其他线程执行notify()或notifyAll()通知它结束中断状态
- 线程在执行完run()方法之前,如果再次让线程执行start方法, 就会发生ILLegalThreadStateException 异常
- javax.swing.Timer类称为计时器线程,计时器的监视器必须是组件类的子类的实例,否则计时器无法启动
- Java中的线程可以共享数据
- 线程调用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行,这只是意味着该线程可被JVM的线程调度程序调度而不是意味着它可以立即运行
- run()方法是Runnable接口中唯一的方法,sleep,start,interrput都不是Runnable接口中的方法