Для отладки вы можете использовать профилировщик (например, YourKit, коммерческий профилировщик java). Вы найдете как открытые, так и коммерческие варианты профилей java.
Для интеграции с вашим кодом вы можете использовать технику «Аспектно-ориентированное программирование». Рамки AOP (например, AspectWerkz) позволяют изменять файлы классов во время загрузки класса. Это позволит вам модифицировать конструкторы для регистрации объектов в «все-мои-runtime-objects-framework».
только путем переопределения printMe()
:
class Son extends Dad
{
public void printMe()
{
System.out.println("son");
}
}
ссылка на me
в Dad.printMe
метод неявно указывает на статическое поле Dad.me
, так так или иначе Вы изменяетесь что printMe
выполняет Son
...
Вы не можете переопределить переменные в классе. Можно переопределить только методы. Необходимо сохранить переменные частными иначе, можно получить много проблем.
Это похоже на недостаток дизайна.
Удалите статическое ключевое слово и установите переменную, например, в конструкторе. Таким образом, Сын просто устанавливает переменную на другое значение в его конструкторе.
Да, просто переопределите printMe()
метод:
class Son extends Dad {
public static final String me = "son";
@Override
public void printMe() {
System.out.println(me);
}
}
Просто Вызов super.variable в sub конструкторе класса
public abstract class Beverage {
int cost;
int getCost() {
return cost;
}
}`
public class Coffee extends Beverage {
int cost = 10;
Coffee(){
super.cost = cost;
}
}`
public class Driver {
public static void main(String[] args) {
Beverage coffee = new Coffee();
System.out.println(coffee.getCost());
}
}
Вывод равняется 10.
Короче говоря, нет, нет способа переопределить переменную класса.
Вы не переопределяете переменные класса в Java, вы их скрываете. Переопределение - это, например, методы. Скрытие отличается от переопределения.
В приведенном вами примере, объявляя переменную класса с именем «я» в классе «Сын», вы скрываете переменную класса, которую она унаследовала бы от своего суперкласса «Папа» с тем же именем «я». Такое скрытие переменной не влияет на значение переменной класса «me» в суперклассе Dad.
Что касается второй части вашего вопроса, то о том, как заставить его печатать «сын», я бы установил значение через конструктор. Хотя приведенный ниже код довольно сильно отличается от вашего исходного вопроса, я бы написал его примерно так:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void printName() {
System.out.println(name);
}
}
JLS дает гораздо больше подробностей о сокрытии в разделе 8.3 - Объявления полей