J2SE知识点归纳笔记(三)---Java面向对象 Part 3(二)

2014-11-23 23:56:29 · 作者: · 浏览: 1
r类可以走路"); } } public class InterfaceTest { public static void main(String[] args) { //实例化两个对象,输出对应结果 Person p = new Person(); p.eat(); p.speak(); Worker w = new Worker(); w.eat(); w.speak(); w.walk(); } }
代码截图:

\


代码解析:

该代码演示了接口的继承,接口的实现

比较简单,这里就略过了



修饰符详解

访问控制修饰符

public:公有的,被public修饰的部分可以被任何程序访问

protected:受保护的,被它修饰的成员只能由同包中的类或者其子类访问

default(默认):不写修饰符就是默认的,别写上defalut啊!同包与同类可见

private:私有的,是Java实现封装的关键,被修饰的成员变量与方法只能被类本身访问,同包也不行哦!


注意事项:

不能够使用protected和private修饰类;要么用public修饰,要么不加任何修饰符


其他修饰符:

static:静态修饰符

①静态变量:

用static修饰的变量,在所有对象中共享的数据,都指向内存中的同一地址

即,任何对象对改值的修改都会使存储空间的值发生改变


代码演示:

package com.jay.example;

class Test
{	
	//定义初始的值为3
	static int a = 3;
}

public class StaticTest {
	public static void main(String[] args) {
		//静态成员变量可以直接通过类名进行访问
		System.out.println(Test.a);
		//实例化两个对象,在t1中修改a的值,发现t2中的a的值也发生改变
		Test t1 = new Test();
		t1.a = 4;
		Test t2 = new Test();
		System.out.println(t2.a);
		
		
		//输出结果是:
		//3
		//4
		//说明了静态变量都是公用一块内存区域的,任何一个对象
		//对值的修改,都会改变对应内存区域的值
	}
}

②静态方法:

用static修饰的方法,要注意:

静态方法中,只能够访问静态数据或者直接调用静态方法

可以直接通过类名进行调用

代码演示:

package com.jay.example;

/*
 *因为我们的main方法就是静态的方法
 *所以我们直接在main方法外定义参数和方法
 *验证静态方法只能访问静态成员
 * */

public class StaticTest2 {
	
	//定义非静态的数据与方法
	int a = 3;
	void test(){System.out.println("非静态方法可不能被main调用啊");}
	
	//定义静态的数据和方法
	static int b = 4;
	static void test2()
	{System.out.println("静态方法被main调用了");}
	
	
	public static void main(String[] args) {
		
		//下面两个语句,如果调用了是会报错的,不信可以试试
		//System.out.println(a);
		//test();
		
		System.out.println(b);
		test2();
		
	}
}

③静态代码块

放在类声明的内部,成员方法与构造方法的外部,该代码块会在该类第一次使用时

执行一次,就不会再执行了,通常是在这里写一些初始化的代码

代码演示:

package com.jay.example;

public class static3 {
	static
	{
		System.out.println("静态代码块,通常用于类的初始化");
	}
}

④复杂的成员的初始化问题

当静态数据,静态代码块,对象成员,构造方法等同时存在时,那么成员的初始化顺序又是怎样呢?

其实,初始化顺序是:(静态变量,静态初始化块) --->(变量,变量初始化块)---->构造器

下面我们通过代码来验证这一规律:

package com.jay.example;


public class static3 {
	public static String staticStr = "静态成员初始化";
	public String str = "普通成员初始化";
	
	//构造方法
	public static3() {
		System.out.println("构造方法初始化");
	}
	
	//普通的初始化块
	{
		System.out.println(str);
		System.out.println("普通的初始化块");
	}
	
	//静态的初始化块
	static 
	{
		System.out.println(staticStr);
		System.out.println("静态的初始化块");
	}
	
	
	public static void main(String[] args) {
		static3 st = new static3();
	}
}

运行截图:

\



final:最终修饰符

使用方法


①使用final修饰属性(变量),此时的属性为常量;Java中利用public static final int AGE = 10;对常量进行标识

②空白final变量(没初始化的):空白的final数据成员必须在构造方法中进行初始化,否则会报错

③final常量作为方法的参数,只能够对final进行简单的引用,可不能改变常量的值哦!

④用final来修饰方法:那么该方法为一个不可覆盖的方法,如果父类有final修饰的方法,那么子类继承同一个方法

⑤用final来修饰类:那么该类不可以被继承,final类没有子类;同时该类中所有的方法都默认为final

⑥final并不涉及继承,继承取决于类的修饰符是public还是其他,是否可以继承取决于该类是否对其子类可见

如果一个方法前有private或static的修饰符,那么系统在前面自动地加上final修饰



abstract:抽象修饰符

被abstract修饰的类为抽象类,修饰的方法为抽象方法


transient:

用于修饰不想序列化,持久化的成员


volatile:

保证可见性和防止重排序,用的比较少,是并发操作那块的



枚举类型

枚举解析:

①作为jdk 1.5 后引入的枚举,用来代替以前定义多个同类型常量的public final static

②用enum表示,作用类似于class关键字;

③构造方法不要用public修饰

④变量和方法的定义需要在枚举值的后面!!!



用法示例:

简单的枚举:

package com.jay.example;

/*
 * 本程序演示的是枚举的最简单用法
 * 定义枚举Color有三个值,演示了switch和增强for循环遍历枚举
 * 中所有的原始的方法
 * */

enum Color
{