Dziedziczenie obiektów i pól - jak to zrobić poprawnie?

0

Nie wiem jak poprawnie zrobić dziedziczenie. Mam klasę:

package metody;

public class Metody 
{
	int promien;
	
	public static void main(String[] args) 
	{
		Metody metody = new Metody(1, "km");
		System.out.println(metody.dodawanie2());
		System.out.println(metody.promien);
		System.out.println(suma(1, 4));
//		Metody[] metody = new Metody[3];
//		metody[0] = new Metody();
//		metody[1] = new Metody(5);
//		metody[2] = new Metody(10);
//		
//		for(Metody x: metody)
//		{
//		System.out.println(x.dodawanie2());
//		}
		

	}
//	public void setPromień(int r)
//	{
//		promien = r;
//	}
	public Metody()
	{
		this(1);
	}
	public Metody(int r)
	{
		this(r, "coś");
	}
	public Metody(int r, String k)
	{
		promien = r;
		if(k.equals("km"))
		{
			promien = promien*100;
		}
	}
	
	public int dodawanie2()
	{
		int obliczenia = promien + 2;
		return obliczenia;
	}
	
	public static int suma(int a, int b)
	{
		int dodawanie = a+b;
		return dodawanie;
	}

}

i klasę:

package parametry;

import metody.Metody;

public class Przekazywanie extends Metody
{
	int x;

	public Przekazywanie()
	{
		this(1);
	}
	public Przekazywanie(int r)
	{
		x = r;
	}
	public int dodawanie()
	{
		return x+2;
	}
	public String toString()
	{
		return "wynik " + dodawanie();
	}

	
	public static void main(String[] args) 
	{
		Metody metody2 = new Metody();
		Przekazywanie przekazywanie = new Przekazywanie();
		System.out.println(przekazywanie);
		System.out.println(super.promien);
		System.out.println(metody2.dodawanie2());	
	}
}

Żeby dziedziczyć samo pole promien z klasy Metody myślałem, że wystarczy użyć super.promien ale działa tylko kiedy wcześniej zadeklaruję to pole jako publiczne i statyczne - da się bez takiej deklaracji dziedziczyć to pole?

Nie rozumiem jak ma się statyczność danego pola do dziedziczenia. Rozumiem, że powinno być publiczne (chociaż w poradniku z którego korzystam wcale publiczne nie jest) ale nie rozumiem czemu to pole musi być statyczne.

0

Nie da się czegoś takiego zrobić. Dziedziczenie powoduje rozszerzenie danej klasy. CAŁEJ klasy, a nie jej kawałka. Poza tym nie bardzo rozumiesz co robisz. Statyczność w tamtym kodzie jest wymuszona dlatego że z METODY STATYCZNEJ (main) próbujesz odwołać sie do POLA. Zauważ że nie napisałeś tam wcale przekazywanie.promien, więc nie odniosłeś sie do pola konkretnego obiektu. A to oznacza że pole musi być polem klasy, czyli potem statycznym.

0

Teraz rozumiem.
A jak ma się sprawa z

super() 

?
Jeżeli pozwala mi to na wywołanie konkretnego konstruktora super-klasy to czy jest to potrzebne w sytuacji kiedy udało mi się odwołać do konstruktora domyślnego bez użycia

super() 

?

0

I co? Ukradli ci internet? Czy mam ci cytować dokumetancję? http://docs.oracle.com/javase/tutorial/java/IandI/super.html

If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass. If the super class does not have a no-argument constructor, you will get a compile-time error. Object does have such a constructor, so if Object is the only superclass, there is no problem.

0

Czyli funkcji super używamy kiedy element danej klasy przesłania element super-klasy, czy np. przy takich samych nazwach metod?

1

Tak. Na przykład kiedy przeładowujesz jakąś metodę i chcesz żeby zrobiła to co metoda nadklasy a potem coś dodatkowego to zrobisz

public void metoda(){
  super.metoda();
  //cośtam dodatkowego
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1