没有章节,没有分类,碰到啥总结啥,路漫漫其修远兮
1、Javac和java命令
Javac是编译,java是执行。(javac命令需要在path中配置java环境变量,classpath是类查找路径)
2、三种循环结构的区别
do…while循环至少会执行一次循环体。
for循环和while循环只有在条件成立的时候才会去执行循环体
eg:问以下程序循环次数
int x=37;
int y=3;
while(y<=x){
y*=y;
}
or:打印各种三角形
3、分支结构
If(表达式){}else if{}else{}
switch(表达式) {
case 值1:语句体1;
break;
case 值2:语句体2;
break;
…
default:语句体n+1;
break;
}
三元表达式:表达式?为true的结果:为false的结果
注意:switch语句中一个case后面若没有及时break,可能会出现case穿透的现象。
eg:
final int A = 4;
int a = 2;
switch (a * 2) {
case A:System.out.print(a);
default:System.out.println(a * 2);
}
这个的输出是什么呢?
4、java程序默认都引入一个包?
Java.lang包, 它提供了java中的基础类。包括基本Object类、Class类、String类、基本类型的包装类、基本的数学类等等最基本的类。不需要显式的import就能使用
5、java默认的处理异常的方式
终止程序,显式异常
在Java中异常被当做对象来处理,根类是java.lang.Throwable类,java中异常分为两类:error:一般发生这种异常,JVM会选择终止程序。因此我们编写程序时不需要关心这类异常。
exception:大多是程序员所写程序导致,我们可以处理,还可细分为运行时异常(RuntimeException)(不检查异常)常见的有NullPointerException、IndexOutOfBoundsException、。和非运行时异常(检查异常)常见的有IOException,
处理异常:
(1)、对代码块用try..catch进行异常捕获处理;
(2)、在该代码的方法体外用throws进行抛出声明,告知此方法的调用者这段代码可能会出现这些异常,你需要谨慎处理。此时有两种情况:
如果声明抛出的异常是非运行时异常,此方法的调用者必须显示地用try..catch块进行捕获或者继续向上层抛出异常。
如果声明抛出的异常是运行时异常,此方法的调用者可以选择地进行异常捕获处理。
(3)、在代码块用throw手动抛出一个异常对象,此时也有两种情况,跟2中的类似
如果抛出的异常对象是非运行时异常,此方法的调用者必须显示地用try..catch块进行捕获或者继续向上层抛出异常。
如果抛出的异常对象是运行时异常,此方法的调用者可以选择地进行异常捕获处理。
如果最终将异常抛给main方法,则相当于交给jvm自动处理,此时jvm会简单地打印异常信息
自定义异常
补充:
(1),子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法只能抛出父类的异常或者该异常的子类。
(2),如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子类。
(3),如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时也不能抛出异常。如果子类方法发生了异常,就必须try处理,不能抛。
6、继承封装多态
封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。
继承是为了重用父类代码。
面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。
多态指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。即同种事物,在不同境况下的不同的体现方式。
eg:
class Car {
public static String sName = "sCar";
public String name = "car";
public void run() {
System.out.println("car run...");
}
}
class BMW extends Car {
public static String sName = "sBMWCar";
public String name = "BMWcar";
public void run() {
System.out.println("BMWcar run...");
}
}
有以上代码求以下运行结果:
Car c = new BMW();
System.out.println(c.sName);
System.out.println(c.name);
c.run();
武功秘籍:
多态关系中成员访问特点
成员变量:编译看左边,运行看左边
成员方法:编译看左边,运行看右边
静态方法:编译看左边,运行看左边
7、基本数据类型
Java里面包含8个基本数据类型,分别是:
boolean、byte、char、short、int、float、douboe、long
默认类型转换
byte,short,char—int—long—float—double
byte,short,char相互之间不转换,他们参与运算首先转换为int类型
这也就解释了下面这道题:下面那一句编译不通过
1.byte b1=3,b2=4,b;
2.b=b1+b2;
3.b=3+4;
然后下面这个运算结果是什么?
int x=1,y=2,z=3;
System.out.println(y+=z--/++x);
8、值传递和引用传递
(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。
eg:下面程序的输出结果?
int[] scores = {3,2,1,5,2};
int[] bak = scores; bak[3]=100;
System.out.println(scores[3]);
9、抽象和接口
abstract:
1) 抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类;
2) 没有抽象构造方法,也没有抽象静态方法;也没有final抽象方法
3) 抽象类中可以有非抽象的构造方法;
4) 抽象类及抽象方法不能被final修饰符修饰。
interface:
解决多重继承问题
- 接口中的变量会被隐式地指定为public static final变量,也只能是public static final变量。并且必须被显式初始化。
- 接口中的方法会被隐式地指定为public abstract方法且只能是public abstract方法。换句话说,接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。
接口中没有构造方法,不能被实例化。
10、类加载的过程
1).类加载,同时初始化类中静态的属性(赋默认值)
2).执行静态代码块
3).分配内存空间,同时初始化非静态的属性(赋默认值)
4).调用父类构造器
5).父类构造器执行完后,如果自己声明属性的同时有显示的赋值,那么进行显示赋值把默认值覆盖
6).执行匿名代码块
7).执行构造器
8).返回内存地址
如果父类没有加载过,那么父类要先在内存中加载
eg:
class Print {
public Print(String msg){
System.out.println(msg);
}
}
class Fu {
private static Print p = new Print("fu name");
public Fu() {
System.out.println("new Fu()");
}
static {
System.out.println("Fu password");
}
}
public class Zi extends Fu{
public static Print print = new Print("Zi name");
public Zi(){
System.out.println("new Zi()");
}
static {
Print print = new Print("Zi password");
}
}
有以上代码,new Zi()会输出什么?