0

in my public class card, if I do not declare this class as static the program will not run, and all my new card objects will return the following error:

non-static variable this cannot be referenced from a static context
    card card1 = new card();

Firstly, my professor has told me that the class should not be static, but has not explained why.

Secondly, I do not understand why the main method (I know it's static) cannot reference a non-static variable.

I think I'm not understanding something fundamental here, but I need to understand what's going on here before moving on.

I've found this definition:

the keyword static indicates that the particular member belongs to a type itself, rather than to an instance of that type.

I have really no clue what that means. A particular member, is that referring to an object? an instance of that type? also sounds like its referring to an object that belongs to a specific class. To me something that declared static is private, and only other classes that are declared static can operate with each other - is that right? If so, why not just use the word 'private'.

The code:

import java.util.Random;
public class playing_cards {

    public class card // sets up class
    {
        int face = 0;
        int suit = 0;
        String faceText;
        String faceValue;
        String suitValue;
        String suitText;

        public card() // card constructor, initially generates card number and suit
        {
            int face = 0;
            int suit = 0;
            Random generator = new Random();
            face = generator.nextInt(13) + 1;
            suit = generator.nextInt(4) + 1;
        }

        public int getFace() // sets up card face value
        {
            Random generator = new Random();
            face = generator.nextInt(13) + 1;
            return face;
        }

        public int getSuit() // sets up card suit value
        {
            Random generator = new Random();
            suit = generator.nextInt(4) + 1;
            return suit;
        }
        public String getFacetext() // gets card numeric value textually
        {
            switch(face)
            {
                case 1:
                faceText = "one";
                break;

                case 2:
                faceText = "two";
                break;

                case 3:
                faceText = "three";
                break;

                case 4:
                faceText = "four";
                break;

                case 5:
                faceText = "five";
                break;

                case 6:
                faceText = "six";
                break;

                case 7:
                faceText = "seven";
                break;

                case 8:
                faceText = "eight";
                break;

                case 9:
                faceText = "nine";
                break;

                case 10:
                faceText = "ten";
                break;

                case 11:
                faceText = "eleven";
                break;

                case 12:
                faceText = "twelve";
                break;

                case 13:
                faceText = "thirtee";
                break;
            }

            return faceText;
        }

        public String getSuittext() // gets card's suit value
        {
            switch (suit)
            {   case 1:
                suitText = "hearts";
                break;

                case 2:
                suitText = "spades";
                break;

                case 3:
                suitText = "diamonds";
                break;

                case 4:
                suitText = "clubs";
                break;

        }
        return suitText;
        }
        public String setCard(int face, int suit) // sets the card to passed through toString
        {
            switch (face)
            {
                case 1:
                faceValue = "ace";
                break;

                case 2:
                faceValue = "two";
                break;

                case 3:
                faceValue = "three";
                break;

                case 4:
                faceValue = "four";
                break;

                case 5:
                faceValue = "five";
                break;

                case 6:
                faceValue = "six";
                break;

                case 7:
                faceValue = "seven";
                break;

                case 8:
                faceValue = "eight";
                break;

                case 9:
                faceValue = "nine";
                break;

                case 10:
                faceValue = "ten";
                break;

                case 11:
                faceValue = "jack";
                break;

                case 12:
                faceValue = "queen";
                break;

                case 13:
                faceValue = "king";
                break;
            }

                switch (suit)
            {
                case 1:
                suitValue = "hearts";
                break;

                case 2:
                suitValue = "spades";
                break;

                case 3:
                suitValue = "diamonds";
                break;

                case 4:
                suitValue = "clubs";
                break;
            }

            return suitValue;


        }




        public String toString()
        {
            String result = faceValue + " of " + suitValue;
            return result;
        }


    }

    public static void main(String[] args) {

        card card1 = new card();
        card card2 = new card();
        card card3 = new card();
        card card4 = new card();
        card card5 = new card();
        card card6 = new card();
        card card7 = new card();
        card card8 = new card();
        card card9 = new card();
        card card0= new card();



        card1.setCard(card1.getFace(), card1.getSuit()); // sets each cards numeric value and suit and passes through toString
        System.out.println(card1.toString());
        card2.setCard(card2.getFace(), card2.getSuit());
        System.out.println(card2.toString());
        card3.setCard(card3.getFace(), card3.getSuit());
        System.out.println(card3.toString());
        card4.setCard(card4.getFace(), card4.getSuit());
        System.out.println(card4.toString());
        card5.setCard(card5.getFace(), card5.getSuit());
        System.out.println(card5.toString());
        System.out.println("");

        card6.setCard(1, 1);
        System.out.println(card6.toString());
        card7.setCard(13,4);
        System.out.println(card7.toString());
        card8.setCard(15,5);
        System.out.println(card8.toString());
        card9.setCard(2,2);
        System.out.println(card9.toString());
        card0.setCard(3,2);
        System.out.println(card0.toString());
        System.out.println("");

        System.out.println("Card one's suit is " + card1.getSuittext());
        System.out.println("Card one's textual face value is " + card1.getFacetext());

    }
}
halfer
  • 19,824
  • 17
  • 99
  • 186
  • 1
    Instead of your big switches, you may just have arrays that you access using the int you have – azro Jul 02 '20 at 20:54
  • 1
    *Main method cannot refer to non-static variable* - `main` is a `static` method. Java does not allow a `static` method to access a non-static member directly (i.e. without using the object). – Arvind Kumar Avinash Jul 02 '20 at 20:54
  • 2
    If you want anybody to be able to read your code (this includes you, in the not-so-distant future), get into the habit of indenting it. Basically: whenever you use a `{`, indent; whenever you use a `}`, outdent. Using a tool to do it is fine; it will genuinely help yourself and others to understand the structure of your code. – Andy Turner Jul 02 '20 at 21:00
  • *"my professor has told me that the class should not be static"* Your professor is wrong. – Andreas Jul 02 '20 at 21:01

2 Answers2

-1

You have to separate Card in a new class.

Create a class named Card.java:

import java.util.Random;

public class Card {

        int face = 0;
        int suit = 0;
        String faceText;
        String faceValue;
        String suitValue;
        String suitText;

        public Card() // card constructor, initially generates card number and suit
        {
            int face = 0;
            int suit = 0;
            Random generator = new Random();
            face = generator.nextInt(13) + 1;
            suit = generator.nextInt(4) + 1;
        }

        public int getFace() // sets up card face value
        {
            Random generator = new Random();
            face = generator.nextInt(13) + 1;
            return face;
        }

        public int getSuit() // sets up card suit value
        {
            Random generator = new Random();
            suit = generator.nextInt(4) + 1;
            return suit;
        }
        public String getFacetext() // gets card numeric value textually
        {
            switch(face)
            {
                case 1:
                    faceText = "one";
                    break;

                case 2:
                    faceText = "two";
                    break;

                case 3:
                    faceText = "three";
                    break;

                case 4:
                    faceText = "four";
                    break;

                case 5:
                    faceText = "five";
                    break;

                case 6:
                    faceText = "six";
                    break;

                case 7:
                    faceText = "seven";
                    break;

                case 8:
                    faceText = "eight";
                    break;

                case 9:
                    faceText = "nine";
                    break;

                case 10:
                    faceText = "ten";
                    break;

                case 11:
                    faceText = "eleven";
                    break;

                case 12:
                    faceText = "twelve";
                    break;

                case 13:
                    faceText = "thirtee";
                    break;
            }

            return faceText;
        }

        public String getSuittext() // gets card's suit value
        {
            switch (suit)
            {   case 1:
                suitText = "hearts";
                break;

                case 2:
                    suitText = "spades";
                    break;

                case 3:
                    suitText = "diamonds";
                    break;

                case 4:
                    suitText = "clubs";
                    break;

            }
            return suitText;
        }
        public String setCard(int face, int suit) // sets the card to passed through toString
        {
            switch (face)
            {
                case 1:
                    faceValue = "ace";
                    break;

                case 2:
                    faceValue = "two";
                    break;

                case 3:
                    faceValue = "three";
                    break;

                case 4:
                    faceValue = "four";
                    break;

                case 5:
                    faceValue = "five";
                    break;

                case 6:
                    faceValue = "six";
                    break;

                case 7:
                    faceValue = "seven";
                    break;

                case 8:
                    faceValue = "eight";
                    break;

                case 9:
                    faceValue = "nine";
                    break;

                case 10:
                    faceValue = "ten";
                    break;

                case 11:
                    faceValue = "jack";
                    break;

                case 12:
                    faceValue = "queen";
                    break;

                case 13:
                    faceValue = "king";
                    break;
            }

            switch (suit)
            {
                case 1:
                    suitValue = "hearts";
                    break;

                case 2:
                    suitValue = "spades";
                    break;

                case 3:
                    suitValue = "diamonds";
                    break;

                case 4:
                    suitValue = "clubs";
                    break;
            }

            return suitValue;
        }

        public String toString()
        {
            String result = faceValue + " of " + suitValue;
            return result;
        }
}

Then,create (or use) the Main.java class and write:

public class Main {

    public static void main(String[] args) {

        Card card1 = new Card();
        Card card2 = new Card();
        Card card3 = new Card();
        Card card4 = new Card();
        Card card5 = new Card();
        Card card6 = new Card();
        Card card7 = new Card();
        Card card8 = new Card();
        Card card9 = new Card();
        Card card0= new Card();



        card1.setCard(card1.getFace(), card1.getSuit()); // sets each cards numeric value and suit and passes through toString
        System.out.println(card1.toString());
        card2.setCard(card2.getFace(), card2.getSuit());
        System.out.println(card2.toString());
        card3.setCard(card3.getFace(), card3.getSuit());
        System.out.println(card3.toString());
        card4.setCard(card4.getFace(), card4.getSuit());
        System.out.println(card4.toString());
        card5.setCard(card5.getFace(), card5.getSuit());
        System.out.println(card5.toString());
        System.out.println("");

        card6.setCard(1, 1);
        System.out.println(card6.toString());
        card7.setCard(13,4);
        System.out.println(card7.toString());
        card8.setCard(15,5);
        System.out.println(card8.toString());
        card9.setCard(2,2);
        System.out.println(card9.toString());
        card0.setCard(3,2);
        System.out.println(card0.toString());
        System.out.println("");

        System.out.println("Card one's suit is " + card1.getSuittext());
        System.out.println("Card one's textual face value is " + card1.getFacetext());

    }

    }

Your Card class has some strange methods that I didn't understand why you did like this. In general, I corrected some syntax conventions that you didn't respect (like the Camel Case). So, I will not criticize because you are still a student. Good lucky!

Murilo Góes de Almeida
  • 1,588
  • 5
  • 20
  • 42
-1

As the error says: You cannot refer to non-static variable in static method.

The easiest solution for you would be making another class in different file to which you will move your main method. You can also extract the card class. For example:

PlayingCards class:

public class PlayingCards {
    public static void main(String[] args) {

        card card1 = new card();
        card card2 = new card();
        card card3 = new card();
        card card4 = new card();
        card card5 = new card();
        card card6 = new card();
        card card7 = new card();
        card card8 = new card();
        card card9 = new card();
        card card0= new card();



        card1.setCard(card1.getFace(), card1.getSuit()); // sets each cards numeric value and suit and passes through toString
        System.out.println(card1.toString());
        card2.setCard(card2.getFace(), card2.getSuit());
        System.out.println(card2.toString());
        card3.setCard(card3.getFace(), card3.getSuit());
        System.out.println(card3.toString());
        card4.setCard(card4.getFace(), card4.getSuit());
        System.out.println(card4.toString());
        card5.setCard(card5.getFace(), card5.getSuit());
        System.out.println(card5.toString());
        System.out.println("");

        card6.setCard(1, 1);
        System.out.println(card6.toString());
        card7.setCard(13,4);
        System.out.println(card7.toString());
        card8.setCard(15,5);
        System.out.println(card8.toString());
        card9.setCard(2,2);
        System.out.println(card9.toString());
        card0.setCard(3,2);
        System.out.println(card0.toString());
        System.out.println("");

        System.out.println("Card one's suit is " + card1.getSuittext());
        System.out.println("Card one's textual face value is " + card1.getFacetext());
    }
}

Card class:

    public class card // sets up class
    {
    int face = 0;
    int suit = 0;
    String faceText;
    String faceValue;
    String suitValue;
    String suitText;
    
    public card() // card constructor, initially generates card number and suit
    {
        int face = 0;
        int suit = 0;
        Random generator = new Random();
        face = generator.nextInt(13) + 1;
        suit = generator.nextInt(4) + 1;
    }
    
    public int getFace() // sets up card face value
    {
        Random generator = new Random();
        face = generator.nextInt(13) + 1;
        return face;
    }
    
    public int getSuit() // sets up card suit value
    {
        Random generator = new Random();
        suit = generator.nextInt(4) + 1;
        return suit;
    }
    public String getFacetext() // gets card numeric value textually
    {
        switch(face)
        {
            case 1:
            faceText = "one";
            break;
    
            case 2:
            faceText = "two";
            break;
    
            case 3:
            faceText = "three";
            break;
    
            case 4:
            faceText = "four";
            break;
    
            case 5:
            faceText = "five";
            break;
    
            case 6:
            faceText = "six";
            break;
    
            case 7:
            faceText = "seven";
            break;
    
            case 8:
            faceText = "eight";
            break;
    
            case 9:
            faceText = "nine";
            break;
    
            case 10:
            faceText = "ten";
            break;
    
            case 11:
            faceText = "eleven";
            break;
    
            case 12:
            faceText = "twelve";
            break;
    
            case 13:
            faceText = "thirtee";
            break;
        }
    
        return faceText;
    }
    
    public String getSuittext() // gets card's suit value
    {
        switch (suit)
        {   case 1:
            suitText = "hearts";
            break;
    
            case 2:
            suitText = "spades";
            break;
    
            case 3:
            suitText = "diamonds";
            break;
    
            case 4:
            suitText = "clubs";
            break;
    
    }
    return suitText;
    }
    public String setCard(int face, int suit) // sets the card to passed through toString
    {
        switch (face)
        {
            case 1:
            faceValue = "ace";
            break;
    
            case 2:
            faceValue = "two";
            break;
    
            case 3:
            faceValue = "three";
            break;
    
            case 4:
            faceValue = "four";
            break;
    
            case 5:
            faceValue = "five";
            break;
    
            case 6:
            faceValue = "six";
            break;
    
            case 7:
            faceValue = "seven";
            break;
    
            case 8:
            faceValue = "eight";
            break;
    
            case 9:
            faceValue = "nine";
            break;
    
            case 10:
            faceValue = "ten";
            break;
    
            case 11:
            faceValue = "jack";
            break;
    
            case 12:
            faceValue = "queen";
            break;
    
            case 13:
            faceValue = "king";
            break;
        }
    
            switch (suit)
        {
            case 1:
            suitValue = "hearts";
            break;
    
            case 2:
            suitValue = "spades";
            break;
    
            case 3:
            suitValue = "diamonds";
            break;
    
            case 4:
            suitValue = "clubs";
            break;
        }
    
        return suitValue;
    }
    
    public String toString()
    {
        String result = faceValue + " of " + suitValue;
        return result;
    }
Domino
  • 124
  • 5