Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 构造函数中的动态方法定义_Java_Android - Fatal编程技术网

Java 构造函数中的动态方法定义

Java 构造函数中的动态方法定义,java,android,Java,Android,在进行android开发时,我经常遇到如下代码: timer = new CountDownTimer(counter, 1000) { public void onTick(long remainingTimeMillis) { counter = remainingTimeMillis; displayCount(counter); }

在进行android开发时,我经常遇到如下代码:

timer = new CountDownTimer(counter, 1000) {
                public void onTick(long remainingTimeMillis) {
                    counter = remainingTimeMillis;
                    displayCount(counter);
                }
                public void onFinish() {
                    displayCount(0);
                    counter = 0;
                    timer = null;
                    beep.start();
                }
            };


我从未见过Java在其他领域有这样的用途,有人能解释一下调用构造函数时的含义,然后在其中定义一些其他方法,就像为我定义一个类一样。通常在什么情况下我们需要使用这种结构?非常感谢。

这叫做匿名类。在构造函数后面的括号中,您创建一个类来扩展所提到的类或实现所提到的接口,重写它的方法和/或定义新的方法和字段,然后创建这个新类的实例

此新类没有名称,无法引用对象。当您需要实现某些类/接口的抽象方法、创建单个对象并将此对象作为参数传递时,通常会使用它


例如,
OnClickListener
接口有一个抽象方法
onClick()
,它在触发click事件时用作回调。若并没有匿名类,那个么首先需要声明实现给定接口的类,然后创建该接口的对象,然后将其作为参数传递给具有显式强制转换的
setOnClickListener
方法。使用匿名类,您可以用更少的代码和更高的可读性编写它。

这称为匿名类。在构造函数后面的括号中,您创建一个类来扩展所提到的类或实现所提到的接口,重写它的方法和/或定义新的方法和字段,然后创建这个新类的实例

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String s = (String) v.getTag();
            int duration = Toast.LENGTH_SHORT;
            Toast toast = Toast.makeText(context, s, duration);
            toast.show();

        }
    });
此新类没有名称,无法引用对象。当您需要实现某些类/接口的抽象方法、创建单个对象并将此对象作为参数传递时,通常会使用它

例如,
OnClickListener
接口有一个抽象方法
onClick()
,它在触发click事件时用作回调。若并没有匿名类,那个么首先需要声明实现给定接口的类,然后创建该接口的对象,然后将其作为参数传递给具有显式强制转换的
setOnClickListener
方法。使用匿名类,您可以用更少的代码和更高的可读性编写它

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String s = (String) v.getTag();
            int duration = Toast.LENGTH_SHORT;
            Toast toast = Toast.makeText(context, s, duration);
            toast.show();

        }
    });
这里有一个注释性的内部类。该类实现接口
OnClickListener
,您实现方法
onClick

您可以让活动类
实现OnClickListener

 button.setOnClickListener(this); // this refers to the Activity class
然后重写onClick-in活动

 @Override
 public void onClick(View v) {
 switch(v.getId)
 {
     case R.id.button1 :
     break; 
 }

 }
如果你有更多的按钮,我更喜欢上面的方法

还有这个

这里有一个注释性的内部类。该类实现接口
OnClickListener
,您实现方法
onClick

您可以让活动类
实现OnClickListener

 button.setOnClickListener(this); // this refers to the Activity class
然后重写onClick-in活动

 @Override
 public void onClick(View v) {
 switch(v.getId)
 {
     case R.id.button1 :
     break; 
 }

 }
如果你有更多的按钮,我更喜欢上面的方法

还有这个


在您引用的示例中,正在创建上述类的匿名对象,并将其作为预期参数传递给方法。 这里需要注意的是,该类的一些方法被重写。 但这并不是android独有的。这通常用于创建接口和/或抽象类的匿名对象以作为参数传递给方法。
这种语法的替代方法是创建一个实现或扩展接口或抽象类的新类,然后创建该类的新对象并将其传递给所需的方法。因此,引用的示例可以称为一个简短而简洁的方法来处理这种情况。

在您引用的示例中,正在创建所述类的匿名对象,并将其作为预期参数传递给该方法。 这里需要注意的是,该类的一些方法被重写。 但这并不是android独有的。这通常用于创建接口和/或抽象类的匿名对象以作为参数传递给方法。
这种语法的替代方法是创建一个实现或扩展接口或抽象类的新类,然后创建该类的新对象并将其传递给所需的方法。因此,引用的示例可以称为一个简短而简洁的方法来处理这种情况。

公平地说,匿名类的对象可以使用
this
关键字在内部引用。另一个目的是创建对象并立即运行其方法之一,如
(new Thread(){…})。start()
公平地说,匿名类的对象可以使用
this
关键字在内部引用。另一个目的是创建对象并立即运行其方法之一,如
(new Thread(){…})。start()
感谢您的回答。但是在这里,我仍然对接口的内容感到困惑,你能用new创建一个新的接口并将接口作为参数传递吗?我想我们只能传入对象。@JFreebird您可以实现接口<代码>新建视图。OnClickListener(){您有一个实现接口
OnClickListener
的annonymous内部类。我想您被语法弄糊涂了。请检查这个,谢谢您的回答。但是在这里,我仍然对接口的内容很困惑,您能不能使用new创建一个新接口并将接口作为参数传递?我想我们只能传递In对象。@JFreebird您实现了接口。
new View.OnClickListener(){
您有一个实现接口的annonymous内部类
OnClickListener
。我想您被语法弄糊涂了。检查这个