java基础知识(读书笔记,练习题笔记)
2017-07-26 10:39
417 查看
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方法,但在实际中却看不到,导致冲突。
相关文章推荐
- 【笔记】Java核心技术 卷1 基础知识 第一章 读书笔记
- JAVA面向对象中的基础知识整理-JAVA课堂笔记
- 黑马程序员java笔记之零-----基础知识
- java基础知识笔记
- java编程笔记1 java基础知识
- Java多线程编程总结笔记——一多线程基础知识
- 【Java学习笔记】基础知识学习1【基本输出,数据类型,基础运算符号】
- Java学习笔记:基础知识2
- 【Java学习笔记】基础知识学习3【基本循环方法技巧】
- 【Java学习笔记】基础知识学习9【可变字符串】
- 【Java学习笔记】基础知识学习8【字符串比较】
- JAVA学习笔记(基础知识)
- 【Java学习笔记】基础知识学习5【数组排序,复制】
- java学习笔记1-基础知识
- JAVA的基础知识(给自己看的笔记)。
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- 【Java学习笔记】基础知识学习6【类的基础、方法,对象基础、包】
- JAVA基础知识总结笔记
- 【Java学习笔记】基础知识学习4【数组的基本知识】
- Java多线程编程总结笔记——一多线程基础知识