Declarando classes usando extends

Olá, estou tentando saber o que imprimi na IDE o código abaixo, mas ocorrem vários erros. Queria saber como escrever os códigos sem erros:

public class Foo {
  public void print() {
    System.out.println("Foo");
  }
}
public class Bar extends Foo {
  public void print() {
    System.out.println("Bar");
  }
}
public class Wee extends Bar {
  @Override
  public void print() {
    System.out.println("Wee");
  }
}

E o código, que usa essas classes:

Foo f = new Bar();
f.print();

f = new Wee();
f.print();

Quais erros? Peguei seu código e executei aqui sem problemas. A saída no console foi:

Bar
Wee

Obrigado @Lucas_Camara pela resposta.
Acredito que o meu está apresentando falhas na hora de inserir de forma correta os dados finais. Essa parte aqui:

Foo f = new Bar();
f.print();

f = new Wee();
f.print();

Como você organizou o código completo? Tem como compartilhar?

Como foi soh para testar, coloquei todas as classes no mesmo arquivo:

public class Main {

	public static void main(String[] args) throws Exception {
		Foo f = new Bar();
		f.print();

		f = new Wee();
		f.print();
	}

	public static class Foo {
		public void print() {
			System.out.println("Foo");
		}
	}

	public static class Bar extends Foo {
		public void print() {
			System.out.println("Bar");
		}
	}

	public static class Wee extends Bar {
		@Override
		public void print() {
			System.out.println("Wee");
		}
	}
}

Mas iria funcionar do mesmo jeito se estivessem em arquivos diferentes.

Entendi… o erro que a IDE me mostra é:

C:\testandojava2\src\Foo.java:3:9
java: illegal start of expression

e o código completo está assim:

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

        public static void main(String[] args) throws Exception {
            Foo f = new Bar();
            f.print();

            f = new Wee();
            f.print();
        }

        public static class Foo {
            public void print() {
                System.out.println("Foo");
            }
        }

        public static class Bar extends Foo {
            public void print() {
                System.out.println("Bar");
            }
        }

        public static class Wee extends Bar {
            @Override
            public void print() {
                System.out.println("Wee");
            }
        }
    }
}

}

e todos os meus public estão sublinhados de vermelho.

Desculpa não saber explicar muito bem e ter quase ZERO de conhecimento. Eu tenho duas semanas que comecei a estudar JAVA. primeiro contato na vida

O problema é que vc está criando uma classe Foo, que tem um método main e, dentro do método main, tem outra class Main.

Deixa só assim:

public class Main {
    public static void main(String[] args) throws Exception {
        // código vem aqui
    }
    
    //  restante
}

Fiz exatamente como vc disse:

    public class Main {
    public static void main(String[] args) throws Exception {
        Foo f = new Bar();
        f.print();
        f = new Wee();
        f.print();
    }

    public class Foo {

        public void print() {

            System.out.println("Foo");

        }

    }


    public class Bar extends Foo {

        public void print() {

            System.out.println("Bar");

        }

    }

    public class Wee extends Bar {

        @Override
        public void print() {

            System.out.println("Wee");

        }

    }
}

Mais os erros me perseguem ainda:
C:\testandojava2\src\Main.java:3:17
java: non-static variable this cannot be referenced from a static context

Mas com toda a certeza, ainda estou fazendo algo errado! :pensive:

Ah sim. Da forma como fiz (colocando todas as classes no mesmo arquivo), vc tem 2 opções.

Coloca as claases como static ou muda a forma de instanciar essas classes no método main. Para instanciar no método main sem as classes serem static, vc faz assim:

Main main = new Main();

Foo f = main.new Bar();
f.print();

f = main.new Wee();
f.print();

Se vc colocar as classes fora da classe Main (sem elas serem public) ou em arquivos separados, não precisa fazer nada disso e só instanciar normalmente.

Veja como ficaria todas as classes no mesmo arquivo, porém, sem estarem dentro da classe Main:

Arquivo Main.java

public class Main {

	public static void main(String[] args) throws Exception {
		Foo f = new Bar();
		f.print();
		
		f = new Wee();
		f.print();
	}
}

// dentro do mesmo arquivo só pode ter apenas uma classe pública

class Foo {
	public void print() {
		System.out.println("Foo");
	}
}

class Bar extends Foo {
	public void print() {
		System.out.println("Bar");
	}
}

class Wee extends Bar {
	@Override
	public void print() {
		System.out.println("Wee");
	}
}
1 curtida

Dessa vez deu certo… valeu

Qualquer erro pra quem está começando, parece o fim do mundo.
Depois que você vê onde estava o falhando, percebe o abismo de conhecimento que ainda falta adquirir! Muito obrigado mesmo pela ajuda… vou continuar a assistir aulas e praticar!