可以在构造函数中对Java对象进行子类化吗?

可以在构造函数中对Java对象进行子类化吗?,java,constructor,selenium-webdriver,subclassing,Java,Constructor,Selenium Webdriver,Subclassing,可以在构造函数中对Java对象进行子类化吗 我是一名Java新手,正在尝试使用Selenium。在这里的一篇文章中,有一条关于如何修改HtmlUnitDriver驱动程序对象以支持身份验证的说明,我在这里重复了一些演示代码 WebDriver driver = new HtmlUnitDriver() { protected WebClient modifyWebClient(WebClient client) { // This class ships with HtmlUnit

可以在构造函数中对Java对象进行子类化吗

我是一名Java新手,正在尝试使用Selenium。在这里的一篇文章中,有一条关于如何修改HtmlUnitDriver驱动程序对象以支持身份验证的说明,我在这里重复了一些演示代码

WebDriver driver = new HtmlUnitDriver() {
  protected WebClient modifyWebClient(WebClient client) {
    // This class ships with HtmlUnit itself
    DefaultCredentialsProvider creds = DefaultCredentialsProvider();

    // Set some example credentials
    creds.addCredentials("username", "password");

    // And now add the provider to the webClient instance
    client.setCredentialsProvider(creds);

    return client;
  }
};
代码是进入子类定义的示例还是“内联”修改?我假设这是可能的,但是当我将它复制到IDE中时,我得到了语法错误,显示一些属性没有定义

在进一步了解Java、匿名类和重写之后,这是我当前的代码。 但是我在Netbeans中的DefaultCredentialsProvider上遇到了一个语法错误,我不确定这是由于缺少必需的类,还是需要进行更多的更改

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package seleniumtest01;

/**
 *
 * @author richard
 */
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
import com.gargoylesoftware.htmlunit.WebClient;
//import org.openqa.selenium.htmlunit.ChromeDriver;

public class Main {

  public static void main(String[] args) {
    // Create a new instance of the Firefox driver
    // Notice that the remainder of the code relies on the interface,
    // not the implementation.
    testBasicAuth();
    System.exit(0);
  }

  public static void testBasicAuth() {
    // Create a new instance of the Firefox driver
    // Notice that the remainder of the code relies on the interface,
    // not the implementation.
    //WebDriver driver = new FirefoxDriver();
    WebDriver driver = new HtmlUnitDriver() {

      @Override
      protected WebClient modifyWebClient(WebClient client) {
        // This class ships with HtmlUnit itself
        DefaultCredentialsProvider creds = DefaultCredentialsProvider();

        // Set some example credentials
        creds.addCredentials("username", "password");

        // And now add the provider to the webClient instance
        client.setCredentialsProvider(creds);

        return client;
      }
    };
    driver.get("http://user:selenium@192.168.1.2/");
    new WebDriverWait(driver, 10);

    WebElement element = driver.findElement(By.xpath("//a[text()='Connection']"));
    element.click();
    //element = driver.findElement(By.xpath("//a[text()='Admin Login']"));
    element = driver.findElement(By.xpath("//a[contains(@href, 'admin/connection')]"));//[contains(@href,'#id1')]
    element.click();
    element = driver.findElement(By.xpath("//a[text()='Connection 1']"));
    element.click();
    element = driver.findElement(By.name("field_one"));
    element.clear();
    element.sendKeys("sample text");
    //driver.findElement(By. id("submit")).click();
    element.submit();

    new WebDriverWait(driver, 10);
    driver.quit();
  }


}

您展示的代码不是在修改原始类,而是在创建
HtmlUnitDriver
的匿名子类

例如:

class A {
  void sayHello() { System.out.println("Hello!"); }
}

class Main {
  public static void main(String[] args) {
    A a = new A() {
      @Override void sayHello() { System.out.println("Good bye"); }
    }

    a.sayHello();
  }
}

这将打印
再见
。局部变量
a
持有的实例类型是一个匿名类,由编译器自动生成。类的名称类似于
Main$0

如果没有类
HtmlUnitDriver
的Javadoc,很难给出这个问题的明确答案。如果
HtmlUnitDriver
是一个抽象类或接口,那么问题中的示例代码称为匿名类。否则,代码只是覆盖类的方法。

在sqa.stackexchange.com上发布问题后,我得到了WebDriver的构造函数应该是:

WebDriver driver = new HtmlUnitDriver() {

  @Override
  protected WebClient modifyWebClient(WebClient client) {
    // This class ships with HtmlUnit itself
    DefaultCredentialsProvider creds = new DefaultCredentialsProvider();

    // Set some example credentials
    creds.addCredentials("user", "selenium");

    // And now add the provider to the webClient instance
    client.setCredentialsProvider(creds);

    return client;
  }
};
添加覆盖后,我丢失了creds初始化的
new
,这是一个Java新手错误。
感谢您的帮助

如果您将某些内容声明为受保护,您可能会忘记@Override?我是Java新手,正在学习关于子类、匿名类等的Java视图,@Override已经出现在Netbeans中,因此我现在正在查找它。