Tipagem JAVA

Gostaria que explicassem qual a tipagem de JAVA, pelo que li, tem tipagem FORTE, mas por que acontece o seguinte:

int aInt, bInt, cInt;
String aStr, bStr, cStr;
char aCh, bCh, cCh;
double aDb,bDb, cDb;
float aFlt, bFlt, cFlt;

aCh =‘a’;
bInt = 10;
aInt = aCh + bInt; //int = int + char
System.out.println("Teste int = int + char: "+aInt);

bStr = “a”;
aInt = 10;
aStr = bStr + aInt; //String = String + int
System.out.println("Teste String = String + int: "+aStr);

aDb = 1.12;
aStr = bStr + aDb; //String = String + double
System.out.println("Teste String = String + double: "+aStr);

aFlt = -9;
aDb = aInt + aFlt; //Double = int + float
System.out.println("Teste Double = int + float: "+aDb);

Tanto as variáveis mudam, como os prints concatenam os valores dados com a string do print.
Eu entendo que é natural que um short int, que é um char, poder ser somado com um inteiro, e também entendo que um double poder receber um int + float, mas não entendo por que dizer que a tipagem de JAVA é FORTE já que não estou recebendo variáveis do mesmo tipo, e retornar uma variável de outro tipo como no caso das strings e do double;
Por favor, quem souber essa me diz, blz?.. por que numa tipagem dinâmica isso não é aceito, dá erro eu operar soma com tipos diferentes. Não dá erro uma variável que tem um tipo receber um outro tipo completamente diferente. Por que JAVA tem tipagem FORTE e ESTÁTICA se essas coisas acontecem? Obrigado!

isso significa “declarar a variavel”, ñ tem haver com as somas e atribuições de diferentes tipos

acontece que em java, a classe String tem um tratamento todo especial, existe um recurso chamado sobrecarga de operadores, que ñ existe em java entretanto é imlpementado para classe String, assim vc pode ‘somar’ essa classe com variaveis de outros tipos, o retorno sera uma String concatenada com o valor literal do tipo, i.e., transfomado em uma sequência de caracter, seria algo como se a função String.concat fosse sobrescrita para os tipos primitivos (char, int, float…) e para classe Object, mas ao invés disso mais prático usar o operador + e +=

flw, t+

As variáveis não mudaram de tipo, em momento nenhum.

O que houve foi conversão de valores, e isso é permitido em tipagem forte. Somar dois ints tem um valor numérico inteiro. Quando você atribui isso a um double, esse valor é convertido para sua representação double, que é válida. Entretanto, o tipo das variáveis não mudou. O que era double continua sendo double, e as variáveis int continuam sendo variáveis int.

Note que se você tentar fazer o contrário, a conversão pode não ser perfeita, e por isso o Java irá exigir que você declare o tipo que está convertendo explicitamente:

double x = 1.5; int y = (double) x; //Se tentar remover o (double) vai obter um erro

No caso do string ser “somado” a um int, é a mesma coisa. Para fazer essa operação, o valor no interior do int é convertido para String, e então as Strings são concatenadas. Mas a variável int continua sendo int, e a variável String continua sendo String.

Ok, eu entendi o que o JAVA faz, mas acho necessário a discussão do seguinte:

String str1, str2;
int i1, i2;

i1 = 20;
str1 = "Teste " + i1;

Em str1 eu tenho a soma de inteiro e string, como posso somar inteiro e string? Eu concordo que em nenhum momento o tipo de cada da variável foi alterada. Mas o tipo foi alterado implicitamente para poder ser feita uma operação para a variável que vai receber o parâmetro, isso facilita, mas não acho que isso deixa claro o padrão de comportamento, pois se caso eu quisesse fazer o contrário:

str1 = “Teste”;
i2 = 20;
i1 = str1 + i2;

Essa atribuição geraria erro não é isso? Ela me obriga a fazer a conversão de str1 para int.
Em relação a definição de tipagem forte:

WIKI: “Uma linguagem de programação é fortemente tipado se não se permitem violações dos tipos de dados, isto é, dado uma variável de um tipo concreto, não se pode usar como se fosse uma variável de outro tipo diferente a não ser que se faça uma conversão.”

A minha confusão é por que JAVA converte implicitamente nos casos que que citei? Quem souber de mais casos, podem me mandar? Obrigado!
Obrigado pelas respostas, gostei de como a galera é prestativa… obrigado mais uma vez!

A maior parte das linguagens, mesmo as fortemente tipadas, permitem um conjunto básico de conversões implícitas.
Elas geralmente se baseiam nas seguintes regras:

a) Não há perda de informação (por isso, é possível converter short para int ou int para double);
b) Funciona em todos os casos (é sempre possível concatenar um inteiro a uma String. mas um String pode nem sempre ter um inteiro dentro);

Para os demais casos, a conversão precisa ser explícita.
É claro que você poderia ter uma linguagem que fosse fortemente tipada ao ponto de não existir conversões automáticas. Mas ela seria bastante chata de programar.

Valeu! Obrigado!

Não existem somas de inteiro com string. O teu problema não é de tipagem forte, e sim de ortogonalidade de operadores. O operador +, quando usado com números, é um operador de adição; quando usado com strings, é um operador de concatenação. Tudo bem definido no Java Language Specification.

Não tem nada de implícito, nem perda de dados, o comportamento do operador de concatenação é bem definido, se qualquer um dos operandos for uma string, o resultado final é uma string.