Определение функции инициализации класса в java

Я получаю сообщение об ошибке «Абстрактные методы не определяют тело» с приведенным ниже кодом ….

DCWebView.setWebViewClient(new MyWebViewClient() { @Override public abstract void launchExternalBrowser(String url) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); } }); 

MyWebViewClient – абстрактный класс. Мне интересно, что именно делает этот код. Он явно намеревается определить функцию для класса … могу ли я просто поместить какой-либо код в new MyWebViewClient() { } для определения переменных и других функций?

Какие еще удивительные вещи можно сделать здесь?

Просто удалите abstract и он будет работать. Если метод launchExternalBrowser не определен в MyWebViewCLient вы также должны удалить аннотацию @Override . @Override означает, что вы переопределяете метод, определенный в иерархии расширенного класса.

DCWebView.setWebViewClient методов DCWebView.setWebViewClient требуется объект типа MyWebViewClient в качестве параметра. new MyWebClient() { .. } вы создаете экземпляр анонимного класса, который расширяет MyWebViewClient .

Анонимные классы (почти) такие же, как «обычные» классы. Здесь вы можете определить как новые переменные, так и методы. Основное отличие состоит в том, что анонимный класс определяется в том месте, где он используется (нет определения внешнего класса и из-за этого он не имеет имени, он «анонимный») и используется только в этом одном месте (как Нет внешнего определения, которое нельзя использовать в другом месте).

Анонимные классы очень часто используются в Java, но это нечто более продвинутое. Как сказал esaj в своем ответе, это хорошая идея прочитать что-то об этом. В Интернете есть много информации, например здесь или здесь .

Абстрактный метод используется для определения метода без реализации. Конкретный (не абстрактный) класс, простирающийся от абстрактного класса, должен затем реализовывать абстрактные методы расширенного абстрактного класса. Реализация для определенного метода записывается без abstract ключевого слова в его сигнатуре метода.

Вероятно, вам следует прочитать учебник Java SE об абстрактных классах и методах: http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

Могу ли я просто поместить какой-либо код в новый MyWebViewClient () {} для определения переменных и других функций?

Да, но есть еще один улов: кажется, что вы предоставляете «анонимную» реализацию MyWebViewClient методу другого класса (статический?) DCWebView.setWebViewClient (), DCWebView, вероятно, знает только о методах, объявленных в (abstract?) MyWebViewClient, и не может получить доступ к каким-либо другим методам, даже если они являются общедоступными. Однако, если вы хотите разбить анонимную реализацию MyWebViewClient для разделения частных методов и использования в нем переменных-членов, вы можете это сделать.