??xml version="1.0" encoding="utf-8" standalone="yes"?>
a> 在一个类中定义一个类Q这个类叫做内部类或者内|类(inner class).
b> 内部cd以让我们逻辑上相关的一l类l织hQƈ由外部类(outer class)
来控制内部类的可见?
c> 当我们徏立一个inner class的时?其对象就拥有了与外部cd象之间的一U关p?
q是通过一个特D的this inference形成的,使得内部cd象可以随意的讉K外部
cM的所有成员?br />d> 在内部类中可以访问外部类的私有成员变量,也就是在内部cM可以随意的访?br /> 外部cM的所有的成员Ҏ和变?br />e> 可以把内部类攑ֈ一个方法中来定义,但是它的使用范围必须是在q个Ҏ?br />f> 当我们在一个方法中定义一个内部类Ӟ如果我们需要在Ҏ中内部类去访问这?br /> 本地变量Q方法中声明的变量)Ӟ我们必须把这个变量声明ؓfinal才行Q不?br /> ~译器会报错
eg:
void fn(int final a)
{
if(true)
{
class Middle
{
private int index=70;
class Inner
{
private int index=60;
void print()
{
int index=80;
System.out.println(index); //讉Kprint()Ҏ中的index=80变量
System.out.println(this.index); //讉KInnercȝ成员变量index=60;
System.out.println(Middle.this.index); //讉KMiddlecȝ成员变量index=70;
System.out.println(Outer.this.index); //讉KOutercȝ成员变量index=100;
}
}
}
}
}
f> 对于Innercȝ讉K权限我们可以声明为所有的(protected,private,public,default)?br />h> 对于内部cL_如果赯问权限ؓprotectedQ那么他可以在同一个类被访也可以在?br /> 一个包中被讉K。而如果声明ؓprivate的那么那只能在Outerq个外部c被讉K。我?br /> 可以把它生命为abstract(q个时候不能用Inner直接d例化一个内部类)Q我们可以在
外部cM定义一个类Q从Innerz出来Q直接实例化。当我们声明为finalQ那׃能再
z了,对于内部cL说还可以声明为staticQ那么这个时候就可以不需要同时存在外?br /> cȝ对象Q那么这个时候我们也不能讉K外部cȝ非静态的成员变量和方法。相当于切断
了与外部内对象的联系。非静态的内部cM能在内部cLw中定义静态的Ҏ(反之可以)?br /> 非static的内部类中的成员变量不能声明为static的,只在层cLstatic的内部类中可?br /> 声明为static的?br />g> Z么要使用内部c?
1.在内部类(inner class)中可以随意访问外部类中的成员Q让我们更好的管理和l织我们
的代码。增Z码的可读性?br /> 2.内部cȝ于创建适配器类,适配器类是用于实现接口的c,使用内部cL实现接口Q可?br /> 更好的定位与接口兌的方法在代码中的位置?br /> 3.其他的用?br /> a> 我们可以通过把内部类声明为private来隐藏接口的实现l节
b> 我们需要派生一个类Q同时又需要去实现一个接口,如果基类中有个方法和接口中的Ҏ
同名Q但是他们的用法不一P我们可以用内部cL解决?br />=============================================================================
内部cȝ一般用?
class Outer //Outer class
{
private int index=100; //U有的变?br /> /*
class Inner //Inner Class,independence individual
{ //可以整体的把Innercȝ成是Outercȝ一个成?br /> private int index=50;
void print()
{
int index=30;
System.out.println(index);
System.out.println(this.index);
System.out.println(Outer.this.index);
}
}*/
/*
*InnercM嵌套层ơ有多深Q都可以随意的访问外部的成员变量
*当我们在一个方法中定义一个内部类Ӟ如果我们需要在Ҏ中内部类去访问这?br /> *本地变量Q方法中声明的变量)Ӟ我们必须把这个变量声明ؓfinal才行Q不?br /> *~译器会报错
void fn(final int a)
{
final int b=1;
if(true)
{
class Middle
{
private int index=70;
class Inner
{
private int index=60;
void print()
{
int index=80;
System.out.println(index); //讉Kprint()Ҏ中的index=80变量
System.out.println(this.index); //讉KInnercȝ成员变量index=60;
System.out.println(Middle.this.index); //讉KMiddlecȝ成员变量index=70;
System.out.println(Outer.this.index); //讉KOutercȝ成员变量index=100;
System.out.println(a);
System.out.println(b);
}
}
}
}
}
/*
*我们可以把内部类攑ֈ一个方法中Q但是它的用范围也定在了这个方法的范围里,甚至可以攑ֈif()?br /> *代码块中{}中,它告诉我们,不管我们把Inner()嵌套有多深,它都可以随意的访问外部类中的所有成?br /> void fn()
{
class Inner
{
private int index=50;
void print()
{
int index=30;
System.out.println(index);
System.out.println(this.index);
System.out.println(Outer.this.index);
}
}
}
*/
static class Inner
{
private int index=50;
void print()
{
int index=80;
System.out.println(index); //讉Kprint()Ҏ中的index=80变量
System.out.println(this.index); //讉KInnercȝ成员变量index=60;
System.out.println(Outer.this.index); //讉KOutercȝ成员变量index=100;
}
}
void print()
{
//Inner inner=new Inner();
//inner.print();
}
/*
Inner getInner()
{
return new Inner();
}
*/
/*
public static void main(String[] args)
{
Outer outer=new Outer();
//outer.print();
//Inner in=outer.getInner();q是一句错误的代码Q因为Inner是定义在Outercȝ内部的,所以对外是
//不可见的Q这个时候需要我们,使用外部cd来调?br /> Inner in=outer.getInner(); //因ؓ现在main()Ҏ在Outerc里Q这个时候Innercd于main()Ҏ来说是可见的
Inner in=new Inner();
in.print();
}*/
}
class Test
{
/*public static void main(String[] args)
{
Outer outer=new Outer();
//outer.print();
//Inner in=outer.getInner();q是一句错误的代码Q因为Inner是定义在Outercȝ内部的,所以对外是
//不可见的Q这个时候需要我们,使用外部cd来调?br /> Outer.Inner in=outer.getInner();
in.print();
}*/
public static void main(String[] args)
{
Outer outer=new Outer();
//outer.print();
//Inner in=outer.getInner();q是一句错误的代码Q因为Inner是定义在Outercȝ内部的,所以对外是
//不可见的Q这个时候需要我们,使用外部cd来调?br /> //Outer.Inner in=outer.getInner();
Outer.Inner in=outer.new Inner(); //用外部类对象来?br /> in.print();
}
}
*****************************************************************************
从内部类z的用?
/*
*从内部类z的用?br />*/
class Car
{
class Wheel
{
}
}
class PlaneWheel extends Car.Wheel
{
PlaneWheel(Car car)
{
car.super(); //建立内部cd象到子类的引?br /> }
public static void main(String[] args)
{
Car car=new Car();
PlaneWheel pw=new PlaneWheel(car);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
内部cd现接?
//用内部类实现接口,接口不能被实例化
interface Animal
{
void eat();
void sleep();
}
class Zoo
{
private class Tiger implements Animal
{
public void eat()
{
System.out.println("Tiger eat!");
}
public void sleep()
{
System.out.println("Tiger sleep!");
}
}
Animal getAnimal()
{
return new Tiger();
}
/*
Animal getAnimal()
{
return new Animal()
{ //q是是匿名的类
public void eat()
{
System.out.println("Animal eat!");
}
public void sleep()
{
System.out.println("Animal sleep!");
}
}; //q是是匿名的类
}*/
}
class DoTest
{
public static void main(String[] args)
{
Zoo z=new Zoo();
Animal an=z.getAnimal();
an.eat();
an.sleep();
}
}
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
基类中有个方法和接口中的Ҏ,同名Q但是他们的用法不一?
//基类中有个方法和接口中的Ҏ,同名Q但是他们的用法不一?br />interface Machine
{
void run();
}
class Person
{
public void run()
{
System.out.println("run");
}
}
class Robot extends Person
{
private class MachineHeart implements Machine
{
public void run()
{
System.out.println("heart run");
}
}
Machine getMachine()
{
return new MachineHeart();
}
}
class Work
{
public static void main(String[] args)
{
Robot robot=new Robot();
Machine m=robot.getMachine();
m.run();
robot.run();
}
}
/*
class Feeder implements Cloneable
{
String name;
int age;
public Feeder(String name,int age)
{
this.name=name;
this.age=age;
}
public Object clone()
{
Object o=null;
try
{
o=super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
}
*/
class Feeder
{
String name;
int age;
public Feeder(String name,int age)
{
this.name=name;
this.age=age;
}
}
class Animal implements Cloneable
{
String name;
int weight;
Feeder f;
public Animal(String name,int weight,Feeder f)
{
this.name=name;
this.weight=weight;
this.f=f;
}
public String toString()
{
return "name="+name+","+"weight="+weight;
}
public Object clone()
{
Object o=null;
//Animal o=null;
try
{
o=super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
//o.f=(Feeder)f.clone();
return o;
}
}
我们看输出结?
F:\Java Develop>javac TestClone.java
F:\Java Develop>java TestClone
baidu
60
从结果可以看出来我们修改了an2.f.name和an.f.age但是an1d生了变化,q是因ؓ我们没有对Feederc进行克?q就是浅克隆,Z解决q个问题我们需要用到Deeply克隆,java默认的克隆方式是克?
代码如下:
class TestClone
{
public static void main(String[] args)
{
Feeder f=new Feeder("google",50);
Animal an1=new Animal("Dog",50,f);
Animal an2=(Animal)an1.clone();
an2.f.name="baidu";
an2.f.age=60;
System.out.println(an1.f.name);
System.out.println(an1.f.age);
}
}
class Feeder implements Cloneable
{
String name;
int age;
public Feeder(String name,int age)
{
this.name=name;
this.age=age;
}
public Object clone()
{
Object o=null;
try
{
o=super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
}
class Animal implements Cloneable
{
String name;
int weight;
Feeder f;
public Animal(String name,int weight,Feeder f)
{
this.name=name;
this.weight=weight;
this.f=f;
}
public String toString()
{
return "name="+name+","+"weight="+weight;
}
public Object clone()
{
//Object o=null;
Animal o=null;
try
{
o=(Animal)super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
o.f=(Feeder)f.clone();
return o;
}
}
输出l果如下:
F:\Java Develop>javac TestClone.java
F:\Java Develop>java TestClone
google
50
java克隆是指copyc里所有没有引用类型的变量.Deeply Clone则刚好相?
public class TestRegex
{
public boolean isEmail(String email)
{
//指定使用的模?br /> Pattern pattern=Pattern.compile
("\\p{Digit}+@\\w+\\.\\p{Alpha}{2,3}");
String[] words=pattern.split(email);
Matcher matcher=pattern.matcher(email);
if(matcher.find()&&words.length==0)
return true;
else
return false;
}
}
来看怎么用它:
Code:
public class Client
{
public static void main(String[] args)
{
TestRegex regex=new TestRegex();
String s1="DuYang163@gmail.com";
String s2="feiyang@126.123.com";
System.out.println(s1+(regex.isEmail(s1)?"?:"不是")+"Email格式!");
System.out.println(s2+(regex.isEmail(s2)?"?:"不是")+"Email格式!");
}
}
一些常用的表达式格?
文字(Literal): 表达式内M不具有特D意义的字符都被看做是一个文字,q与自n匚w?br />量词(Quantifier): 某些字符或者表辑ּQ他们被用来计算一个文字或分组可以字符列中出现的次敎ͼ以便该序列与表达式匹配?br />例:
? 表示出现一ơ或Ҏ不出现?br />* 表示出现零次或一ơ以?含一??br />+ 表示出现一ơ或多次?br />字符c?Character class): 一个字W类是Ҏ号内的一个字W集Q其中,匚w可以是括号内的Q意一个字W。可以把字符和量词结合v来,例如Q[acegikmoqsuwy*]
是只包含字母表中奇数字母的L字符列。某些字W列是预先定义好?
\d-数字(0?)
\DQ非数字
\s-I白字符Q如制表W或换行W?br />\S-非空白字W?br />\w-单字W?a到z,A到Z,0?以及下划U?
\W-非单字字W?其他L字符)
Posix 字符c?Posix character class): 某些字符仅在用于US-ASCII比较时才有效?br />例如Q?br />\p{Lower}-写字符
\p{Upper}-大写字符
\p{ASCII}-所有ASCII字符
\p{Alpha}-字符字符(\p{Lower}与\p{Upper}相结?
\p{Digit}-??的数?br />\p{Alnum}-字母数字字符
范围(Range): 使用短线(dash)来指定范围。例如:[A-J]表示从A到J的大写字母?br />否定(Negation): 使用脱字W^表示否定字符。例如:[^A-K]表示除A到K之外的Q何字W?/p>