Vector i klasa abstrakcyjna

0

Witam,
Mam problem problem z użyciem klasy vector, a mianowicie:
Mam klasę Student

Vector<Student> vector = new Vector<Student>();
vector.add(Student(s, i));

jeżeli tak tworzyłem obiekty w vecto'rze to działało poprawnie, lecz klasę Student uczyniłem abstrakcyjną i dodałem dwie klasy dziedziczące po niej. StudentZaoczny i StudentDzienny, teraz jeżeli chce stworzyć w vecto'rze nowy obiekt np.

vector.add(StudentZaoczny(s, i));

to pojawia się błąd ponieważ vector oczekuje obiektu klasy Student, wiem że mógł bym stworzyć dwa oddzielne vector'y, osobno dla Studenta Zaocznego i Dziennego. A jak chciał bym przechować to w jednym? co powinienem zrobić ?

0

To ci działa?

vector.add(new StudentZaoczny(s, i));

Identycznie dla dziennego.

0

Nie,
The method add(Student) in the type Vector<Student> is not applicable for the arguments (StudentZaoczny).

0

Jak u ciebie StudentZaoczny nie dziedziczy ze Studenta to się nie dziw...

0

Dziedziczy,
public class StudentZaoczny extends Student{}

0

A nie prościej w klasie Student dodać pole, np:

   private boolean dzienny;

Przy Twoim rozwiązaniu, będziesz miał problem po wywołaniu

... = vector.get(i);  

z rozpoznaniem, czy odczytany student jest dzienny czy zaoczny.

0

Może i tak, ale jak ma się wymagania do jakiegoś projektu to nie wszystko można pominąć ponieważ jest "prościej" :)

2

Jeżeli klasy Student, StudentDzienny i StudentZaoczny są dobrze zdefiniowane, to

vector.add(new StudentZaoczny(s,i));

musi działać.

0
package studenci;
abstract public class Student{}
package studenci;
public class StudentZaoczny extends Student{}
package studenci;
public class StudentDzienny extends Student{}

Tak to u mnie wygląda, a więc gdzie może być błąd? Dodam że te klasy są w innym pakiecie niż main, chociaż nie wiem czy to coś zmienia. A w klasie gdzie mam maina umieściłem import studenci; może coś zrobiłem źle z pakietami ? jakiś pomysł?

0

W klasie StudentZaoczny ( i w pozostałych też) brak konstruktora dwuargumentowego.
Wywołujesz

new StudentZaoczny(s,i)

a nie ma takiego konstruktora.

0

Jest konstruktor, tylko po prostu go nie podałem

public StudentZaoczny(String n, int s) {
		super(n, s);
	}

Jeżeli stworze nowy obiekt za pomocą:

Student s = new StudentZaoczny(s,i);

To kompilator nie sygnalizuje żadnego błędu.

0

Podaj cały kod.

U mnie i na ideone.com działa: http://ideone.com/Hc7Qv

0
import studenci.*;
import java.util.*;

class TenSamStudent extends Throwable{}

public class first {
	
	public void p(String s){
		System.out.println(s);
	}
	public void sprawdz(Vector<Student> vector) throws TenSamStudent{
		for(int in=0;in<vector.size()-1;in++)
		{
			if((vector.elementAt(in).Nazwisko).equals(vector.lastElement().Nazwisko) && vector.lastElement().licznik>1){
				throw new TenSamStudent();
			}
		}
	}
	public static void main(String[] args) {
		first f=new first();
		Vector<Student> vector = new Vector<Student>();
		Scanner sc = new Scanner(System.in);
		f.p("Prosze podac liczbe studentów do wprowadzenia: ");
		int k=sc.nextInt();
		
		for (int a=0;a<k;a++){
		
		System.out.print("Imie: ");
		String s = sc.next();
		System.out.print("srednia: ");
		int i = sc.nextInt();
		System.out.print("Student zaoczny czy dzienny? : ");
		String g=sc.next();

		try{
		if(g=="zaoczny"){
		vector.add(new StudentZaoczny(null, 0));//tutaj występuje błąd
		System.out.print("Czesne: ");
		}
		f.sprawdz(vector);
		}catch(TenSamStudent e){
			System.err.println("Taki student istnieje już w naszej bazie!");
			vector.remove(vector.size()-1);
			a--;
		}
		
		}
		for(int i=0;i<vector.size();i++){
			vector.elementAt(i).print();
		}

	}

}

Natomiast w pakiecie studenci znajduje się:

package studenci;

abstract public class Student{
	protected static int index=0,srednia;
	public String Nazwisko;
	public static int licznik=0;
	
	public Student(String n,int s){
		Nazwisko=n;
		srednia=s;
		index++;
		licznik++;
	}
	abstract public void print();
	abstract public void getExtra(int i);
}

package studenci;

public class StudentZaoczny extends Student{
	private int czesne;
	public StudentZaoczny(String n, int s) {
		super(n, s);
	}
	public void print() {
		System.out.println("Nazwisko: "+Nazwisko+" Średnia: "+srednia+" Nr. indexu: "+index+" Stypendium:"+czesne);
		
	}
	public void getExtra(int i) {
		czesne=i;
		
	}

}

package studenci;

public class StudentDzienny extends Student{
	private int stypendium;
	public StudentDzienny(String n, int s) {
		super(n, s);
	}
	public void print() {
		System.out.println("Nazwisko: "+Nazwisko+" Średnia: "+srednia+" Nr. indexu: "+index+" Stypendium:"+stypendium);
		
	}
	@Override
	public void getExtra(int i) {
		stypendium=i;
		
	}

}

Kod może być w niektórych miejscach nieczytelny gdyż nie jest jeszcze dokończony.

0

Jak może wystąpić błąd we wskazanym miejscu, skoro ten kod się nigdy nie wykonuje?

2

U mnie działa bez zmian. Może ci się zmiany jakieś w kodzie nie zapisały (Eclipse czasem gubił mi zmiany, ale to w projekcie JavaME, być może w JavaSE też ma takie bugi).

NB:
Stringi porównuje się przez String.equals, a nie operator ==. Operator == prawie zawsze stosuje się tylko i wyłącznie do typów prymitywnych.
Klasa Vector jest przestarzała i powinno się stosować ArrayList.
Obie sugestie są podpowiadane przez najnowszego NetBeansa, sugeruję się w niego zaopatrzyć, jest idealny dla początkujących (i nie tylko początkujących) - http://4programmers.net/Java/Wprowadzenie_do_NetBeans_IDE

PS:
Sprawdź czy nie masz klas Student, StudentDzienny, StudentZaoczny w głównej paczce (tzn tej bez nazwy). Wtedy Java użyła by właśnie tych klas i stąd mogłyby wynikać problemy.

1

Pobrałem i zainstalowałem NetBeans po czym skopiowałem cały program nie dokonując żadnych zmian i działa poprawnie O.o

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