o problema ai é o seguinte:
aqui
double variavel=1/3;
System.out.println(variavel);
ele ta fazendo o seguinte
int tmp=1/3; //por que 1 e 3 são inteiros
double variavel=(double)tmp;
e aqui
double x=1;
double y=3;
System.out.println(x/y);
ele esta fazendo realmente uma divisão de ponto flutuante, a diferença basica é que no primeiro ele divide os inteiros e transforma o resultado em double 
o seguinte codigo também funcionaria 
public class Teste{
public static void main(String [] a){
double variavel=1/3.0;
System.out.println(variavel);
}
}
por que neste caso, um dos operadores é double/float ai ele vai primeiro promover o integer para double e depois realizar a operação 
isto é uma das coisas que sinto falta do delphi 
quer fazer operações de ponto flutuante?? utilize “/”, quer fazer operações de inteiros?? utilize “div” 
mais simples do que a abordagem do java 
se bem que depois que se comessa a entender este esquema de promoções numericas fica mais facil 