Estes conceitos estão sendo utilizados corretamente?

Olá, boa tarde a todos! Sou iniciante em Java/OOP e tenho dúvidas com relação à utilização de alguns conceitos. Eu ainda estou estudando o livro do Harvey Deitel: Java how to program 6 ed.!

Criei um programinha (bobo, sem a menor pretensão) para cristalizar os conceitos que tenho aprendido até aqui. Gostaria de saber de vocês (profissionais experientes), se os conceitos que eu utilizei nesse “programinha”, estão corretos; também, se essa é a melhor maneira de utilizar a herança e o encapsulamento (no caso, do método Scanner). Exemplo de conceitos a serem analisados:
extends, criação de objetos, palavra-chave static, função e organização das classes…

Breve explicação do que o “programa” faz:
a classe [color=green]MainTest [/color]passa um valor para a classe [color=darkblue]ProvidesScanner[/color], essa classe passa o valor para ser analisado, tratado para a classe [color=darkred]TreatResult[/color], que checa: se o valor recebido for true, então exibe uma mensagem. Senão, enquanto for false, invoca o método scanner() novamente para receber outro valor.

Abaixo está o fonte:

public class MainTest extends ProvidesScanner{
	public static void main( String args[] ){
		System.out.print("Please, insert your PIN: ");
		scanner();
	}
}
import java.util.Scanner;

public class ProvidesScanner{
	static TreatResult treatresult = new TreatResult();
	
	public static Scanner scanner()
	{
		Scanner input = new Scanner(System.in);
		String getScan = input.next();
		treatresult.setCheckPin(getScan);
		
		return scanner();
	}
}
public class TreatResult extends ProvidesScanner{
	public void setCheckPin( String pin ){
		if ( pin.equals("123abc") )
		{
			System.out.println("Welcome, PIN:" + pin);
		}
		else
		{
			while( !pin.equals("123abc") )
			{
				System.out.print("Bad pin! Please, try again: ");
				scanner();
			}
		}
	}
}

O “programa” foi feito apenas abstrair de mim mesmo os conceitos adquiridos e colocá-los de forma concreta, tangível para que eu pudesse visualizar; talvez isso tenha tornado alguns trechos inúteis, como no caso do encapsulamento do método Scanner();, mas como eu disse foi apenas para ilustrar os conceitos.

Obrigado a todos!

PS: O programa está compilando normalmente!