Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  9 2179
Hei. Tar for tiden et selvstudie i Java, og kjenner nå at jeg står litt fast... Jeg går gjennom oppgavene i boken etter hvert som jeg lese, og de tre første kapitlene har gått relativt greit. Sitter nå med kapittel fire, og merker at vanskelighetsgraden har økt betraktelig.

De fleste oppgavene her går ut på å lage klasser med medfølgende konstruktører og underklasser. Må helt ærlig si at jeg foreløpig ikke skjønner så alt for mye...

Har prøvd meg på noen av oppgavene, her er den jeg har kommet lengst på (oppgaveteksten er kommentert øverst i koden):

Kode

//*********************************************************************
// Programming Projects 4.3
// Design and implement a class called Car that contants instance data that represents
// the make, model and year of the car. Define the Car constructor to intialize these
// values. Include getter and setter methods for all instance data, and a toString
// method that returns a one-line description of the car. Create a driver class called
// CarTest, whose main method instantiates and updates several Car objects.
//********************************************************************
class Car {
        String setMake, setModel;    // the cars manufacturer and model
       int setYear;       // the year the car was produced
        
        private static int counter; // No of Vehicle objects created
	
        // Constructor
	Car() {
		System.out.println("Constructor of the Super class called");
		setMake = ("Nissan");
		setModel = ("Primera");
		setYear = 1998;
		counter++;
	}
	// Instance methods
	
	private void getMake() {
 		System.out.println("Car Brand: " + setMake);
	}
        private void getModel() {
            System.out.println("Car model: " + setModel);
        }
        private void getYear() {
            System.out.println("Cars year: " + setYear);
        }
	// Static methods
	public static void getNoOfVehicles() {
		System.out.println("Number of Vehicles: " + counter);
	}
}

class Vehicles extends Car {
    	private int carNo = 10;
	public void printCarInfo() {
		System.out.println("Car number: " + carNo);
		System.out.println("Make of car: " + setMake);
		System.out.println("Model of car: " + setModel); 
		System.out.println("Year of car: " + setYear);
		getNoOfVehicles();
	}
    }

class CarTest { 

	public static void main(String[] args) {
		new Vehicles().printCarInfo();
	}
}
Er det noen som kunne tatt seg tid til å rette opp litt i koden, påpeke feil, forklare hva toString er og det skal benyttes til? De fleste oppgavene er bygd opp på samme måte, så om jeg forstår denne skal jeg nok greie å jobbe meg gjennom de andre og forhåpentligvis forstå skikkelig på egen hånd!
Up is the new down
SilverKhan's Avatar
Det ser ut som om du har noen hull i kunnskapen om hvordan metoder virker og derfor blir nok oppgaven vanskeligere enn det er ment å være.

Først to spørsmål:
  1. Har du lært om metoder som tar en eller flere parametere?
  2. Har du lært om metoder som returnerer en verdi?

Du har også missforstått hva som er en klasse og hva som er objekter av den klassen.

En klasse er en beskrivelse av hvilke egenskaper en ting har. Et objekt er en konkret ting som har de egenskapene klassen beskriver. En konstruktør/constructor brukes til å lage et nytt objekt.

F.eks. alle bøker har et navn og en forfatter:

Kode

class Bok {
    String navn, forfatter;

    Bok(String bokasNavn, String bokasForfatter){
        navn = bokasNavn;
        forfatter bokasForfatter;
    }
}
Når jeg skal lage objekter av denne klassen gjør jeg slik:

Kode

class BokTest { 

    public static void main(String[] args) {
        Bok hobbiten = new Bok("Hobbiten", "JRR Tolkien");
        Bok harrypotter1 = new Bok("Harry Potter og de vises stein", "JK Rowling");
    }
}
Nå har jeg laget to objekter av klassen Bok, en for Hobbiten og en for den første Harry Potter-boka.

I ditt kodeeksempel har du blandet sammen disse tingene, f.eks. vil alle objekter av klassen Car ha "Nissan Primera 1998" som make, model og år (bortsett fra att det er noen feil i koden som gjør att den ikke vil kjøre). Getter og setter metoder brukes til å hente (get) og endre/sette (set) verdiene i ett objekt. toString er en spesiell metode som brukes når du kaller System.out.println (blant annet. (Der du har laget Vehicles har du blandet deg bort i subklasser og det unødvendig for denne oppgaven.)

Har ikke tid til å forklare mer, men jeg legger ved en redigert versjon av din kode:

Kode

class Car {
    String make, model;
    int year;   
    Car(String carmake, String carmodel, int caryear) {
        make = carmake;
        model = carmodel;
        year = caryear;
    }

    String getMake(){
        return make;
    }

    String getModel(){
        return model;
    }

    int getYear(){
        return year;
    }

    void setMake(String carmake){
        make = carmake;
    }

    void setModel(String carmodel){
        model = carmodel;
    }

    void setYear(int caryear){
        year = caryear;
    }

    public String toString(){
        return getMake() + " " + getModel() + " (" + getYear() + ")";
    }
}

class CarTest { 

    public static void main(String[] args) {
        Car nissan = new Car("Nissan", "Primera", 1998);
        Car honda = new Car("Honda", "CRX", 1992);
        System.out.println(nissan);
        System.out.println(honda);
    }
}
Du kan også laste ned bluej (gratis), som er greit program for nybegynnere. Den lar deg kompilere underveis og peker ut evt. feil i koden
Dette gjorde det litt klarere for meg, tusen takk! Har desverre ingen forelesninger, så har kun boken å forholde meg til. Vi hadde en annen oppgave om bøker også, med det utgangspunktet du skrev her greide jeg også å kode denne.

Kode

//**********************************************************************
// Programming Projects 4.5
// Design and implement a class called Book that contains instance data
// for the title, author, publisher, and copyright date. Define the Book
// constructor to accept and initialize this data. Include setter and getter methods
// for all instance data. include a toString method that returns a nicely formatted
// multi-line description of the book. Create a driver class called Bookshelf
// whose main method instantiates and updates several Book objects.
//**********************************************************************

class Bok {
    String navn, forfatter, utgiver, copyrightdate;

    Bok(String bokasNavn, String bokasForfatter, String bokasUtgiver, String bokasCopyrightdate){
        navn = bokasNavn;
        forfatter = bokasForfatter;
        utgiver = bokasUtgiver;
        copyrightdate = bokasCopyrightdate;
    }
    public void setNavn (String bokasNavn) {
			navn = bokasNavn;
		}
	public String getNavn () {
		return navn;
	}
	public void setForfatter (String bokasForfatter) {
		forfatter = bokasForfatter;
	}
	public String getForfatter () {
		return forfatter;
	}
	public void setUtgiver(String bokasUtgiver) {
		utgiver = bokasUtgiver;
	}
	public String getUtgiver() {
		return utgiver;
	}
	public void setCopyrightdate(String bokasCopyrightdate) {
		copyrightdate = bokasCopyrightdate;
	}
	public String getCopyrightdate() {
		return copyrightdate;
	}
	
	public String toString() {
		return "\nTittel: " + navn + "\nForfatter :" + forfatter + "\nUtgiver: " + utgiver + "\nDato for copyright: " + copyrightdate + "\n \n";
	}


}

Kode

class BokTest { 

    public static void main(String[] args) {
        Bok bok1 = new Bok("Hobbiten", "JRR Tolkien", "Pearson", "01.02.1988");
        Bok bok2 = new Bok("Harry Potter og de vises stein", "JK Rowling", "Pearson", "21.12.2012");
        System.out.print(bok1);
        System.out.print(bok2);
    }
}
Regner med jeg får til resten nå, det virker litt klarere i det minste! Tusen takk!
Jeg bruker også bluej i universitets sammenheng. Det programmet er ikke så aller verst, nei. Oversiktlig og kjapt. Ikke alltid feilmeldingene gir mening for en nybegynner, men det ordner som regel din gode venn google.

De har også støttesider online, og du finner læreboka også i pdf hvis du søker litt rundt. Men du trenger altså ikke læreboka for å forstå bluej.

Denne forelesningsrekken fra Stanford burde du sjekke ut. Morsom professor og veldig lærerikt. Det er et grunnkurs i java, så de tar det step by step.

Første episode er veldig mye intern info for studente, men få med deg den siste biten, når han prater om "roboten", så du ikke er helt blank i episode 2.

https://www.youtube.com/watch?v=KkMD...A56BC7F4A1F852
Skal ta en titt på BlueJ, for øyeblikket bruker jeg Geany. Har fått til alle oppgavene som bygde på Constructors nå, sitter igjen med to oppgaver hvor jeg skal kalle tegnefunksjonen fra et annet program i tillegg til andre ting... Dette var ikke så enkelt, fant jeg ut. Legger ved koden min (den er nå litt rotete etter å ha prøvd flere forskjellige løsninger)..

Kode

//**********************************************************************
// Programming Projects 4.1
// Design and implement a class called Shape which calculates the area of
// a rectangle when the input is provided. Create a driver class called
// Polygon whose main method instantiates and draws the rectangle by calling
// the Shape object
//**********************************************************************
import java.awt.*;
import javax.swing.JPanel;

public class Shaping extends JPanel {
	int width, height;
	double area;
	
	public Shaping(int theWidth, int theHeight) {
		width = theWidth;
		height = theHeight;
		}
	public Shaping (Graphics page) {
		page.drawRect(20, 20, width, height);
	}
	//public void draw (Graphics page) {
		//page.drawRect(20, 20, width, height);
		
	//}
	
        public void setWidth(int newWidth) {
            width = newWidth;
        }
	
        public void setHeight(int newHeight) {
            height = newHeight;
        }
	
        public int getHeight() {
            return height;
        }
        
        public int getWidht () {
            return width;
        }
        
        
        public double getArea () {
            area = width * height;
            return area;
        }
}

Kode

import java.util.Scanner;
import javax.swing.JFrame;

public class Polygon {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        JFrame frame = new JFrame ("Rectangle");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        
        Shaping panel = new Shaping();
        frame.getContentPane().add(panel);
        
        frame.pack();
        frame.setVisible(true);
        
        int sideone, sidetwo;
        System.out.println("Input sidesof rectangle, x and y");
        sideone = scan.nextInt();
        sidetwo = scan.nextInt();
        Shaping rectangle = new Shaping(sideone, sidetwo) {};
        System.out.println(rectangle.getArea());
        // Calculating the area works, drawing the rectangle still doesn't work...
        
	}
}
Ser i den første koden din at du har en klasse som du kaller "Vehicles" som extender "Car". Dette blir snudd helt på hodet...

Først og fremst bør du tenke på en klasse som ET objekt, så klassen bør kalles "Vehicle". Hvis du skal ha flere lager du flere instanser av klassen.

Vehicle er "grunnklassen" din, og inneholder alt som er felles for ALLE kjøretøy.

Så lager du en klasse som du kaller "Car extends Vehicle" og her lagrer du det som en bil har, men som ikke nødvendigvis et kjøretøy har. Dette vil medføre at en instans av en "Car" også vil være en instans av en "Vehicle", men ikke omvendt. Siden du sannsynligvis ikke kommer til å lage noen instanser av "kjøretøy" i seg selv (dette er jo en "samleklasse) kan du gjøre klassen abstract, slik at den ikke kan instansieres.

Nå kan du f.eks skrive:

Vehicle v = new Car("Opel");

Nå kan du kun kjøre metoder fra "Vehicle" på den.

// v.getType();

siden du vet at v er en "Car" nå, kan du "caste" den til det

(Car)v.getName(); // metode fra "Car"
Sitat av lroedal Vis innlegg
Skal ta en titt på BlueJ, for øyeblikket bruker jeg Geany. Har fått til alle oppgavene som bygde på Constructors nå, sitter igjen med to oppgaver hvor jeg skal kalle tegnefunksjonen fra et annet program i tillegg til andre ting... Dette var ikke så enkelt, fant jeg ut. Legger ved koden min (den er nå litt rotete etter å ha prøvd flere forskjellige løsninger)..

Kode

//**********************************************************************
// Programming Projects 4.1
// Design and implement a class called Shape which calculates the area of
// a rectangle when the input is provided. Create a driver class called
// Polygon whose main method instantiates and draws the rectangle by calling
// the Shape object
//**********************************************************************
import java.awt.*;
import javax.swing.JPanel;

public class Shaping extends JPanel {
	int width, height;
	double area;
	
	public Shaping(int theWidth, int theHeight) {
		width = theWidth;
		height = theHeight;
		}
	public Shaping (Graphics page) {
		page.drawRect(20, 20, width, height);
	}
	//public void draw (Graphics page) {
		//page.drawRect(20, 20, width, height);
		
	//}
	
        public void setWidth(int newWidth) {
            width = newWidth;
        }
	
        public void setHeight(int newHeight) {
            height = newHeight;
        }
	
        public int getHeight() {
            return height;
        }
        
        public int getWidht () {
            return width;
        }
        
        
        public double getArea () {
            area = width * height;
            return area;
        }
}

Kode

import java.util.Scanner;
import javax.swing.JFrame;

public class Polygon {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        JFrame frame = new JFrame ("Rectangle");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        
        Shaping panel = new Shaping();
        frame.getContentPane().add(panel);
        
        frame.pack();
        frame.setVisible(true);
        
        int sideone, sidetwo;
        System.out.println("Input sidesof rectangle, x and y");
        sideone = scan.nextInt();
        sidetwo = scan.nextInt();
        Shaping rectangle = new Shaping(sideone, sidetwo) {};
        System.out.println(rectangle.getArea());
        // Calculating the area works, drawing the rectangle still doesn't work...
        
	}
}
Vis hele sitatet...
BlueJ er meget OK til å lære seg fundamentals. Objects First With Java 5th edition finner du på Google (på reddit). Denne boken tar deg gjennom steg for steg. Det er denne vi følger på universitetet i et introduksjonsfag.
Har et ekstra spm. lengre ned i tråden nå, legger det her også.

Sitat av lroedal Vis innlegg
Skal ta en titt på BlueJ, for øyeblikket bruker jeg Geany. Har fått til alle oppgavene som bygde på Constructors nå, sitter igjen med to oppgaver hvor jeg skal kalle tegnefunksjonen fra et annet program i tillegg til andre ting... Dette var ikke så enkelt, fant jeg ut. Legger ved koden min (den er nå litt rotete etter å ha prøvd flere forskjellige løsninger)..

Kode

//**********************************************************************
// Programming Projects 4.1
// Design and implement a class called Shape which calculates the area of
// a rectangle when the input is provided. Create a driver class called
// Polygon whose main method instantiates and draws the rectangle by calling
// the Shape object
//**********************************************************************
import java.awt.*;
import javax.swing.JPanel;

public class Shaping extends JPanel {
	int width, height;
	double area;
	
	public Shaping(int theWidth, int theHeight) {
		width = theWidth;
		height = theHeight;
		}
	public Shaping (Graphics page) {
		page.drawRect(20, 20, width, height);
	}
	//public void draw (Graphics page) {
		//page.drawRect(20, 20, width, height);
		
	//}
	
        public void setWidth(int newWidth) {
            width = newWidth;
        }
	
        public void setHeight(int newHeight) {
            height = newHeight;
        }
	
        public int getHeight() {
            return height;
        }
        
        public int getWidht () {
            return width;
        }
        
        
        public double getArea () {
            area = width * height;
            return area;
        }
}

Kode

import java.util.Scanner;
import javax.swing.JFrame;

public class Polygon {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        JFrame frame = new JFrame ("Rectangle");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        
        Shaping panel = new Shaping();
        frame.getContentPane().add(panel);
        
        frame.pack();
        frame.setVisible(true);
        
        int sideone, sidetwo;
        System.out.println("Input sidesof rectangle, x and y");
        sideone = scan.nextInt();
        sidetwo = scan.nextInt();
        Shaping rectangle = new Shaping(sideone, sidetwo) {};
        System.out.println(rectangle.getArea());
        // Calculating the area works, drawing the rectangle still doesn't work...
        
	}
}
Vis hele sitatet...
En del av poenget ved å utvide (extends) en klasse, er å ha mulighet til å endre på hvordan objektet oppfører seg. Dette begrepet kalles for polymorfisme, og betyr i hovedsak (innen objekt-orientert programmering) at underklasser (klasser som extends en annen) kan overkjøre (override) hvordan systemet håndterer et metodekall. Dette er noe abstrakt, men la meg prøve å forklare litt mer konkret.

JPanel klassen inneholder en metode som heter paintComponent. Denne metoden kalles automatisk av systemet når et JPanel objekt blir synlig, eller når vinduet objektet er festet til endrer størrelse. Metoden gjør egentlig bare en ting; fjerner alt som har blitt tegnet på panelet.

Når man utvider JPanel, får man også tilgang til å overkjøre hva som skal skje når systemet kaller metoden paintComponent. Metoden paintComponent har et Graphics objekt som argument, som kan brukes til å tegne rektangelet (eller andre figurer) på panelet.

Kode

public class Shaping extends JPanel {
    private int width, height;

    public Shaping(int width, int height){
        this.width = width;
        this.height = height;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g); //fjerner alt
        g.drawRect(20, 20, width, height);
    }

    public int getArea(){
        return width * height;
    }
}
I koden over fjernes alt som er tegnet i panelet hver gang paintComponent metoden kalles, før man så tegner et rektangel med oppgitt bredde og høyde. Dersom du ikke kaller super.paintComponent(g) for hver gang, vil det nye rektangelet bare tegnes over det som finnes fra før. Det er kanskje ikke så farlig når rektangelet skal tegnes samme plass hver gang, men om du har animasjon, vil du fort se at det kan være en fordel å ha det med.