java基础(转载自https://github.com/CyC2018/CS-Notes)

数据类型:

基本数据类型:8种

boolean  1bit

byte  1byte

int   4byte

short  2byte

char  2byte

float  4byte

long  8byte

double  8byte

每一个基本类型都有对应的包装类型;

自动装箱 拆箱:

Integer i=1 ;

int i1 = i;

缓冲池:

new Integer(123)  每次会创建一个新的对象,

Integer.valueOf(123) 会从缓冲池中取出对象;如果多次调用会取出相同的对象的引用。自动装箱会自动使用valueOf方法;

各数据类型的缓冲池大小:

boolean:true/false;

short:-128-127;

int: -128-127;

char:\u0000-\u007f;

all byte vlaues;

String类型:

String类被声明为final不可被继承,内部的char数组被声明为fianl,因此char数组初始化后就不可再引用其他数组,并且String类内部没有修改char数组的方法,所以可以保证String是不可变的。

String不可变的好处:安全性:string经常作为函数的参数,例如string表示IP地址,不可变可以保证安全

                                   可以缓存hash值:string作为hashmap的key;

                                   string pool:如果一个String的对象已经创建过,那么就会从string pool中去的引用,只有string是不变的,才可以使用string pool;

                                   线程安全:string的不可变性天生具有线程安全,可以在多个线程中安全地使用。

String 、 StringBuilder 、StringBuffer:StringBuilder和StringBuffer是可变的,StringBuilder不是线程安全地,StringBuffer是线程安全的,内部使用synchronized同步;

String Pool:

String s = new String("123");新建对象

String s1 = s.intern(); 添加到String pool中,从String pool中取;

String s2 = "12";自动将常量放入String pool;

New String()源代码:

public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}

并不会完全复制value数组 而是直接指向original 的value 的数组;

参数传递:

java的参数是值传递不是引用传递,

float和double:

字面量1.1是double,字面量1.1f才是float,double= 1.1会错误,这是向下转型,精度会降低;

隐式类型转换:+=可以隐式类型转换

                         short s ;

                         s +=1;相当于s = (short)(s+1);

switch语句

switch接受的参数类型有10种,分别是基本类型的byte,short,int,char,以及引用类型的String(只有JavaSE 7 和以后的版本 可以接受String类型参数),enum和byte,short,int,char的封装类Byte,Short,Integer,Character。switch 不支持 long,是因为 switch 的设计初衷是对那些只有少数的几个值进行等值判断,如果值过于复杂,那么还是用 if 比较合适。

继承

访问权限 

private protected public 包级可见(不声明)

抽象类和接口:

抽象类:抽象类一般会包含抽象方法,抽象方法一定在抽象类中,抽象类不能被实例化,只有继承抽象类才能实例化其子类;

接口:是抽象类的延伸 ,java8开始,接口也支持默认的方法实现,接口的成员(字段和方法)都是public的,接口的字段都是static final的;

区别:

抽象类:is a,不支持多继承,字段没有限制,可以有多种访问权限,

接口:like a,可以实现多个接口,字段必须是static final,成员必须为public,成员方法都是abstract的,java8以后接口也可以有默认的方法实现;

在选择上 优先选择接口,因为接口没有抽象类严格的类层次要求,可以灵活地为一个类添加行为,并且,从java8开始,接口也有默认的方法实现,使得代码维护的代价降低。

super:

作用:1.super()可以引用父类的构造函数,完成一些字段的初始化;

           2.super.func() 可以引用父类的方法实现

重写重载:

重写:完全相同;

重载:参数不同(顺序,个数,类型) 返回值不同,其他都相同的话不是重载;

Object的通用方法:

public final native Class getClass()

public native int hashCode()

public boolean equals(Object obj)

protected native Object clone() throws CloneNotSupportedException

public String toString()

public final native void notify()

public final native void notifyAll()

public final native void wait(long timeout) throws InterruptedException

public final void wait(long timeout, int nanos) throws InterruptedException

public final void wait() throws InterruptedException

protected void finalize() throws Throwable {}

equals()

  判断引用的对象是否等价

Integer x = new Integer(1);
Integer y = new Integer(1);
System.out.println(x.equals(y)); // true
System.out.println(x == y);      // false

hashCode()

返回对象的散列值;等价的对象散列值一定相同,散列值相同的对象不一定等价;

因此,在覆盖equals()方法时应当总是覆盖hashCode()方法,确保等价的对象散列值相同;

toString()

默认返回对象的散列值@后;

clone()

clone()是Object的一个protected方法,如果不显示重写,就不能调用clone方法;super.clone();

cloneable接口:clone() 方法并不是 Cloneable 接口的方法,而是 Object 的一个 protected 方法。Cloneable 接口只是规定,如果一个类没有实现 Cloneable 接口又调用了 clone() 方法,就会抛出 CloneNotSupportedException。

浅拷贝:直接引用同一个对象,深拷贝:不是引用同一个对象;

不建议使用clone()方法有风险,可以用拷贝构造函数或者拷贝工厂代替;

关键字:

final:

             1.修饰数据:声明数据为常量,可以是编译时常量,也可以是运行后不改变的常量;

                对于基本数据类型,final使数据不改变,对于引用数据类型,final使其不能引用别的对象,但是引用对象的本身的字段等是可以改变的;

              2.修饰方法:声明本方法不能被子类重写,private方法被隐式地指定为final,如果父类中有一个private方法,在子类中又声明了一个同名的方法,则不是重写,而是重新定义了一个新的方法;

              3.修饰类:声明类不能被继承;

static:

              1.修饰数据:声明数据为静态变量,所有的实例共享静态变量,可以用类名直接访问;

              2.修饰方法:静态方法:静态方法在类加载的时候就存在了,不依赖于任何实例,必须有实现,不能声明为抽象方法,只能访问静态成员(字段和方法),方法中不能有super和this关键字;

               3.修饰代码块:静态代码块:静态代码块里的内容只在类第一次初始化的时候运行一次;

               4.静态内部类:静态内部类不依赖一外部类的实例,不能访问外部类的非静态成员;

               5.静态导包:使用方法是不需要写类名,代码可读性会降低,不建议;

               6.初始化顺序:静态变量和静态语句块执行顺序优先于实例变量和普通语句块;

反射

反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。用途就是开发各种框架。。

异常

  • 受检异常 :需要用 try...catch... 语句捕获并进行处理,并且可以从异常中恢复;
  • 非受检异常 :是程序运行时错误,例如除 0 会引发 Arithmetic Exception,此时程序崩溃并且无法恢复。

泛型

http://www.importnew.com/24029.html

java和c++的区别:

1.java是纯粹的面向对象的语言,所有的对象都是继承自java.lang.Object,而c++为了兼容c既支持面向对象也支持面向过程;

2.java没有指针,它的引用可以理解为安全指针,c++具有和c一样的指针;

3.java不支持多继承,c++可以多继承;

4.java不支持操作符重载,c++可以;

5.java的goto是保留字但是不可以使用,c++可以使用goto;

5.java的jvm使java有跨平台的属性,而c++需要特定的环境;

6.java有自动垃圾回收,c++没有;

7.java没有条件编译,c++可以用#ifdef  #ifndef 进行条件编译;

jre&jdk:

jre:java runtime environment;

jdk:java development kit;

 

 

你可能感兴趣的:(java基础(转载自https://github.com/CyC2018/CS-Notes))