Java programs are what is known as statically and strongly defined. Thus, the kinds of all the variables must be known at the time that the program is written. That seems that variables have to be declared to have a particular type before they are given. It also seems that the variables cannot be used in a way that is inconsistent with their kind. So, for that point, you would define x to be an integer by saying
x = 6 * 7;
But you would get into trouble if you left out the definition, or did
x = "thing";
because a type checker is execute on your program to make sure that you don't try to use a variable in a way that is inconsistent with its declaration.
In Python, however, things are a lot more reliable. There are no variable definition, and the similar variable may be used at different positions in your program to hold data objects of different kinds. So, the following is ok, in Python:
if x == 1:
x = 89.3
x = "thing"
The advantage of having type declarations and compile-time type checking, in Java, is that a compiler can create an executable version of your program that runs very rapidly, because it may be certain about what kind of data is stored in each and every variable, and it does not have to calculate it at execution time. An additional advantage is that several programming mistakes can be caught at compile time, rather than waiting until the program is being execute. Java could complain even before your program started to run that it could not evaluate
3 + "hi"
Python could not complain until it was executing the program and got to that point.
The advantage of the Python approach is that programs are shorter and cleaner seeing, and possibly simpler to write. The flexibility is often useful: In Python, it is simple to create a list or array with objects of different types saved in it. In Java, it may be done, but it is trickier. The disadvantage of the Python function is that programs tend to be lighter. Also, the rigor of compile time checking may replace bugs, especially in big programs.