Java些微知识点总结

一些基础的东西都懂得就不说了,主要总结一些容易出错或者遗忘的地方

1数组

ps1:数组也是 一种引用类型    int[] , int a[] 这两种形式都可以,但提倡使用第一种 

ps2: 静态初始化 int []a =new int[] {i,j,k,l,.....}; 

        动态初始化 int[] a =new int[length];

ps3:不要用多为数组的思想考虑java的多维数组,应该理解为数组的数组

        int [][] arr; 次维度可以不同, 即从左往右第二个维度开始可以独自分配;

        例:int[][] arr=new int[length][];     arr[0]=new int [a];    arr[1]=new int [b];

增强类 Arrays 的静态方法

1:int binarysearch(type [] a,type key); 查找不存在则返回负数

2 :  int binarysearch(type [] a,int from,int to,type key);

3 :type[] copyof(type [] a,int length )

4 :   type[] copyofrange(type[] a,int from,int to);

5 :  boolean equals(type[] a1,type []a2);

6 : void fill(type[]a,type val); 用 val赋值a;

7 : void fill(type[] a,int from,int to,type val);

8 :void sort(type[] a ); 从小到大

9 : void sort(type[] a,int from,int to);

10 String  toString(type[] a );


2 参数传递

java中的参数传递是值传递:基本类型的传递是传递的值的副本,改变副本不会改变原来的值;但是引用类型的传递传递的是地址所以,改变副本的值就是该变原来的值;因为副本值是一个指向原来地址的值;

3 package ,import, import static

import static 导入类的静态属性和方法,在使用这些静态属性和方法的时候可以不用写类名直接写方法名和属性名;

4 调用父类的构造器时 super关键字一定是出现在构造器的第一行的

5 多态

编译时是父类 运行时是子类,从而运行时表现出子类的特性   子类到父类是向上转型,父类到子类是向下转型

a instanceof ClassB

6为何出现包装类

将基本数据类型转换成Object; 包装类中的-128到127之外的数自动装箱之后的地址总是不同的(每次都会new一个Integer),而这之间的整数自动装箱后的地址是一样的(被装入了缓冲中);

7== 和equals 

==和equals本没有区别 都要求两个引用变量指向同一个对象才返回true,都是比较地址

但String 类已经重写了equals方法 只要值相等就返回true

new String(“hello”) 产生两个字符串对象 一个在堆中 一个在常量池中

8抽象类

一句话 和普通类的唯一区别:抽象类中可能出现抽象方法,抽象类中可以定义普通类中的任意属性和方法

final和abstract是冲突的关键字

static 和abstract也不能同时修饰同一个方法   但可以修饰内部类

abstract和private 也不能同时修饰方法

子类只能有一个抽象父类或者普通父类 extends(单继承你懂得)


9接口

[修饰符] interface 接口名 extends 父接口1 ,父接口2...

{常量,抽象方法,背部类,接口,枚举定义,默认方法定义,类方法定义(java8中才可以)

接口中不能有构造器,初始化块定义

定义默认方法时要使用default关键字

类方法和默认类必须有实现体

不能直接使用接口来调用默认方法,需要使用接口的实现类的实例来调用默认方法    

类方法不能使用default关键字修饰

10 内部类

    内部类也是类

    非静态内部类对象中会开辟一块内存存放外部类对象的引用 所以有非静态内部类对象存在一定有外部类存在,非静态内部类只

    能在该外部类中使用

    外部类对象中不一定定义了内部类对象所以外部类不可以直接访问内部类对象 但可以通过内部类对象访问内部类属性 对象和对

    象之间的交流

    总而言之 内有外但玩不一定有内;一个男人不一定有儿子,但一个儿子一定有父亲; 没有儿子怎么办 那得生一个喽(new)

    之后才能使唤儿子是吧,儿子一定有父亲所以儿子一定能和父亲住一个屋子喽!

    主要是一个先有后又的问题;



变量重名时通过下面三个来区分使用哪个变量  

  局部变量var,内部类变量 this.var ,外部类变量outerclass.this.var

  非静态内部类里不允许有 静态属性,方法,代码块 

  不允许在外部类的静态成员中直接使用非静态内部类

静态内部类 属于外部类的静态成员



接口里可以定义内部类一定是public static 可以定义接口但一定是public

在外部类以外的地方使用内部类则必须使用外部类的实力对象创建内部类 从而是内部类对象依附于该外部类对象

outinstance.new innerclass xxx;

即使在子类中写了与父类内部类 同名的内部类他们依然不是重写关系, 因为这两个同名的内部类的外部类不同名,外部类名是作为内部类 的命名空间的。

匿名内部类 只能实现一个接口或继承一个父类  主要用于创建一个接口类型的对象  

如果局部变量被匿名内部类访问,则该局部变量相当于自动使用了final修饰

引用:强,软,弱,虚

强引用 最常见的引用 StrongReference

软引用 内存不只是会回收 SoftReference

弱引用,gc运行时就会回收 WeakReference

虚引用 主要用那个与跟踪对象被垃圾回收的状态,虚引用不能单独使用,必须和引用队列联合使用 PhantomReference ReferenceQueue

String  不可变

StringBuffer 线程安全的

 StringBuilder 非线程安全的 性能高

PriorityQueue 元素是按照大小顺序排列的,不是fifo,违反的队列的规则

List 接口实现类  ArrayList  Vector,据说LinkedList 功能更强大,他也实现了Deque

Queue接口实现类 PriorityQueue 

Deque接口的实现类 ArrayDeque 

Map

源码的一个小秘密,java 的set类是通过map类来实现的,虽然set 实现的是Collection接口。

HashMap,Hashtable 区别

Hashtable 线程安全,且无法放入null key 但HashMap可以放入一个null key 且非线程安全

SortedMap 

SortedMap接口的实现类是 TreeMap TreeMap是通过红黑树实现的。

try catch finally 中的return

finally语句一定会执行 不管try和 catch中是否有return 语句   ,当finally 中有return语句 会立即生效 不会在跳转回去。尽力壁面在finally 中使用return 语句

异常处理中的责任链模式

不断向上层抛出无法处理的异常,并不断的封装该异常,从而隐藏底层实现。

猜你喜欢

转载自blog.csdn.net/u012232736/article/details/80263035