当前位置: 代码迷 >> J2SE >> J2se 基础温习
  详细解决方案

J2se 基础温习

热度:2404   发布时间:2013-02-25 00:00:00.0
J2se 基础复习

java是跨平台语言,真正执行的不是2进制码,而是字节码.

?

JVM---java virtual machine java虚拟机.java虚拟机不是跨平台的,jvm是由C语言编写的.

因为linux,window,mac等等操作系统所用的jvm是不同的.

?

java有两类数据类型:原生数据类型和引用类型.

原生数据类型:int,byte(-128~127 8位),short(16位),long(32位),

???????????????? float,double,char,boolean.

?

关于计算机的数据表示:

位bit ---只有0,1两个状态,是计算机中最小的表示单位.

字节byte --- 1 byte=8bit.

KB --- 1 KB =1024 Byte.? 1024 = 2的10次方.

MB --- 1 MB = 1024 KB.

GB --- 1024 MB.

?

5%(-2)==1? -5%2==-1 -5%(-2)==-1 证明了余数的符号和被除数一样.

?

java三大基本特征:封装,继承,多态.

?

属性定义在类中叫成员变量,定义在方法中叫局部变量.

使用前,局部变量必须初始化;但是成员变量可以不初始化,因为成员变量可以自己有自己的默认值.

?

对于java的方法参数传递,无论是原生类型还是引用类型,统一都是传值.

?

在定义一个类的时候,如果没有构造方法,java编译器会自动添加一个默认的构造方法;

如果为类声明了构造方法,那么java编译器就不会再添加默认的构造方法了.

?

new关键字顺序完成的三件事件:

为对象开辟内存空间--->调用类的构造方法--->将生成的对象地址返回.

?

如果想在一个构造方法中调用另外一个构造方法,那么使用this()方式调用.

但是this()之前不能有任何可执行的代码.

因为如果在构造方法中的this()之前有代码,那么该程序不晓得先执行

哪个构造方法执行的数据才是正确的了.

?

当生成子类对象时,java默认先调用父类不带参数的构造方法.

但是可以改变这种机制,利用super()来去调用父类任何的构造方法.

?

因为super()和this()在子类的构造方法中都必须处于第一行,两个

特殊的方法有冲突,所以在子类同一个构造方法中不能同时有

super和this两个特殊的构造方法.

?

继承---子类可以继承父类的属性和方法,但是只有构造方法不能被继承.

子类的构造方法可以隐式地调用父类不带参数的构造方法.

?

当两个方法发生重写关系时,可以在子类方法中通过super.xxx()形式调用

父类的xxx()方法,并且super.xxx()不必放在第一行.

?

?多态---子类就是父类,比如:人是男人的父类,所以可以认为男人是人.

Person man =new Man();??? //Person是Man的父类.

多态---父类型的引用可以指向子类型的对象,或者接口类型的引用可以
指向实现该接口的类的实例.

?

抽象类:使用abstract关键字.抽象类无法实例化,不能new出来抽象类对象.
抽象方法:也用abstract关键字,有声明无实现,没有{}括号,用;直接结束.
抽象方法一定是定义在抽象类中的.
如果一个类包含抽象方法,那么这个类一定是抽象类.
但是如果一个类是抽象类,它也可以包含具体方法,也可包含抽象方法,
也可以什么方法都不包含.

如果父类是个抽象类,子类去继承这个父类,那么子类必须要实现父类中
所有的抽象方法.

?

接口中的所有方法都是抽象方法.
接口中的方法可以使用abstract关键字,也可以不使用.
其实接口是一个特殊的抽象类.
一个非抽象类实现某个接口,那么该类必须要实现该接口中声明的所有方法.如果该类是个抽象类,那么无需实现接口中的方法了.

?

static可以修饰属性,修饰方法,也可修饰类.
static在内存中分配的空间永远是静止的,所以无论生成出多少个对象,
这些对象都会使用唯一的这份静态的内存空间.
static可以通过不用new出对象来访问,直接通过类就可以访问.

?

子类可以继承父类的static静态方法,但是子类不能重写父类的静态方法.其实子类一直隐藏着父类的静态方法.

?

final---可以修饰属性,方法,类. final修饰的类,方法,属性不能被继承和重写和覆盖.

?

为什么成员变量可以有默认值,局部变量没有?

类成员变量因为你在new一个对象时,分配了内存空间后会给所有的成员变量一次初始化,没有赋值的会给成员变量对应类型的“0”值,然后才构造对象初始化。每一个对象都有一个成员变量的副本,一直存在于对象的堆空间直到这个对象空间被回收。
局部变量在用的时候是直接入栈的,如果没有赋值,这个变量就没有初始值,也就无法操作,所以局部变量要初始化。并且局部变量在方法结束后会出栈,就像它没有来过一样。

?

static代码块---静态代码块.主要是完成一些初始化的工作.

首先执行静态代码块(将类加载到java虚拟机上),然后执行构造方法(JVM生成对象).

加载的时候只会加载一次,所以静态代码块只会执行一次.

?

静态的只能访问静态的;非静态的可以访问一切.

不能再静态方法中使用this关键字.

?

接口中所声明的方法都是抽象方法.接口中的方法都是public的.

接口中的成员变量是public,final,static的.实际的开发中其实基本不在接口中定义属性.

?

protected---作用在类内部,相同的包下以及该类的子类(子类和父类不在同一个包下)访问.

不加任何修饰符---int i;作用在类内部以及相同的包下类使用.

?

equals ---对于object类来说,equals就相当于==.

但是对于继承了object类然后重写了equals方法的类来说,就不同于==.

比如String类重写了equals方法,就是判断对象的内容是否相同.

比如对于一个自定义的student类. Student s1 = new Student("123");Student s2 = new Student("123");

System.out.println(s1.equals(s2));?? // 这里返回的是false.因为这里没有重写equals方法,所以equals就相当于==.

?

String类是一个特殊的类.String类有个特殊的东西---StringPool(字符串池).

比如:String str = "aaa";

首先java会到字符串池中区查找是否存在"aaa"这个对象,如果不存在,则在字符串池中区创建一个aaa对象,

然后将StringPool中这个aaa对象的地址返回来,赋给引用变量str.

如果在字符串池中存在这个对象,则不创建任何对象,直接将字符串池中这个对象的地址返回来.

?

String str = new String("aaa");

首先在字符串池中查找有没有aaa这个对象,如果有,则不在字符串池中去创建aaa对象,

而直接在堆heap中创建一个aaa字符串对象,然后将aaa这个对象的地址返回,赋给str引用.

如果在字符串池中没有这个对象,那么先在池中创建这个对象,再去堆heap中创建aaa对象,

然后将堆中地址返回来.

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?