目录
1. Java相关的命令文件
- javac.exe 是编译程序,将java源文件编译为.class文件
- java.exe 是执行程序,用于执行编译好的.class文件
- javadoc.exe 用来制作Java文档,可以根据代码中的文档注释自动生成 API 文档
- jdb.exe 是Java的调试器
- javaprof.exe 是剖析工具
2. java中的\r、\n、\r\n、\n\r的区别
- \r:回车符,将光标定义到当前行行首
- \n:换行符,换到下一行的行首
3. i++和++i的区别
++:自增(--自减用法与其相同)
- 作为独立的语句使用:i++; 和 ++i; 都完全等价于 i=i+1;
- 作为表达式使用:++i先自增后赋值,i++先赋值后自增
j = ++i; 等价于 i = i + 1; j = i;
j = i++; 等价于 j = i; i = i + 1;
题目1:
int i = 1;
i = i++; // 使用临时变量:(1) temp = i; (2) i = i + 1; (3) i = temp;
System.out.println(i); // 输出结果为1
题目2:
int i = 1;
i = ++i; // 使用临时变量:(1) i = i + 1;(2) temp = i; (3) i = temp;
System.out.println(i); // 输出结果为2
4. 数组赋值机制
- 基本数据类型赋值,这个值就是具体的数据,而且相互不影响。
- 数组属于引用类型,在默认情况下则是引用传递,赋的值是地址。
如果想实现数组拷贝(内容复制),且两个数据的数据空间是独立的(修改新数组,不会对旧数组产生影响),则需要开辟新的数组空间,并把每个元素拷贝到新数组对应的元素位置。
int[] arr1 = {10,20,30};
//创建一个新的数组 arr2,开辟新的数据空间
//大小 arr1.length;
int[] arr2 = new int[arr1.length];
//遍历 arr1 ,把每个元素拷贝到 arr2 对应的元素位置
for(int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
5. 类和对象的区别与联系
面向对象是JAVA最重要的一个特点。
- 类是抽象的,概念的,代表一类事物,比如人类,猫类.., 即它是数据类型
- 对象是具体的,实际的,代表一个具体事物, 即 是实例
- 类是对象的模板,对象是类的一个个体,对应一个实例
6. 类和对象的内存分配机制
Java内存的结构分析:
1) 栈: 一般存放基本数据类型(局部变量)
2) 堆: 存放对象(Cat cat , 数组等)
3) 方法区:常量池(常量,比如字符串), 类加载信息
- 运行 new Cat() 时,加载Cat类信息(属性和方法信息,只会加载一次,后面即使再创建新对象也不会再加载)
- 运行完 Cat cat = new Cat(); 在堆中分配空间, 进行默认初始化(看规则) 把地址赋给 cat , cat 就指向对象
- 根据属性的数据类型不同,属性信息的初始值不同,具体说: int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null
- 根据属性的数据类型不同,属性信息的存放方式不同:如果时基本数据类型,则直接存储在堆中;如果是引用类型,则堆中存储的是地址
- 进行指定初始化,如Cat.name = '小白'
p1和p2其实指向同一个地址。
7. 方法的调用机制原理
8. 成员方法传参机制
基本数据类型传参:传递的是值(值拷贝),形参的任何改变不影响实参。——值是直接存储在栈中
引用数据类型传参:传递的是地址(传递也是值,但是传递的值是地址),可以通过形参影响实参——栈中存储的地址,形参和实参都是通过该地址去访问、修改堆中的值
package chapter07;
public class Method01 {
//编写一个 main 方法
public static void main(String[] args) {
//测试
B b = new B();
int[] arr = {1, 2, 3};
b.test100(arr);//调用方法
System.out.println(" main 的 arr 数组 ");
//遍历数组
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
System.out.println();
//测试
Person p = new Person();
p.name = "jack";
p.age = 10;
b.test200(p);
//测试题, 如果 test200 执行的是 p = null ,下面的结果是 10
//测试题, 如果 test200 执行的是 p = new Person();..., 下面输出的是 10
System.out.println("main 的 p.age=" + p.age);//10000
}
}
class Person {
String name;
int age;
}
class B {
public void test200(Person p) {
//p.age = 10000; //修改对象属性
//思考
p = new Person(); // 形参指向了新的地址,不再对实参产生影响
p.name = "tom";
p.age = 99;
// 思考
//p = null;
}
//B 类中编写一个方法 test100,
//可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化
public void test100(int[] arr) {
arr[0] = 200;//修改元素
//遍历数组
System.out.println(" test100 的 arr 数组 ");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
System.out.println();
}
}
9. 多态,重载和重写
多态性:通过继承,一个类可以用作多种类型,可以用作它自己的类型、任何基类型或者在实现接口时用作任何接口类型。这称为多态性。
首先,重载和重写(覆盖)都是多态的一种体现方式。重载是编译期间的活动,重写是运行期间的活动。
其次,重载是在一个类中定义相同的名字的方法,方法的参数列表或者类型要互相不同,但是返回值不作为是否重载的标准,可以修改可见性;重写则不同,要求子类重写基类的方法时要与父类方法具有相同的参数类型和返回值,可见性需要大于等于基类的方法。
10.对象创建的流程分析