1 java中方法的参数传递是值传递(基本数据类型),对于自定义对象是引用传递。
2 作用域:
public class iotest {
public static void main(String[] args) {
int a =0;
{
int a=3;//非法
}
}
}
3变量初始化public static void main(String[] args) {
int a ;
System.out.println(a);//直接错误
}
4初始化顺序
package com.test.www.test;
public class TestOrder {
Order1 o1=new Order1();
public TestOrder() {
System.out.println("ordertest");
}
public static void main(String[] args) {
TestOrder test=new TestOrder();
}
}
class Order1{
public Order1() {
System.out.println("order1");
}
}
打印结果:
order1
ordertest
结论:先初始化成员变量然后调用构造器
5数组复制
@Test
public void testArray(){
int[] a={1,2,3};
int[] b=a;
b[1]=555;
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
int t=1;
int m=t;
m=10000;
System.out.println(t);
}
打印结果
1
555
3
1
结论:数组之间的赋值是引用,而基础数据类型的赋值是复制。6 += 和+ 两个操作符被重载了
7 被final修饰的变量,如果是基础类型值不可改变,如果是对象则其引用的句柄不可改变但对象内部的值是可变的
8 在java中成员变量并不具有多态性
9 Arrays.asList()返回的list与ArrayList并不是一个类型,虽然类名一样。以下为Arrays的部分源码
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
同时,Arrays.asList()返回的list是不可新增和删除的,在内部类ArrayList里维护了一个 private final E[] a;因此不可改变。但为什么会这样设计????10.增强for循环实际上在遍历的时候实际上 调用的iterable接口中的iterator() 方法。
11.父类方法未抛出异常,子类方法则不能抛出异常;父类方法抛出异常,子类方法可以不抛出异常
12.抽象类和接口相同点:都不能被实例化,位于继承树的顶端,都包含抽象方法
不同点:1、设计目的:接口体现的一种规范,类似与整个系统的总纲,制订了系统各模块应该遵循的标准,因此接口不应该经常改变,一旦改变对整个系统是辐射性的。
抽象类作为多个子类的共同父类,体现的是一种模板式设计,可以当作系统实现过程中的中间产品,已经实现了系统部分功能。
2、使用不同:(1)接口只能包含抽象方法,抽象类可以包含普通方法。
(2)接口里不能定义静态方法,抽象类可以。
(3)接口只能定义静态常量属性不能定义普通属性,抽象类可以。
(4)接口不包含构造器,抽象类可以(不是用于创建对象而是让子类完成初始化)。
(5)接口里不能包含初始化块,抽象类完全可以。
(6)接口多继承,抽象类单继承(只能有一个直接父类)。
总结:接口所有方法全是抽象方法只能 public abstract修饰 (默认public abstract修饰 ),属性默认public static final修饰。
抽象类除了包含抽象方法外与普通类无区别。
13.协变
public class Person {
public Serializable getback(){
return "a";
}
}
public class Student extends Person{
@Override
public Integer getback() {
return 1;
}
}
14.赋值符号
>>为带符号右移,右移后左边的空位被填充为符号位
>>>为不带符号右移,右移后左边的空位被填充为0<<< 因为<<后右边总是补0
15.泛型的运用在转型,instanceof操作和new表达式上所有的类型参数都丢失了。
16 装箱拆箱在数组之间是不能的。
public static void main(String[] args) {
Integer[] integers =new Integer[10];
int[] ints ={1,2,3,4,5,6,7,8,9,10};
//ints=integers;编译不通过
}
17.数组的初始化
基本类型数组的值在不进行显示初始化的情况下,会被自动初始化。对象数组(包括Integer等类型)会被初始化为null。
public static void main(String[] args) {
int [][][] a =new int[2][2][4];
System.out.println(Arrays.deepToString(a));
}
output :[[[0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0]]]
18.Integer 类
两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关。
基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型。
equals方法重写注意自反性,一致性,传递性,对称性
19.synchronized 关键字是可重入的,即使是父子类
20.java定义的类(不是内部类)只有两种 public和无
21.在jvm的规范中描述了出现NoClassDefFoundError 可能的情况就是使用new关键字,属性引用某个类,继承了某个接口或类,以及方法的某个参数引用了某个类,这时会触发JVM隐式加载这些类时发现这些类不存在的异常。(许令波--深入分析javaweb技术内幕)
22.JVM表示是否同一个类会有两个条件。一是看这个类的完整类名是否是同一个,二是看加载这个类的classLoader是否是同一个,这里所说的同一个是指ClassLoader的实例是否是同一个。(许令波--深入分析javaweb技术内幕)
23.在java虚拟机规范中将java运行时数据划分为6种,分别为:pc寄存器数据;java栈;堆;方法区;本地方法区;运行时常量池;
24.java方法区也被成为永久区,存储 常量池,域 ,方法数据 ,方法体,构造函数。
25.为什么子类权限大于等于父类?原因:假如在一个程序中通过父类引用子类的对象。
parent 类中 有protected a方法,在son类中如果权限能够小于 protected 如private ,指向子类的父类引用理应能看见 a方法,但在实际中却看不到,导致冲突。