J2SE学习笔记(二)

9、面向对象

(1)类:

[public | final | abstract] class 类名{}

类名驼峰,首字母大写


(2)Field:

[public | protected | private 、 static 、 final] 类型 名称 [=默认值];

Field名驼峰,首字母小写


用static修饰的Field属于类本身,没有static修饰的Field属于调用该Field的对象

static修饰类Field,并不是属于对象,而是属于类本身,当系统初始化类时,就会为类Field分配内存、并指定初始值。

而局部变量则必须由程序员显式的赋值,否则将无法使用。


(3)方法:

a)、构造方法

[public | protected | private] 构造方法名(参数){}

this关键词有两个作用:

         1. this引用 —— 如果在构造器中,代表构造器正在初始化的对象。

                                   如果在方法中,代表正在调用该方法的对象。

                                   this引用总是代表该类的实例。

         2. this调用:

             只能用在构造器、而且必须是构造器中第一条代码。

             this调用总是调用当前类中重载的构造器。this调用到底调用哪个构造器,取决于传入的参数值。


b)、普通方法/抽象方法

[public | protected | private 、 abstract 、 final 、 static] 返回值类型 方法名(参数){方法体}

方法名驼峰,首字母小写

用static修饰的方法(静态方法)属于类本身,没有static修饰的方法属于调用方法的对象

方法的形参可变参数:public void test(String... str){}

其类似于:public void test(String[] str){}

Java方法的参数传递机制:值传递

方法重载:方法名相同,形参列表不同。Java里不能使用方法返回值类型作为区分方法重载的依据。


(4)this关键字:this关键字总是代表调用该方法的对象,this不能用在有static修饰的方法中.


(5)封装

private   本类访问权限

默认      包访问权限

protected 子类访问权限

public    公开访问权限

javadoc默认只提取public、protected的文档注释


(6)包

定义包 package 包名

导包   import 包名.类名

Java默认会 import java.lang.*;

静态导包(代码中可以省略类名)import static


(7)继承

父类、子类

方法的重写(@Override):

方法名相同,参数列表相同

返回值相同或更小,异常类型相同或更小

访问权限相同或更大


super关键字:super限定、super调用(父类构造器)

super调用只能在构造器用,而且必须位于第一行,不能与this调用同时出现


子类构造器总会调用父类的构造器。

        当父类没有无参数的构造器时,子类的构造器中【必须显式】的用super调用父类有参数的构造器。

否则:子类构造器会自动(隐式)调用父类无参数的构造器——必然导致找不到构造器的错误。


(8)多态

对于一个引用变量来说,可以认为有两个类型:

        1. 编译时类型。声明该变量时所用的类型,就是编译时类型。

           对于编译器来讲,编译器只管变量的编译时类型,与运行时类型无关。

        2. 运行时类型(实际类型)。该变量实际所指向的对象的类型,就是运行时类型。


(9)初始化块

[static]{}

非静态初始化块经编译后放入构造方法

静态初始化块只在类第一次使用时加载,因此只有一次执行机会


(10)包装类(Wrapper Class)

java提供了八个基本数据类型的包装类和自动装箱、拆箱(1.5+)

包装类缓存:

Boolean:(全部缓存)

Byte:(全部缓存)

Character(<= 127缓存)

Short(-128 — 127缓存)

Long(-128 — 127缓存)

Float(没有缓存)

Doulbe(没有缓存)

总之就是缓存-128 — 127的内容

import java.util.ArrayList;

public class WrapperClass{
	//Integer自动装箱
	public WrapperClass(){
		ArrayList<Integer> arrayList=new ArrayList<Integer>();
		arrayList.add(100);
	}
	
	//a=100,b=100 => a==b (因为Integer缓存)
	//a=200,b=200 => a!=b
	public void test(Integer a,Integer b){
		if(a==b){
			System.out.println("a==b");
		}else{
			System.out.println("a!=b");
		}
	}
}

同时对于垃圾回收来说

Integer i = 100;     
i = null;//这里的代码不会有对象符合垃圾回收器的条件,这儿的i虽然被赋予null,但它之前指向的是cache中的Integer对象,而cache没有被赋null,所以Integer(100)这个对象还是存在。


你可能感兴趣的:(J2SE学习笔记(二))