java - 内部类(Inner Class)详解

java - 内部类(Inner Class)详解
java - 内部类(Inner Class)详解

Java内部类(Inner Class)详解

简单的说,内部(inner)类指那些类定义代码被置于其它类定义中的类;而对于一般的、类定义代码不嵌套在其它类定义中的类,称为顶层(top-level)类。对于一个内部类,包含其定义代码的类称为它的外部(outer)类。

1 Static member class(静态成员类)

类声明中包含“static”关键字的内部类。如以下示例代码,

Inner1/Inner2/Inner3/Inner4就是Outer的四个静态成员类。静态成员类的使用方式与一般顶层类的使用方式基本相同。

public class Outer{

//just like static method, static member class has public/private/default access privilege levels

//access privilege level: public

public static class Inner1 {

public Inner1() {

//Static member inner class can access static method of outer class

staticMethod();

//Compile error: static member inner class can not access instance method of outer class

//instanceMethod();

}

}

//access privilege level: default

static class Inner2 {

}

//access privilege level: private

private static class Inner3 {

//define a nested inner class in another inner class

public static class Inner4 {

}

}

private static void staticMethod() {

//cannot define an inner class in a method

/*public static class Inner4() {

}*/

}

private void instanceMethod() {

//private static member class can be accessed only in its outer class definition scope

Inner3 inner3 = new Inner3();

//how to use nested inner class

Inner3.Inner4 inner4 = new Inner3.Inner4();

}

}

class Test {

Outer.Inner1 inner1 = new Outer.Inner1();

//Test and Outer are in the same package, so Inner2 can be accessed here

Outer.Inner2 inner2 = new Outer.Inner2();

//Compile error: Inner3 cannot be accessed here

//Outer.Inner3 inner3 = new Outer.Inner3();

}

1.1 静态成员类特性

静态成员类可访问外部类的任一静态字段或静态方法

像静态方法或静态字段一样,静态成员类有public/private/default权限修饰符

1.2 静态成员类约束

静态成员类不能与外部类重名

像外部类的静态方法一样,不能直接访问外部类的实例字段和实例方法

静态成员类只能定义于外部类的顶层代码或外部类其它静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。

1.3 新增语法

如示例代码所示,可以以“OuterClass.InnerClass”的方式来引用某个内部类。

1.4 什么时候使用静态成员类

B为A的辅助类,且只为A所用时,可将B定义为A的静态成员类。例如JDK中的LinkedList类就有Entry静态成员类:

public class LinkedList extends AbstractSequentialList

…;

private static class Entry {

E element;

Entry next;

Entry previous;

Entry(E element, Entry next, Entry previous) {

this.element = element;

this.next = next;

this.previous = previous;

}

}

…;

}

显然,Entry用来表示LinkedList中的一个结点,只被LinkedList自身使用。

2 Member class(成员类)

一个静态成员类,若去掉“static”关键字,就成为成员类。如下示例代码,Inner1/Inner2/Inner3/Inner4就是Outer的四个成员类

public class Outer {

//just like instance method, member class has public/private/default access privilege levels

private int data;

//access privilege level: public

public class Inner1 {

private int data;

private int data1;

public Inner1() {

//member class can access its outer class' instance field directly

data1 = 1;

//itself data field

data = 1;

//its outer class instance field

Outer.this.data = 1;

}

}

//access privilege level: default

class Inner2 {

//can not define static filed, method, class in member class

//static int j = 1;

//but, "static final" compound is allowed

static final int CONSTANT = 1;

}

//access privilege level: private

private class Inner3 {

public class Inner4 {

}

}

//in fact, Inner5 is not a member class but a static member class

interface Inner5 {

}

private static void staticMethod() {

//can not create a member class instance directly in outer class' static method

//Inner1 inner1 = new Inner1();

}

private void instanceMethod() {

//can create a member class instance in outer class' instance method

Inner1 inner1 = new Inner1();

}

}

class Test {

public Test() {

//cannot create member class instance directly in class other than outer class

//Outer.Inner2 inner2 = new Outer.Inner2();

//create a member class instance outside it's outer class

Outer outer = new Outer();

Outer.Inner1 inner1 = outer.new Inner1();

}

}

2.1 成员类特性

·类似于外部类的实例函数,成员类有public/private/default权限修饰符

·一个成员类实例必然所属一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数。

2.2 成员类约束

成员类不能与外部类重名

不能在成员类中定义static字段、方法和类(static final形式的常量定义除外)。因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去

成员类不能是接口(interface)。因为成员类必须能被某个外部类实例实例化,而接口是不能实例化的。事实上,如示例代码所示,如果你以成员类的形式定义一个接口,该接口实际上是一个静态成员类,static 关键字对inner interface是内含(implicit)的。

2.3 新增语法

一个成员类实例必然所属于其外部类的一个实例,那么如何在成员类内部获得其所属外部类实例呢?如示例代码所示,采用“OuterClass.this”的形式。

2.4 指定内部类实例所属的外部类实例

内部类实例可在其外部类的实例方法中创建,此新创建内部类实例所属的外

部类实例自然就是创建它的外部类实例方法对应的外部类实例。

另外,如示例代码所示,对于给定的一个外部类实例outerClass,可以直接创建其内部类实例,语法形式为:

OuterClass.InnerClass innerClass = outerClass.new InnerClass();

2.5 什么时候使用成员类

成员类的显着特性就是成员类能访问它的外部类实例的任意字段与方法。方便一个类对外提供一个公共接口的实现是成员类的典型应用。

以JDK Collection类库为例,每种Collection类必须提供一个与其对应的Iterator实现以便客户端能以统一的方式遍历任一Collection实例。每种Collection类的Iterator实现就被定义为该Collection类的成员类。例如JDK中AbstractList类的代码片断:

public abstract class AbstractList extends AbstractCollection implements List {

private class Itr implements Iterator {

………;

}

public Iterator iterator() {

return new Itr();

}

}

因为定义在AbstractList中的Itr可访问AbstractList中的任意字段和方法,所以很方便实现Iterator,无需AbstractList对外暴露更多的接口。

试想,如果没有成员类机制,只有在AbastractList源码之外定义一个实现Iterator的类Itr,该类有一个AbstractList实例成员list,为了Itr能获取list的内部信息以便实现遍历,AbstractList必然要向Itr开放额外的访问接口。

3 Local class(局部类)

对一个静态成员类,去掉其声明中的“static”关键字,

将其定义移入其外部类

的静态方法或静态初始化代码段中就成为了局部静态成员类。

对一个成员类,将其定义移入其外部类的实例方法或实例初始化代码中就成为了局部成员类。

局部静态成员类与静态成员类的基本特性相同。例如,都只能访问外部类的静态字段或方法,但不能访问外部类的实例字段和实例方法等。

局部成员类与成员类的基本特性相同。例如,局部成员类实例必属于其外部类的一个实例,可通过OuterClass.this引用其外部类实例等。

另外,局部类也有其自己的特性,如以下代码所示:

public class Outer {

private int instanceField;

private static int staticField;

//define a local member class in instance code block

{

int localVirable1 = 0;

final int localVirable2 = 1;

class Inner1 {

public Inner1() {

//can access its outer class' field and method directly

instanceField = 1;

//use OuterClass.this to get its corresponding outer class instance

Outer.this.instanceField = 1;

//can not access the not final local virable in its containing code block

//System.out.print(localVirable1);

//can access the final local virable in its containing code block

System.out.print(localVirable2);

}

}

//local class can not have privilege modifier

/*public class inner2 {

}*/

}

// define a local static member class in static code block

static {

class Inner2 {

public Inner2() {

staticField = 1;

//can not access instance field and method in a local static member class

//intanceField = 2;

}

}

}

public void intanceMethod() {

//define a local class in its out class' instance method

class Inner3 {

}

//local class is visible only in its containning code block

//Outer.Inner2 inner2;

}

private static void staticMethod() {

//define a local static member class in its out class' static method

class Inner4 {

public Inner4() {

staticField = 2;

}

}

//can not define a interface as a local class

/*interface I {

}*/

}

}

3.1 局部类特性

如示例代码所示,局部类能且只能访问其所属代码段中的声明为final的局部

变量。为什么只能访问声明为final的局部变量呢?我们知道,局部变量在其所属的代码段(譬如某个函数)执行完毕后就会被回收,而一个局部类的实例却可以在其类定义所属代码段执行完毕后依然存在,如果它可操控非final的局部变量,用户就可以通过该实例修改已不存在的局部变量,无意义。

3.2 局部类约束

如示例代码所示,内部类只在定义它的代码段中可见,不能在它所属代码段之外的代码中使用;因此也就没有public/private/default权限修饰符(无意义)

不能以局部类形式定义一个接口。局部类只在其所属代码段中可见,定义这样的接口无意义

局部类类名不能与其外部类类名重复

3.3 什么时候使用局部类

局部类大部分以匿名类的形式使用。

4 Anonymous class(匿名类)

没有类名的局部类就是匿名类。用一条语句完成匿名类的定义与实例创建。例

如如下代码:

public class Outer {

public void instanceMethod() {

//define a nonymous class which implements Action interface and creat an instance of it

Action action = new Action() {

public void doAction() {

System.out.println("a simple anonymous class demo");

}};

action.doAction();

//define a nonoymous class which extends BaseClass and create an instance of it

new BaseClass(5) {

public void printData(){

System.out.println("data = " + getData());

}

}.printData(); //"data = 5" will be outputed

}

}

interface Action {

void doAction();

}

class BaseClass {

private int data;

public BaseClass (int data) {

this.data = data;

}

public int getData() {

return data;

}

}

4.1 匿名类特性与约束

匿名类是一种特殊的局部类。局部类的特性与约束都适用与它。

4.2 新增语法

4.2.1 继承自某个基类的匿名类

new class-name ( [ argument-list ] ) { class-body }

创建匿名类实例时,“argument-list”将被传入其基类(即class-name)对应的构造函数。

4.2.2 实现某个接口的匿名类

new interface-name () { class-body }

4.3 什么时候使用匿名类

该类定义代码段很短

只需要创建该类的一个实例

类的定义代码与类的使用代码紧邻

使用匿名不影响代码的易读性

譬如,如下实现类似与c的callback功能的代码就是匿名类的典型应用:

File f = new File("/src"); // The directory to list

// Now call the list() method with a single FilenameFilter argument

// Define and instantiate an anonymous implementation of FilenameFilter

// as part of the method invocation expression.

String[] filelist = f.list(new FilenameFilter() {

public boolean accept(File f, String s) { return s.endsWith(".java"); }

}); // Don't forget the parenthesis and semicolon that end the method call!

Java集合类知识点总结

Java集合类 Java集合类 (1) 1.Map (3) 1.1.HashMap (3) 1.1.1.底层实现 (3) 1.1.2.特点 (3) 1.1.3.源码分析 (4) 1.1.4.多线程可能出现的问题 (5) 1.2.ConcurrentHashMap (6) 1.2.1.底层实现 (6) 1.2.2.源码分析 (7) 1.3.HashTable (9) 1.3.1.HashTable是线程安全的,因为所有方法上都加了synchronized关键 字。9 1.3.2.HashTable的key和value都不可以为null。 (9) 1.3.3.扩容时,capacity=2*capacity+1 (9) 1.3.4.数组默认大小为11 (9) 1.3.5.查找下标时,没有使用hash&length-1,而是直接进行计算的 (9) 1.4.TreeMap (9) 1.4.1.底层实现为红黑树 (9) 1.4. 2.TreeMap是一个有序的key-value集合,基于红黑树实现。该映射根据 其键的自然顺序进行排序,或者根据创建时提供的Comparator进行排序 (10) 1.4.3.接口实现 (10) 1.4.4.Entry (11) 1.5.LinkedHashMap (11) 1.5.1.底层是数组+链表+红黑树+双向链表 (11) 1.5.2.维护链表顺序和访问顺序 (11) 1.5.3.LinkedHashMap 可以通过构造参数 accessOrder 来指定双向链表是否在 元素被访问后改变其在双向链表中的位置。 (11) 1.5.4.当accessOrder为true时,get方法和put方法都会调用recordAccess 方法使得最近使用的Entry移到双向链表的末尾;当accessOrder为默认值 false时,recordAccess方法什么也不会做。 (11) 1.5.5.LRU实现 (11) 2.Collection (11) 2.1.List (12) 2.1.1.ArrayList (12) 2.1.2.LinkedList (13) 2.1.3.CopyOnWriteArrayList (13) 2.2.Set (14) 2.2.1.HashSet (14)

java内部类练习题

内部类练习题 一、按要求填空 1.请在以下代码的基础上完成下面几个小题 (1)在①和②的位置标注出内部类和外部类 (2)在③的位置定义一个count变量用来存放Circle实例的个数,并在④的位置编写语句用来统计Circle实例的个数。 (3)在⑤和⑥处根据注释语句填写代码 (4)在main()⑦的位置上编写语句调用Draw类中的drawSahpe()。 (5)将修改后的完整代码拷贝在下方: class Circle { //① private double radius = 0; ③ public Circle(double radius) { this.radius = radius; ④ } class Draw { //② public void drawSahpe() { ⑤ //输出radius变量的值 ⑥ //输出count变量的值 } } } public class OuterInnerClass { public static void main(String[] args) { ⑦ //编写语句调用Draw类中的drawSahpe() } } 答案: class Circle { //①外部类 private double radius = 0; static int count=0; public Circle(double radius) { this.radius = radius; count++; } class Draw { //②内部类

public void drawSahpe() { System.out.println(radius); System.out.println(count); } } } public class OuterInnerClass { public static void main(String[] args) { Circle objCircle=new Circle(10); Circle.Draw objDraw=objCircle.new Draw(); objDraw.drawSahpe(); } } 2.程序填空,使程序运行结果为 30 20 10 public class Demo{ public static void main (String[] args) { Outer.Inner obj=new Outer().new Inner(); obj.show(); } } class Outer{ public int number=10; class Inner{ public int number=20; public void show() { int number=30; System.out.print( ); System.out.print( ); System.out.print( ); } } } 答案: public class Demo{ public static void main (String[] args) { Outer.Inner obj=new Outer().new Inner(); obj.show();

javamath类常用方法

例如求平方根的(n),求a的b次方(a, b),求绝对值(n)等很多。下面是一些演示。publicclassMathTest { publicstaticvoidmain(String[]args) { intn=16; ? 3)); ? ? } } publicclassMathDemo{ publicstaticvoidmain(Stringargs[]){ /** *abs求绝对值 */ 的时候会取偶数 */ // // // // // // // // // // /** *round四舍五入,float时返回int值,double时返回long值 */ //10 //11 //11 //11 //-10 //-11 //-11 //-10 } }

函数(方法) 描述 IEEEremainder(double,double) 按照IEEE754标准的规定,对两个参数进行余数运算。 abs(inta) 返回int值的绝对值 abs(longa) 返回long值的绝对值 abs(floata) 返回float值的绝对值 abs(doublea) 返回double值的绝对值 acos(doublea) 返回角的反余弦,范围在到pi之间 asin(doublea) 返回角的反正弦,范围在-pi/2到pi/2之间 atan(doublea) 返回角的反正切,范围在-pi/2到pi/2之间 atan2(doublea,doubleb) 将矩形坐标(x,y)转换成极坐标(r,theta) ceil(doublea) 返回最小的(最接近负无穷大)double值,该值大于或等于参数,并且等于某个整数cos(double) 返回角的三角余弦 exp(doublea) 返回欧拉数e的double次幂的值 floor(doublea) 返回最大的(最接近正无穷大)double值,该值小于或等于参数,并且等于某个整数log(doublea) 返回(底数是e)double值的自然对数 max(inta,intb) 返回两个int值中较大的一个 max(longa,longb) 返回两个long值中较大的一个 max(floata,floatb) 返回两个float值中较大的一个 max(doublea,doubleb) 返回两个double值中较大的一个 min(inta,intb) 返回两个int值中较小的一个 min(longa,longb) 返回两个long值中较小的一个 min(floata,floatb)

JAVA中常用的集合类型

JAVA常用的高级数据类型——集合类型 一、JAVA语言中的集合类型主要有三种形式:Set(集)、List(列表)、Map(映射),每种类型的集合都包括三部分:接口、实现和算法。 a)集合接口实现集合的操作和集合的具体功能实现细节的相互分离—— Set接口、List接口、Map接口 b)集合的具体功能实现类实质上是各种可重用的数据结构的具体表示 List接口的实现类有ArrayList、LinkedList、Stack和Vector等 集合类,Vector 类提供了实现可增长数组的功能,随着更多元素加 入其中,数组变的更大。在删除一些元素之后,数组变小。 Set接口的实现类有HashSet、LinkedHashSet和TreeSet等集合类 Map接口的实现类有HashMap、Hashtable、LinkedHashMap、Properties和TreeMap等集合类。 c)集合的算法指可以对实现集合接口的各个集合的功能实现类提供如排 序、查找、交换和置换等方面的功能实现。 二、List接口 1.List接口代表有序的集合,可以对List接口代表的有序集合中每个元素 的插入位置进行精确地控制,并利用元素的整数索引(代表元素在集合中的位置)访问元素中的各个成员,List接口代表的集合是允许出现重复元素的。 2.List接口主要成员方法: 1)void add(int index,E element)在列表指定位置插入指定元素 2)E get(int index) 返回结合中指定位置的元素 3)E remove(int index) 移除集合中指定位置的元素 4)E set(int index,E elment) 用指定元素替换集合中指定位置的元素 5)boolean add(E o) 向列表的尾部追加指定的元素 6)boolean contains(Object o) 如果列表包含指定的元素,则返回true。 7)boolean isEmpty() 如果列表不包含元素,则返回 true。 8)int size() 返回列表中的元素数 9)Iterator iterator()返回以正确顺序在列表的元素上进行迭代的迭代器。 3.List的实现类 List在数据结构中分别表现为数组(ArrayList)、向量(Vector)、链表(LinkedList)、堆栈(Stack)和队列等形式。 Vector集合和ArrayList集合都是采用数组形式来保存对象,区别在于ArrayList集合本身不具有线程同步的特性,不能用在多线程的环境下,可以使用ArrayList集合能够节省由于同步而产生的系统性能的开销。而Vector集合实现了对线程同步的支持,因此在多线程并发访问的应用环境下,该集合本身能够保证自身具有线程安全性。在多线程的并发访问中,可以将Vector集合的对象实例设计为类中的成员属性,而应该将ArrayList 集合的对象实例设计为局部对象。 public class UserInfo{ List oneVector=new Vector(); public void execute(){

匿名内部类

中的匿名内部类总结 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象方法 abstract class Person { public abstract void eat(); } class Child extends Person { public void eat() { System.out.println("eat something"); } } public class Demo { public static void main(String[] args) { Person p = new Child(); p.eat(); } } 运行结果:eat something 可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person 类的引用 但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦? 这个时候就引入了匿名内部类 实例2:匿名内部类的基本实现 abstract class Person { public abstract void eat(); } public class Demo { public static void main(String[] args) { Person p = new Person() { public void eat() { System.out.println("eat something"); } }; p.eat(); } } 运行结果:eat something 可以看到,我们直接将抽象类Person中的方法在大括号中实现了 这样便可以省略一个类的书写

Java常用类

常用类 (1)字符串相关类(String,StringBuffer) 1)https://www.360docs.net/doc/f02191793.html,ng.String类代表不可变得字符序列; 2)"***"为该类的一个对象; 3)String类的常见构造方法:String(String original)//创建一个String对象为original 的拷贝;String(char[] value)//用一个字符数组创建一个String对象;String(char[] value,int offset,int count); 4)String 类的常用方法:char charAt(int index)//返回第index个字符、int length()//返回字符串的长度、int indexOf(String str)//返回字符串中出现Str的第一个位置;int indexOf(String str,int fromIndex)//返回字符串中从fromindex开始出现Str的第一个位置;boolean equalsIgnoreCase(string another)//比较是否相等,忽略大小写;String replace(char olochar,char newchar);boolean startswith(String prefix)//判断字符串是否以prefix字符串开头;boolean endsWith(String suffix);String toUpperCase()//返回一个字符串为该字符串的大写形式;String toLowerCase();String substring(int beginIndex0)//返回该字符串从beginindex开始到结尾的子字符串;String substring(int beginindex,int endindxt);String trim()//返回将该字符串去掉开头和结尾空格后的字符串。静态重载方法:public static String valueOf(。。。)//将基本类型数据转换为字符串。String[] split(String regex)//将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组。 (2)StringBuffer类:可变的字符串序列; 1)构造方法:StringBuffer();StringBuffer(string str); 2)常用方法:StringBuffer append();insert();delete();indexOf();rerverse(); (2)基本数据类型包装类:Integer,Double将基本数据类型包装成一个对象; (2)Math类:方法 (3)File类:各类的方法 (4)枚举类Enum:只能够取特定值中的一个,使用enum关键字,是https://www.360docs.net/doc/f02191793.html,ng.Enum类型;

java集合类总结

1.本讲内容:集合collection (数组和集合90%功能相似,但是最大的区别是,数组在初始化的时候必须确定大小,而集合不用,而且集合是一堆的类,使用起来非常方便。) 讲集合collection之前,我们先分清三个概念: 1colection 集合,可用来存储任何对象的一种数据结构(容器)。 2Collection 集合接口,指的是,是Set、List 和Queue 接口的超类接口 3Collections 集合工具类,指的是类。 SCJP考试要求了解的接口有:Collection , Set , SortedSet , List , Map , SortedMap , Queue , NavigableSet , NavigableMap, 还有一个Iterator 接口也是必须了解的。 SCJP考试要求了解的类有:HashMap , Hashtable ,TreeMap , LinkedHashMap , HashSet , LinkedHashSet ,TreeSet , ArrayList , Vector , LinkedList , PriorityQueuee , Collections , Arrays 下面给出一个集合之间的关系图: 上图中加粗线的ArrayList 和HashMap 是我们重点讲解的对象。下面这张图看起来层级结构更清晰些。 我们这里说的集合指的是小写的collection,集合有4种基本形式,其中前三种的父接口是Collection。 4List 关注事物的索引列表 5Set 关注事物的唯一性 6Queue 关注事物被处理时的顺序 7Map 关注事物的映射和键值的唯一性 一、Collection 接口 Collection接口是Set 、List 和Queue 接口的父接口,提供了多数集合常用的方法声明,包括add()、remove()、contains() 、size() 、iterator() 等。 add(E e) 将指定对象添加到集合中 remove(Object o) 将指定的对象从集合中移除,移除成功返回true,不成功返回false contains(Object o) 查看该集合中是否包含指定的对象,包含返回true,不包含返回flase size() 返回集合中存放的对象的个数。返回值为int clear() 移除该集合中的所有对象,清空该集合。 iterator() 返回一个包含所有对象的iterator对象,用来循环遍历 toArray() 返回一个包含所有对象的数组,类型是Object toArray(T[] t) 返回一个包含所有对象的指定类型的数组 我们在这里只举一个把集合转成数组的例子,因为Collection本身是个接口所以,我们用它的实现类ArrayList做这个例子:例子1: package edu.xjfu;

JAVA内部类的作用、方法、使用

引用:JAVA内部类的作用、方法、使用 今天,因为在程序中使用内部类[事件],但要将外部类传递到调用类里面。 在内部类如何调用外部类,通过网络搜索,找到了方法: outclass.this,可以在内部类里引用外部类对象。 当然,还有其他的一些设计与说明,非常的好! 内部类:一个内部类的定义是定义在另一个内部的类。 原因是: 1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。 2.对于同一个包中的其他类来说,内部类能够隐藏起来。 3.匿名内部类可以很方便的定义回调。 4.使用内部类可以非常方便的编写事件驱动程序。 提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比。内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦。学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地设计你的程序结构。下面从以下几个方面来介绍: * 第一次见面 public interface Contents { int value(); } public interface Destination { String readLabel(); } public class Goods { private class Content implements Contents { private int i = 11; public int value() { return i; } } protected class GDestination implements Destination { private String label; private GDestination(String whereTo) { label = whereTo; }

JAVA中常用类的常用方法

JAVA中常用类的常用方法 一、类 1、clone()方法 创建并返回此对象的一个副本。要进行“ 克隆” 的对象所属的类必须实现. Cloneable接口。 2、equals(Object obj)方法 功能:比较引用类型数据的等价性。 等价标准:引用类型比较引用,基本类型比较值。 存在特例:对File、String、Date及封装类等类型来说,是比较类型及对象的内 容而不考虑引用的是否为同一实例。 3、finalize()方法 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 4、hashCode()方法 返回该对象的哈希码值。 5、notify()方法 唤醒在此对象监视器上等待的单个线程。 6、notifyAll()方法 唤醒在此对象监视器上等待的所有线程。 7、toString()方法 返回该对象的字符串表示。在进行String与其它类型数据的连接操作时,自动调用toString()方法。可以根据需要重写toString()方法。 8、wait()方法 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。 二、字符串相关类 String类 charAt(int index) 返回指定索引处的 char 值。 compareTo(String anotherString) 按字典顺序比较两个字符串。 compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。 concat(String str) 将指定字符串连接到此字符串的结尾。 endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 equals(Object anObject) 将此字符串与指定的对象比较。 equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比 较,不考虑大小写。 indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 indexOf(String str) 返回第一次出现的指定子字符串在此字符串中的索引。 lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 length() 返回此字符串的长度。 replace(char oldChar, char newChar)

Java中的集合类

Java中的集合类 (Collection framework)我们在前面学习过java数组,java数组的程度是固定的,在同一个数组中只能存放相同的类型数据。数组可以存放基本类型的数据,也可以存入对象引用的数据。 在创建数组时,必须明确指定数组的长度,数组一旦创建,其长度就不能改变,在许多应用的场合,一组数据的数目不是固定的,比如一个单位的员工数目是变化的,有老的员工跳槽,也有新的员工进来。 为了使程序方便地存储和操纵数目不固定的一组数据,JDK中提供了java集合类,所有java集合类都位于java.util包中,与java数组不同,java集合类不能存放基本数据类型数据,而只能存放对象的引用。 Java集合类分为三种 Set(集合):集合中对象不按特定的方式排序。并且没有重复对象,但它有些实现类中的对象按特定方式排序。--无序,不能重复 List(列表):集合中的对象按照检索位置排序,可以有重复对象,允许按照对象在集中的索引位置检索对象,List和数组有些相似。--有序,可以重复 Map(映射):集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复,它的有些实现类能对集合中的键对象进行排序。 Java的主要集合类的框架图 Collection和Iterator接口 在Collection接口中声明了适用于java集合(只包括Set和List)通用方法。 Collection接口的方法 方法描述

boolean add(Object o) 向集合中加入一个对象的引用 void clear( ) 删除集合中所有对象,即不再对持有对象的引用boolean contains(Object o) 判断在集合中是否含有特定对象的引用 boolean isEmpty() 判断集合是否为空 Iterator iterator( ) 返回一个Iterator对象,可用它来遍历集合中的元素boolean remove(Object o) 从集合中删除一个对象的引用 int size( ) 返回集合中元素的数目 Object [ ] toArray() 返回一个数组,该数组包含集合中的所有元素 Set接口和List即可都继承了Collection接口,而Map接口没有继承Collection接口,因此可以对Set对象和List对象调用以上方法,但是不能对Map对象调用以上方法。Collection接口的iterator()和toArray()方法多用于获得集合中的所有元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组。 Iterator隐藏底层集合的数据结构,向客户程序提供了遍历各种类型的集合的统一接口。Iterator接口中声明了如下方法: ●hasNext():判断集合中的元素是否遍历完毕,如果没有,就返回true。 ●next():返回下一个元素 ●remove():从集合中删除上一个由next()方法返回的元素。 注意:如果集合中的元素没有排序,Iterator遍历集合中元素的顺序是任意的,并不一定与像集合中加入的元素的顺序一致。 Set(集) Set是最简单的一种集合,集合中的对象不按特定方式排序,并没有重复对象。Set接口主要有两个实现类:HashSet类还有一个子类LinkedHashSet类,它不仅实现了哈希算法,而且实现了链表数据结构,链表数据结构能提高插入核算出元素的性能。TreeSet类实现了SortedSet接口中,具有排序功能。 List(列表) List的主要特征使其元素已先行方式存储,集合中允许存放重复对象。List接口主要的实现类包括: ●ArrayList—ArrayList代表长度可变的数组。允许对元素进行快速的随机访问,但是向 ArrayList中插入与删除元素的速度较慢。 ●LinkedList—在实现中采用链表数据结构。对顺序访问进行了优化,向List中插入和 删除元素的速度较快,随机访问速度则相对较慢,随机访问是指检索位于特定索引位置元素。 Map(映射) Map(映射)是一种吧键对和值对象进行映射的集合。它的每一个元素都包含一对键对象和值对象,而之对象仍可以是Map类型。以此类推,这样就形成了多级映射。向Map集合中加入元素时,必须提供一对键对象和值对象,从Map集合上检索元素只要给出键对象,就会返回值对象。 实例1 CollectionAll.java

JAVA中常用类的常用方法

JAVA屮常用类的常用方法 一.java?丨ang.Object 类 1、clone()方法 创建丼返M此对象的一个副木。要进行“克隆”的对象所属的类必须实现https://www.360docs.net/doc/f02191793.html,ng. Cloneable 接口。 2、equals(Objectobj)方法 0 功能:比较引用类型数据的等价性。 0 等价标准.?引用类型比较引用,基木类型比较值。 0 存在特例.?对File、String、Date及封装类等类型来说,是比较类型及对象的内稃而+ 考虑引用的是否为同一实例。 3、finalize〇方法 当垃圾丨"丨收器确定>(、存在对该对象的更多引用时,由对象的垃圾丨"丨收器调用此方法。 4、hashCode〇方法返 回该对象的哈希码值。 5、notify〇方法 唤醒在此对象监视器上等待的中?个线祝。 6、notifyAII〇方法 唤醒在此对象监视器上等待的所有线程= 7、toString()方法 返W该对象的字符串表示。在进行String与其它类型数据的连接操作时,&动调用tostringo 方法。可以根据耑要重写toStringO方法。 8、wait()方法 在其他线程调用此对象的n〇tify()方法或notifyAIIO方法前,异致当前线程等待。 二、字符串相关类 I String 类 charAt(int index)返回指定索引处的char值。compareTo{String anotherString)按字

典顺序比较两个字符串。compareTolgnoreCase(Stringstr)按字典顺序比较两个字 符串,不考虑人小写。concat(String str)将指定字符串连接到此字符串的结尾。 endsWith(String suffix)测试此字符串是否以指定的〗?缀结束。equals{Object anObject)将此字符串与指定的对象比较。 equalslgnoreCase(String anotherString)将此String 与另一个String 比较,考虑人小'与’。indexOf(int ch)返H指定字符在此字符串屮第一次出现处的索引。 indexOf(String str)返回第一次出现的指定子字符串在此字符串屮的索引, lastlndexOf(intch)返回指定字符在此字符串中最后??次出现处的索引。 length()返|n丨此字符串的长度。 replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。 split(String regex)根据给定正则表达式的匹配拆分此字符串。startsWith{String prefix)测试此字符 串是否以指定的前缀开始。substring(int beginlndex) 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 substring(int beginlndex, int endlndex) 返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginlndex 处开始,一直到索引endlndex-1处的字符。 t〇CharArray()将此字符串转换为一个新的字符数组。

关于JAVA内部类的说明与使用

关于JAVA内部类的说明与使用 1.关于内部类的说明 1)在一个类中定义另外一个类,这个类就叫做内部类(inner class) 。内部类的定义和普通类的定义没什么区别,它可以直接访问和引用它的外部类的所有变量和方法(包括private),就像外部类中的其他非static成员的功能一样。区别是,外部类只能声明为public和default,而内部类可以声明为private 和protected。 2)当我们建立一个inner class时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的this reference形成的,当内部类的成员方法中访问某个变量/方法时,如果在该方法和内部类中都没有定义过这个变量,调用就会被传递给内部类中保存的那个外部类对象的引用(OuterClass.this),通过那个外部类对象的引用去调用这个变量。 2.内部类变量访问 2.1在main中直接从外部类调用内部类的方法 class Outer { private int index = 100; class Inner { private int index = 50; void print() { int index = 30; System.out.println(index); // 30 System.out.println(this.index); // 50 System.out.println(Outer.this.index); // 100 } } void print() { Inner inner = new Inner();//得到内部类的引用 inner.print(); } } class Test { public static void main(String[] args) {

Java中集合类用法总结

帮助 | 留言交? | 登录 首页我的图书馆主题阅读精彩目录精品文苑Tags 会员浏览好书推荐 以文找文 如何对文章标记,添加批注? Java 中集合?用法总结(转载) wade0564 收录于2010-07-08 阅读数:查看 收藏数:7 公众公开 原文来源 tags : java 集合类 欢迎浏览 wade0564 个人图书馆中收藏的文章,想收藏这篇好文章吗,赶快 吧,1分钟拥有自己的个人图书馆! 我也要收藏 举报 Java 中集合?用法总结 收藏 Collection ├List │├LinkedList │├ArrayList (异步,线程不安全,空间用完时自动增长原容量一半)│└Vector (同 步,线程安全,空间用完时自动增长原容量一倍)│ └Stack └Set ├HashSet └TreeSet Map ├Hashtable ├HashMap ├WeakHashMap └TreeMap Map 接口: | + -- WeakHashMap: 以弱键 实现的基于哈希表的 Map 。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条 | 目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为 可终止的,被终 | 止,然后被回收。丢弃某个键时, 其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。此实现 | 不是同步的。 | + -- TreeMap:该映射根据其键的自然顺序进行 排序,或?根据创建映射时提供的 Comparator 进行 排序,具体取决于使用的 | 构造方法。此实现不是同步的。 | + -- HashMap:基于哈希表的 Map 接?的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了 | 非同步和允许 使用 null 之外,HashMap 类与 Hashtable ?致相同。)此类不保证映射的顺序,特别是它不保证该顺 | 序恒久不变。此实现不是同步的。 | +-- SortedMap: 进一步提供关于键的总体排序 的 Map 。该映射是根据其键的自然顺序进 行排序的,或?根据通常在创建有 序映射时提供的 Comparator 进行排序。对有序映射的 collection 视图(由 entrySet 、keySet 和 values 方法返回 )进行迭代时,此顺序就会反映 出来。要采用此排序方式,还需要提供一些其他操作(此接?是 SortedSet 的对应映 射)。 Collection 接口: | 热点推荐 中国经典汤品——广东汤常用多音字汇总 如果你失恋。。。这些话...影响世界的100个管理定律汽车发动机?作过程和原理分析温家宝总理答中外记?问女人味,有多少男人可以读懂?珍稀的白头叶猴(组图)三鹿门事件之——中国,...国家公务员职务与级别当代古筝四美 付娜《渔...生活?秘方 真的很实用...哲理?品:守护梦想聚会时可以玩的?游戏依赖型人格障碍的表现和治疗经典妙语,十分精彩江边施救[贴图]李一男2003年在港湾...电脑速度慢的解决方法 ...重装系统后必须做的10件?事

java四种方法事件监听(匿名类,外部类,内部类,自身)

JAVA四种方法实现事件监听 1.外部类实现事件监听: import java.awt.*; import java.awt.event.*; import javax.swing.*; publicclass Listener1extends JFrame { JButton button1,button2; JPanel pane1,pane2,p1,p2; CardLayout card1=new CardLayout(); /*CardLayout布局方式将容器中的每个组件看作一张卡片。 一次只能看到一张卡片,容器则充当卡片的堆栈*/ Listener1(){ this.setTitle("外部类实现事件监听"); this.setBounds(200,200,300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); init(); } publicvoid init(){ p1=new JPanel(); p1.add(new JLabel("第一个面板")); p1.setBackground(Color.red); p2=new JPanel(); p2.add(new JLabel("第二个面板")); p2.setBackground(Color.green); pane1=new JPanel(card1); pane1.add("红色", p1); pane1.add("绿色", p2); button1=new JButton("红色"); button2=new JButton("绿色"); pane2=new JPanel(); pane2.add(button1); pane2.add(button2); this.add(pane1,BorderLayout.CENTER); this.add(pane2,BorderLayout.SOUTH); button1.addActionListener(new ColorEvent(card1,pane1));

JAVA中常用类的常用方法

JAVA中常用类的常用方法 一、https://www.360docs.net/doc/f02191793.html,ng.Object类 1、clone()方法 创建并返回此对象的一个副本。要进行“克隆”的对象所属的类必须实现https://www.360docs.net/doc/f02191793.html,ng. Cloneable接口。 2、equals(Object obj)方法 ?功能:比较引用类型数据的等价性。 ?等价标准:引用类型比较引用,基本类型比较值。 ?存在特例:对、Date及封装类等类型来说,是比较类型及对象的内容而不考虑引用的是否为同一实例。 3、finalize()方法 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 4、hashCode()方法返回该对象的哈希码值。 5、notify()方法唤醒在此对象监视器上等待的单个线程。 6、notifyAll()方法唤醒在此对象监视器上等待的所有线程。 7、toString()方法 返回该对象的字符串表示。在进行String与其它类型数据的连接操作时,自动调用toString()方法。可以根据需要重写toString()方法。 8、wait()方法 在其他线程调用此对象的notify() 方法或notifyAll() 方法前,导致当前线程等待。 二、字符串相关类 l String类 charAt(int index) 返回指定索引处的char 值。 compareTo(String anotherString) 按字典顺序比较两个字符串。 compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。 concat(String str) 将指定字符串连接到此字符串的结尾。 endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 equals(Object anObject) 将此字符串与指定的对象比较。 equalsIgnoreCase(String anotherString) 将此String 与另一个String 比较,不考虑大小写。indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 indexOf(String str) 返回第一次出现的指定子字符串在此字符串中的索引。 lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 length() 返回此字符串的长度。 replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用newChar 替换此字符串中出现的所有oldChar 得到的。split(String regex) 根据给定正则表达式的匹配拆分此字符串。 startsWith(String prefix) 测试此字符串是否以指定的前缀开始。 substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginIndex 处开

java集合-练习题解析

1. 填空 Collection 接口的特点是元素是___无序可重复______; List 接口的特点是元素__有__(有|无)顺序,_可以___(可以|不可以)重复; Set 接口的特点是元素__无___(有|无)顺序,____不可以__(可以|不可以)重复;Map 接口的特点是元素是__key、value映射______,其中__value__可以重复,_key___不可以重复。 2. (List)有如下代码 import java.util.*; public class TestList{ public static void main(String args[]){ List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(1, “Learn”); list.add(1, “Java”); printList(list); } public static void printList(List list){ //1 for(int i = 0; i< list.size();i++){ System.out.println(list.get(i)); } for(Object o : list) { System.out.println(o); } Iterator itor = list.iterator(); while(itor.hasNext()){ System.out.println(itor.next()); } } } 要求: 1) 把//1 处的代码补充完整,要求输出list 中所有元素的内容 2) 写出程序执行的结果Hello Java Learn World 3) 如果要把实现类由ArrayList 换为LinkedList,应该改哪里?ArrayList 和LinkedList 使用上有什么区别?实现上有什么区别? 4) 如果要把实现类由ArrayList 换为Vector,应该改哪里?ArrayList 和Vector 使 用上有什么区别?实现上有什么区别? 3. (List)写出下面程序的运行结果

相关文档
最新文档