学习笔记(五)接口与内部类(二)
来源:互联网 发布:企业怎样做网络推广 编辑:程序博客网 时间:2024/06/05 11:21
《Java编程思想》整理的一些学习笔记,有不对的地方,欢迎指出。
1.在匿名类中定义字段时,对其进行初始化操作。
interface Mount1{
String readLabel();
}
public class Fight1 {
public Mount1 mount(final String s){
return new Mount1(){
private String label = s;
public String readLabel(){
return label;
}
};
}
public static void main(String[] args){
Fight1 f = new Fight1();
Show.say(f.mount("Hello World").readLabel());
}
}
2.通过实例初始化,为匿名内部类创建一个构造器效果。
abstract class Base{
public Base(int i){
Show.say("Base constructor, i = "+i);
}
public abstract void f();
}
public class AnonymousConstructor {
public Base getBase(int i){
return new Base(i){
{Show.say("Inside instance initializer");}
public void f(){
Show.say("In anonymous f()");
}
public void g(){
Show.say("In anonymous g()");
}
};
}
public static void main(String[] args){
AnonymousConstructor a = new AnonymousConstructor();
Base base = a.getBase(123);
base.f();
//! base.g(); 不可以,此时base指向子类对象,子类中特有的方法不可以调用,只能调用重写于父类的方法。
}
}
如果要在getBase()方法内部使用 i ,则 getBase()中的参数i 必须被设为 final 。
3.当在方法内部使用参数时的情况,将参数设置为final。
import vip.Show;
public class Fight2 {
public Destination dest(final float price,final String dest){
return new Destination(){
private int cost;
private String label = dest;
{
cost = Math.round(price);
if(cost>100)
Show.say("Over budget!");
}
public String readLabel(){ return label; }
};
}
public static void main(String[] args){
Fight2 f = new Fight2();
Destination d = f.dest(123.23F, "Tanzania");
}
}
输出结果:
Over budget!
4.内部类的其他用途,当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一定的联系,所以它能访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有访问权。
interface Selector{
public boolean end();
public Object current();
public void next();
}
public class Sequence {
private Object[] object;
private int next = 0;
public Sequence(int size){ object = new Object[size]; }
public void add(Object x){
if(next < object.length)
object[next++] = x;
}
private class SSelector implements Selector{
private int i =0;
public boolean end(){ return i == object.length; }
public Object current(){ return object[i]; }
public void next(){ if(i < object.length) i++; }
}
public Selector getSelector(){
return new SSelector();
}
public static void main(String[] args){
Sequence sequence = new Sequence(10);
for(int i = 0; i < 10; i++)
sequence.add(Integer.toString(i));
Selector selector = sequence.getSelector();
while(!selector.end()){
System.out.println(selector.current());
selector.next();
}
}
}
所以内部类自动拥有对其外围类的所有成员访问权。当某个外围类的对象创建了一个内部类对象时,次内部类对象必定会保存一个指向那个外围类对象的引用。然后,在你访问此外围类的成员时,就是用那个“隐藏的”引用来选择外围类的成员。幸运的是,编辑器会帮你处理所有的细节,但是,内部类的对象只能在与其外围类的对象相关联的情况下才被创建。构建内部类对象时,需要一个指向其外围类对象的引用,如果编译器找不到这个引用就会报错。
5.如果不需要内部类对象与其外围类对象之间有联系,可以将内部类声明为static。这通常称为嵌套类。想要理解static应用于内部类时的含义,就必须记住,普通的内部类对象隐式的保存了一个引用,指向创建它的外围类对象。而嵌套类意味着:1.要创建嵌套类的对象,并不需要其外围类的对象。2.不能从嵌套类的对象中访问非静态的外围类对象。此外,普通内部类的字段和方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类(原因:非静态内部类依赖于外部类对象 ,
static class Inner{
int i,j,k;
public Inner(){}
void f(){}
}
}
class Mount2{
private int i = 123;
public int value(){return i;}
}
class Mount3{
private String label;
Mount3(String mount){ label = mount; }
String readLabel(){ return label; }
}
public static void main(String[] args){
Fight4 f = new Fight4();
Fight4.Mount2 mount2 = f.new Mount2();
System.out.println(mount2.value());
}
}
InheritInner(WithInner wi){
wi.super();
}
public static void main(String[] args){
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
}
interface Counter{
int next();
}
public class Fight5 {
private int count = 0;
Counter getCounter(final String name){
class LocalCounter implements Counter{
public LocalCounter(){
Show.say("Localcounter()");
}
public int next(){
Show.say(name);
return count++;
}
}
return new LocalCounter();
}
Counter getCounter2(final String name){
return new Counter(){
{
Show.say("Counter()");
}
public int next(){
Show.say(name);
return count++;
}
};
}
public static void main(String[] args){
Fight5 f = new Fight5();
Counter c1 = f.getCounter("Local inner");
Counter c2 = f.getCounter2("Anonymous inner");
for(int i = 0; i < 5; i++)
System.out.println(c1.next());
for(int i = 0; i < 5; i++)
System.out.println(c2.next());
}
}
- 学习笔记(五)接口与内部类(二)
- 学习笔记(五)接口与内部类(一)
- 练习代码(五)接口与内部类(二)
- Java学习笔记(接口与内部类)
- Java学习笔记(4):接口与内部类
- 内部类学习笔记(二)方法内部类
- 内部类 学习笔记(二)
- JAVA学习笔记----接口与内部类
- java学习笔记-接口与内部类
- 练习代码(五)接口与内部类(一)
- Java核心技术(第8版)学习笔记_接口与内部类
- [学习笔记] Java核心技术 卷一:基础知识 接口、lambda表达式与内部类(三)
- java系统学习(八) --------接口与内部类
- java学习笔记(二十)内部类
- java学习笔记---第六章接口与内部类
- Java学习笔记四——接口与内部类
- [core java学习笔记][第六章接口与内部类]
- Java(六)接口与内部类
- vs中使用qt的qrc生成rcc资源文件
- JAVA_Proxy_DEMO
- 数据库模型
- 报表示例——用Jasper report实现MongoDB join
- 互联网+,空间,智商和类脑三个维度的递增进化
- 学习笔记(五)接口与内部类(二)
- Sakai Project(1)--源码部署安装
- Mac OS X10.9.5bash基本命令失效后的修复
- gitlab postgresql其它客户端访问配置
- RPC,RMI,CORBA,DCOM,SOAP,JMS及JMS的实现(通讯)
- Android Studio SHA1证书指纹数据
- 解决Win7系统插入耳机或音响没有声音教程
- 导入 JPush推送
- juniper SRX dhcp 设置