Klasa wewnętrzna statyczna

0

Witam,
Mam pewien problem ale nie wiem z kąt on wynika, dostaje taki błąd:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Pair cannot be resolved to a type

Błąd jest w 11 linice w Main tam gdzie jest Array.minmax(tab)
A oto kod:

 public class Main {
	public static void main(String[]args){
		int [] tab = new int[10];
		System.out.println("Zostana wylosowane liczby: ");
		for(int i=0; i<tab.length; ++i)
		{
			tab[i] = (int) Math.random();
		}
		Array.Pair p = new Array.minmax(tab);
		System.out.println("Max = "+ p.getFirst());
		System.out.println("Min = "+ p.getSecend());
	}
	
}

public class Array {
	
	public static class Pair{
		
		public Pair(double f, double s)
		{
			first = f;
			secend = s;
		}
		public double getFirst()
		{
			return first;
		}
		public double getSecend()
		{
			return secend;
		}
	}
	
	public static Pair minmax(double [] value)
	{
		double min = Double.MIN_VALUE;
		double max = Double.MAX_VALUE;
		for(double v : value)
		{
			if(max < v) max = v;
			if(min > v) min = v;
		}
		return new Pair(min, max);
	}
	
	private static double first;
	private static double secend;
	
}
0

Strzelam, że zamiast
Array.Pair p = new Array.minmax(tab);
chciałbyś zrobić
Array.Pair p = Array.minmax(tab);
(Problem będzie z typem tablicy, ale to juz inny case)

0

Wynika on z tego, że analizator składni kompilatora po new oczekuje nazwy typu. Ty zamiast nazwy typu dajesz mu wywołanie statycznej metody minmax(), która zwraca obiekt tego typu, a nie typ. Typem jest Array, Array.Pair, Main.
A tak w ogóle, to to co próbujesz zrobić, to jakaś ekwilibrystyka bo Array.Pair nie jest prawdziwym obiektem ponieważ reprezentuje sobą w istocie tylko dwa pola statyczne first i secend, które w ogóle do tej klasy nie należą.
Prawdziwa para powinna mieć dwa prywatne i finalne pola first i second, które powinny być inicjowane w konstruktorze. Składnia Javy jest trochę myląca ponieważ statyczne klasy, pola i metody mają niezależne od siebie role. Słowo static w klasach oznacza tylko tyle, że klasa nie jest wewnętrzna, czyli nie ma rodzica i równa się zakresem możliwości każdej klasie zewnętrznej (poza dodatkowym łatwiejszym dostępem do elementów klasy otaczającej). Static w metodach oznacza, że nie są to metody, a raczej funkcje dostępne przez nazwę klasy. Static dla pól oznacza, że są to faktycznie zmienne globalne dostępne przez nazwę klasy.
Generalnie metody i pola statyczne nie powinny być nadużywane, a używane tylko takie spłycają programowanie obiektowe do programowania proceduralnego - takiego jakie występuje w C lub Pascalu lub Visual Basicu.

Musisz sobie przemyśleć co chcesz zrobić bo z tego co napisałeś wynika, że chcesz z 10-elementowej tablicy liczb całkowitych otrzymać parę liczb zmiennoprzecinkowych. To nawet na logikę się nie klei. :)

ps. Nie "z kąd", a "skąd".
ps2. Klasa wewnętrzna, to klasa obiektów, które mają rodzica, którym jest obiekt klasy okalającej (choć można to zmienić). Klasa, która ma modyfikator static, to klasa zagnieżdżona, która nie ma żadnego rodzica. Jej obiekty są całkowicie samodzielne, choć czasem niedostępne nigdzie indziej poza klasą okalająca (jeżeli klasa zagnieżdżona jest prywatna).

0

Wielkie dzięki :) Jestem dopiero początkującym i jednak popełniam dużo błędu, ale jak ktoś dobrze wytłumaczy to zapamiętam. Jeszcze raz dzięki.

0

Brak wiedzy, to nie błąd. :)
Traktuj każde wywołanie new Coś(argumenty) jako przydzielenie na stercie pamięci na obiekt Coś i wywołanie dla tego obiektu pasującego konstruktora Coś(argumenty), który zainicjuje pola tego obiektu bo Java wszystkie pola nowego obiektu zeruje (są nullami lub zerami). Wtedy wynikiem wywołania new Coś(argumenty) jest referencja do obiektu typu Coś. Obiekt w Javie nie ma żadnej własnej nazwy. Jest dostępny wyłącznie poprzez gdzieś zapisaną referencję. Jeżeli ostatnia referencja zniknie, to obiekt wkrótce potem leci do śmieci i tam wyparowuje w błysku atomowego wybuchu.
Hehehe. To ostatnie to tylko moja poryta wyobraźnia. ;D

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