我今天使用Eclipse的"拉接口"重构功能来创建基于现有类的接口.提供的对话框用于创建新接口的所有新方法作为"抽象"方法.
那有什么好处?
我认为你被允许将接口方法声明为抽象的这一事实是该语言的一个多余且无害的特性,并不特别鼓励.
为什么Eclipse会支持这样的风格,或者为什么有人会自愿选择这样做呢?
澄清:我不是在问为什么界面方法是抽象的,这很明显.我在问为什么会明确地选择将它们标记为抽象,因为如果它们在界面中它们仍然是抽象的.
我已经读过我们只能通过继承它来实例化一个抽象类,但我们不能直接实例化它.
但是,我看到我们可以通过调用另一个类的方法来创建一个具有抽象类类型的对象.
例如 - LocationProvider是一个抽象类,我们可以通过调用类中的getProvider()函数来实例化它LocationManager:
LocationManager lm = getSystemService(Context.LOCATION_PROVIDER);
LocationProvider lp = lm.getProvider("gps");
Run Code Online (Sandbox Code Playgroud)
抽象类如何在这里实例化?
这两种实例化类的新对象的方法有什么区别,如下所示:
Test t1=new Test();
Test t2=new Test(){ };
Run Code Online (Sandbox Code Playgroud)
当我尝试下面的代码时,我可以看到两个对象都可以访问该方法foo(),但是t2无法访问variable x(variable x无法解析):
public class Test
{
int x=0;
public void foo(){ }
public static void main (String args[])
{
Test t1=new Test();
Test t2=new Test(){ };
t1.x=10;
t2.x=20;
t1.foo();
t2.foo();
System.out.println(t1.x+" "t2.x);
}
}
Run Code Online (Sandbox Code Playgroud) 我有这个界面:
public interface Animal {
public void Eat(String name);
}
Run Code Online (Sandbox Code Playgroud)
这段代码实现了这个接口:
public class Dog implements Animal {
public void Eat(String food_name) {
System.out.printf(food_name);
}
public static void main(String args[]) {
Animal baby2 = new Dog(); //HERE!!!!!!!!!!!!!!!!!!!!!!
baby2.Eat("Meat");
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么代码有效?无法实例化接口.然而在这种情况下,界面被实例化(标记为"HERE !!!!!!!!!!!!!").
这里发生了什么?
abstract class A {
public void disp() {
System.out.print("Abstract");
}
}
public class B {
public static void main(String args[]) {
A object = new A(){ };
object.disp();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道抽象类无法实例化,但在此代码上混淆.实际上这段代码是什么意思?
例如:
Object o1 = new ArrayList<String>();
Object o2 = new ArrayList<String>(){};
Object o3 = new ArrayList<String>(){{}};
Run Code Online (Sandbox Code Playgroud)
有什么不同?
我不能谷歌java的第2 /第3语法,任何参考?
我明白:
在对象链接期间调用Abstract类的构造函数.
我们永远不能直接创建Abstract类的对象,即使它包含一个Constructor并且所有方法都已实现
为什么?我希望从编译器的角度理解,为什么Java强制这些呢?
谢谢
你能澄清一下为什么这样有效:
public abstract class AbstractClassCreationTest {
public void hello(){
System.out.println("I'm the abstract class' instance!");
}
public static void main(String[] args) {
AbstractClassCreationTest acct = new AbstractClassCreationTest(){};
acct.hello();
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这与我们可以找到的规范相矛盾:
如果尝试使用类实例创建表达式(第15.9节)创建抽象类的实例,则这是编译时错误.
没有任何方法可以使用抽象类创建对象.但是当使用匿名内部类时,可以运行以下代码.并且不仅该start()方法不可访问,因此在不给出任何编译错误的情况下运行以下程序的原因是什么以及访问start()方法的机制是什么.
abstract class Vehicle{
abstract void park();
}
class Demo{
public static void main(String args[]){
Vehicle v1=new Vehicle(){
int speed;
void park(){
System.out.println("Parking for cars...");
}
void start(){
System.out.println("Start...");
}
};
v1.park();
}
}
Run Code Online (Sandbox Code Playgroud) 我读到Class和Abstract Class之间的主要区别是,抽象类无法实例化,
但我可以为抽象类创建对象
public abstract class Earth {
abstract void sand();
void land() {
}
}
Run Code Online (Sandbox Code Playgroud)
并使用新的关键词我创建了对象,用于抽象
Earth mEarth = new Earth() {
@Override
void sand() {
}
};
Run Code Online (Sandbox Code Playgroud)
我有一些问题在Inet上没有正确答案,
1)是新关键字用于实例类?
2)实例只是对象吗?
3)mEarth被称为对象(地球的实例)?
现在我可以调用任何方法(作为回调或值返回) mEarth.sand(); mEarth.land(); 使用地球物体