Java基础知识——面向对象、数组、常用类,java基础知识
Java基础知识——面向对象、数组、常用类,java基础知识
Java300集第一季总结
第一章 初识Java
1、 Java语言的编译型和解释型?/ Java程序运行过程
编译:javac把Java源文件编译为class文件——字节码;
运行:java运行class文件;java是启动JVM
JVM解释字节码或把运行频率高的部分直接编译为机器指令以提高性能。
所以,Java即是编译也是解释型。
2、为什么采用JAVA_HOME的方式配置环境变量较好?
a) JAVA_HOME:JDK的安装目录
b) path: .;%JAVA_HOME%\bin;
JAVA_HOME是中间的变量,是为了配置其他PATH的时候 不用再一次次地输入JDK的一大串地址。
3、JDK、JRE、和JVM
Java Development Kit/ Java Runtime Environment/ Java Virtual Machine
JRE 包含 JVM,JDK包含JRE和其他工具。
第二章 数据类型和运算符
1、标识符可以以什么开头?
字母(Unicode广义,所以可以是任何文字,汉字日文等)、下划线、$
2、 基本数据类型
a) 数字 整形常数默认是int型。
整数:byte,1字节,【-128,127】;short,2字节;int,4字节,大约正负21亿;long,8字节
浮点数:float,4字节;double 8字节
b) 字符 char 2字节
c) 布尔 1位
浮点数不能用于比较,但两个没有小数的浮点数,可以比较,可以相等。
Java.math下面两个类:BigInteger和BigDecimal,可以处理任意长度的数值。BigInteger实现任意精度的整数运算;BigDecimal实现任意精度的浮点运算。
3、引用类型:4字节
引用对象地址,固定采用4字节来存储。
a)数组。数组也是对象。
b)对象
c)接口
4、类型的自动提升和转化
自动类型转化:容量小的转成容量大的
强制类型转换:记住实践时转整个结果值
5、&& || 短路运算。
即如果前半部分不满足,后半部分不执行,注意符号两边必须是boolean结果。
& 和 |可以做位运算,也可以代替&&和||,不短路。
6、命名规则——驼峰?
包名:所有字母都小写。xxxyyyzzz
类名和接口名:单词首字母大写。XxxYyyZzz
变量和函数名:第一个首字母小写,第二个单词开始首字母大写。xxxYyyZzz
常量名:所有字母大写,下划线连接。XXX_YYY_ZZZ
第三章 控制语句和数组
1、 如何生成随机数?
Math.random()随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值。例如:var a:Number=Math.random()*2+1,设置一个随机1到3的变量。
2、 switch多值选择的表达式类型?
int或自动转为int的类型:char/short/byte、枚举
JDK7.0可以用字符串。
3、 Java中参数传递的类型是什么?
Java有且仅有一种参数传递机制,按值传递。
按值传递意味着当将一个参数传递给函数时,函数接收的是原始值的一个副本,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,如果函数修改了该参数,调用代码中的原始值也随之改变。
Java 按引用传递对象并不意味着 Java按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。
4、 当需要先循环一次再判断的时候,记得还有do-while可以用。
5、 对Java来说唯一用到标签的地方是在循环语句之前。不能频繁使用,注重代码可读性。
outer: for (int i = 101; i < 150; i ++) {
for (int j = 2; j < i / 2; j++) {
if (i % j == 0)
continue outer;
}
System.out.print(i+ " ");
}
6、 形参和实参有什么区别?
形参出现在函数定义中,只有在函数内部有效。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参。
7、 数组的初始化和注意事项
定义和概念:数组是引用类型,其中每个元素相当于成员变量,默认值跟成员变量的规则一样。数组本身就是对象,因此无论什么类型的数据,数组对象本身就在堆中。
可以这样初始化:
Dog[] dogs2 = {
new Dog(“旺财”,1),
new Dog(“大黄”,2) //注意最后一个元素后没有“,”
};
数组在声明的时候不指定大小。
注意事项:
数组的长度一旦被初始化不能改变,所以注意不能在循环中增删数组的元素。
第四章 面向对象基础
1、 类中的关键字
this:
在普通方法中,调用本方法的对象
在构造方法中,代表正要初始化的对象
还可以在构造方法中调用其他构造器
super:
直接父类对象的引用,访问父类中被子类覆盖的方法或属性。
static:
修饰的是静态变量、静态方法,通过类名即可调用。
实际存储于方法区中。
package:必须位于非注释性的第一行
import:引入外部类。import static 导入类的静态属性。
final:
修饰变量:为常量
修饰方法:不能被重写,可以被重载
修饰类:不能被继承
·String类是final类,所以String类不能被继承。
·类中代码放在方法块中共享,所以,调用方法时总要隐含传递this和super,以区分不同对象。
2、 系统一定会给添加无参构造方法吗?
不一定。当没有定义构造方法时,才会自动添加。
3、 构造方法有没有返回值?能不能有return语句?
没有返回值。可以有return语句,可用于提前结束代码。
4、 构造方法中的this和super用法
this可以在一个构造器中调用此类的另一个构造器。this和super在构造器中必须位于第一句。两者都是初始化对象,因此不能同时存在。另外,对象的初始化必须先于其他操作,所以位于第一句。
super调用直接父类的构造方法。如果没有显式调用,则隐含调用无参super(),此时父类必须有无参构造器,否则报错。super调用顺序:由顶向下,从最上层父类开始初始化。
5、 static代码块(静态代码块)和main方法哪个先被执行?
static方法块。静态代码块和main方法处在同一类中。加载类的时候先执行静态代码块,每个代码块只被执行一次。
6、 方法的重载:Overload
两同:同一个类、同一个方法名
三不同:参数列表不同。参数的类型、个数、顺序不同
只有返回值不同,构成重载吗? 不构成
7、 变量分类和考点
局部变量:从属于方法或语句块。使用之前一定初始化。
成员变量:定义在类里面,方法外面,从属于对象。如果没有手动初始化,系统自动初始化。规则:数字 0、0.0;布尔 false;char :\u0000;引用类型 null。
静态变量:从属于类。系统自动初始化,同成员变量。
8、 面向对象的三大特征
封装。
继承:Java类只有单继承;接口可以多继承。
方法重写:
= 方法名一致
》= 子类权限修饰符可以大于等于父类的
<= 子类的返回值类型小于等于父类;子类声明异常类型小于等于父类。
Object类是所有类的根基类,常用方法:
toString
equals、hashcode
wait、notify、notifyAll等
多态三个必要条件:继承、方法重写、父类引用指向子类对象。
9、 加入父类有main方法,子类能不能继承?
能。子类继承父类,得到父类的全部属性和方法,构造方法除外。
10、内存管理
栈:
1.每个线程私有,不能实现线程间的共享
2.局部变量放置于栈中。
3.栈是由系统自动分配的连续空间,速度快,后进先出。
堆:
1.放置new出来的对象。
2.堆是一个不连续的内存空间,分配灵活,速度慢。
3. 堆,包括方法区,被所有线程共享(每个对象都有锁)。
方法区(也是堆):
1.存放程序中永远不变或唯一的内容:类代码信息、静态变量、字符串常量
11、 垃圾回收器(GC Garbage Collection)
1. 程序员不能调用GC,但可以通过System.gc()建议回收。
2. finalize方法(属于Object类),释放对象资源。
12、 抽象类中可以有普通方法吗?可以有构造方法吗?
1. 包含抽象方法的类,一定是抽象类
2. 抽象类不能被new来实例化。
3. 抽象类还可以包含:普通方法、成员变量、构造方法
抽象方法必须被子类重写.
13、 多态的转型
instanceof 判断是否是实例对象,如果是,用类型强转。
·为什么需要强制转换类型?
引用变量只能调用它编译类型的方法,不能调用它运行类型的方法。
把子类对象当作基类对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)
14、接口中只能定义常量和抽象方法吗?
是的。接口中定义的常量,默认是public static final,定义的方法,无论是否写明都是public abstract。
15、接口可以被new吗?
不可以,接口是特殊的抽象类。虽然在匿名内部类中可以new 接口,eg. new ActionListener(){},但其本质还是在类上实现接口。
第五章 异常机制
1、如果catch两个异常,一个是父类,一个是子类,这两个异常的顺序如何?
子类放前面,父类放后面。不然,子类抛出的异常对象属于父类,先找到父类的catch块并运行,这样就永远不会运行到子类的catch。
2、finally里面一般放什么代码?
finally语句块:不管是否发生了异常,都必须要执行。
通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。
3、 Error和Exception的区别和联系?
Error类描述Java运行时系统内部错误和资源耗尽错误,表明JVM已经处于不可恢复的崩溃状态中。在编程中不处理这类错误。
·Unchecked Exception 编译器不检查。
·Checked Exception 编译器检查,必须手动捕获(加try/catch块)
Runtime Exception(unchecked Exception)
这类异常通常是由编程错误导致的,所以并不要求必须使用异常处理机制来处理。
4、异常处理之二——throws
throws:“谁”调我,“谁”处理
把throws扔到了main函数上,就是抛给JRE处理
第六章 常用类
1、为什么需要包装类?包装类的作用是?
有些操作需要把基本数据类型当作对象处理,例如Map的put()方法,需要传入的参数是对象;包装类使基本数据类型通过成员函数更方便地执行一些操作。
2、将字符串“123”转换成基本类型数字的方式有哪些?
int num = Integer.parseInt(“str”);
int num1 = Integer.valueOf(“str”);
int num2 = Integer.decode(str);
3、 什么是自动装箱和自动拆箱?
Integer i = 100; //相当于Integer i = new Integer(100); 自动装箱
int a = new Integer(20); //自动拆箱
4、 String的常用方法有哪些?trim()方法有什么作用?
· 记住一点:String使用private final char value[]来实现字符串的存储。String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象。也因为如此,常量池中一定不存在两个相同的字符串。
· String s = new String(“abc”);
new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址。
例子:
· String s3 = “abc” + “def”;
String s4 = “abcdef”;
System.out.println( s3 == s4);
结果是true。编译器优化:在程序编译期,JVM就将常量字符串的”+”连接优化为连接后的值,s3在编译期就被解析为 abcdef。
//编译期无法确定
String s3 = "abc" + new String( "def");
String s4 = "abcdef";
System.out.println( s3 == s4); //false
String str1="abc";
String str2="def";
String str3=str1+str2;
System.out.println(str3=="abcdef"); //false
引用值在编译期无法确定,无法被优化。
注意:+运算符会在堆中建立来两个String对象,这两个对象的值分别是”abc”和”def”,也就是说从字符串池中复制这两个值,然后在堆中创建两个对象,然后再建立对象str3,然后将”abcdef”的堆地址赋给str3。
· + 的实现
String c = “xx” + “yy ” + a + “zz” + “mm” + b; 实质上的实现过程是: String c = new StringBuilder(“xxyy”).append(a).append(“zz”).
append(“mm”).append(b).toString();
n boolean equalsIgnoreCase(String other)
如果字符串与other相等(忽略大小写),则返回true
n int indexOf(String str) lastIndexOf()
n int indexOf(String str,int fromIndex)
返回与str匹配的第一个字串的开始位置,该位置从0或fromIndex开始计算,如果原始串中不存在str,返回-1.
n String replace(char oldChar,char newChar)
返回一个新串,它是通过用 newChar 替换此字符串中出现的所有oldChar而生成的
n boolean startsWith(String prefix)
如果字符串以prefix开始,则返回true
n boolean endsWith(String prefix)
如果字符串以prefix结尾,则返回true
n String substring(int beginIndex)
n String substring(int beginIndex,int endIndex)
返回一个新字符串,该串包含从原始字符串beginIndex到串尾或endIndex-1的所以字符
n String toLowerCase()
返回一个新字符串,该串将原始字符串中的所有大写字母改成小写字母
n String toUpperCase()
返回一个新字符串,该串将原始字符串中的所有小写字母改成大写字母
n String trim()
返回一个新字符串,该串删除了原始字符串头部和尾部的空格
参考:http://www.cnblogs.com/xiaoxi/p/6036701.html
5、String、StringBuffer和StringBuilder的区别是?
a.可变与不可变:
String是不可变字符串对象,StringBuilder和StringBuffer是可变字符串对象
b. 是否线程安全:
String中的对象是不可变的,也就可以理解为常量,显然线程安全。StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是非线程安全的。
c. 执行效率:
StringBuilder > StringBuffer > String .当然这个是相对的。比如String str = “hello”+ “world”的效率就比 StringBuilder st = new StringBuilder().append
(“hello”).append(“world”)要高。
当字符串相加操作或者改动较少的情况下,建议使用 String str=”hello”这种形式;当字符串相加操作较多的情况下,建议使用StringBuilder,如果采用了多线程,则使用StringBuffer。
StringBuilder 对象,当数组元素达到定义的长度时。创建新数组,len = 原长度*2+2;然后把老数组里的数据复制到新数组,通过这样方式实现数组的扩容。
StringBuilder ab = new StringBuilder("abcdefghijk");
ab.delete(3, 5).delete(3, 5);
删除方法是[start end)这样的规则,包括头不包括尾。
6、Java中时间类是如何表示的?其常见用法?
Date类的核心是从1970年1月1日0点以来的毫秒数,比较的时候也是比较这个long毫秒数。
//Date转换成格式正确的String
DateFormat df = new SimpleDateFormat("yyyy-MM-dd,本年第w周,本月第W周,hh:mm:ss");
Date d1 = new Date();
String str1 = df.format(d1);
System.out.println(str1);
//按日期格式的String转换成date
String str2 = "2017-08-23,本年第34周,本月第4周,11:15:53";
Date d2 = df.parse(str2);
System.out.println(d2);
控制台:2017-08-23,本年第34周,本月第4周,11:18:00
Wed Aug 23 11:15:53 CST 2017
·Calendar类是在时刻和时期之间做转化
7、File类的常见用法有哪些?
创建File对象:
File f = new File(“C:/Users/lenovo/Desktop/测试文本.txt”);
File f2 = new File(“C:\Users\lenovo\Desktop”);
File f3 = new File(f2,”测试文本.txt”);
File.separator,指目录间的分隔符。
·通过File对象可以访问文件的属性。
public boolean canRead() public boolean canWrite()
public boolean exists() public boolean isDirectory()//是否是目录
public boolean isFile() public boolean isHidden()
public long lastModified() public long length()
public String getName() public String getPath()
·通过File对象创建空文件或目录(在该对象所指的文件或目录不存在的情况下)。
public boolean createNewFile()throws IOException
public boolean delete()
public boolean mkdir()//只能创建一个,如果前面的父目录不存在就不创建
public boolean mkdirs()//创建多个目录
·创建之前不存在的文件/文件夹
File f = new File("C:/Users/lenovo/Desktop/test.txt");
try {
f.createNewFile();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
File f1 = new File("C:/Users/lenovo/Desktop/asdf/gfn/iuol/test");
f1.mkdir(); //只能创建一层文件夹
f1.mkdirs(); //创建目录上的所有文件夹
附注
1、eclipse快捷键
a) 命令提示:alt+/ (main, syso)
b) 文件选择:
i. Shift+ 上下左右,home,end键
ii. Ctrl+Shift+ 左右 单词选中
c) 删除一行:ctrl+d
d) 复制一行到下面或上面: ctrl+alt+上下
e) 换行:alt+上下
f) 编辑文件切换:ctrl+F6,或者ctrl+E,上下
g) 视图切换:ctrl+F7
h) 查看错误建议:ctrl+1
i) 导入类:ctrl+shift+o
j) 重命名:alt+shift+r
2、 import java.util.*;//导入该包下所有的类。会降低编译速度,但不会降低运行速度。
3、Java中的常量池,分为静态常量池和运行时常量池。
静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。
运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。
4、引用变量与对象
A aa;
这个语句声明一个类A的引用变量aa[我们常常称之为句柄],而对象一般通过new
创建。所以aa仅仅是一个引用变量,它不是对象。
5、枚举
枚举实质也是类,每个枚举的成员实质是此类的实例,枚举成员默认public static final
相关文章
- 暂无相关文章
用户点评