您的位置:首页 > 编程语言 > Java开发

java基础知识(读书笔记,练习题笔记)

2017-07-26 10:39 351 查看

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方法,但在实际中却看不到,导致冲突。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: