Javaを学び始めて思ったJavaのダメなとこ

Javaを必要に駆られて、5年ほどぶりに勉強しなおしてみているが、
Javaのダメなところがちょこちょこ見つかったので、
どのようにダメなのか書いてみた。

Staticが汚い
javaに限ったことではないが、こんなコードは非常に汚いように私には見えます。

class A{
    public static void main(String[] args){
        Home home = new Home();
    }
}
class Home{
    private static count = 0;
    public Home(){
        count++;
        System.out.println(count+"回Newされました。");
    }
}

まぁ汚い、これは[Home]が[new]されるたびに[Home]が持つ[count]がカウントアップされます。
これの何が良くないかというと[Home]が[new]されるたびに処理を変えることができ、
この[Home]では[count]の値によって処理が変化することはありませんが、
これが、[count]の値が、10 の倍数の時にファイル出力する というプログラムであった時、
いつ、どの時点でファイル出力されるのか分かりにくく、
汚い。。。という文章も汚い

変数宣言が汚い
これについてはC#とPHPをメインにJavaScriptを使ってるからかもしれませんが、

import java.util.ArrayList;
class B{
    ArrayList> Cints = new ArrayList>(); //これが汚い
    public static void main(String[] args){

    }
}
class CInt{
   int i = 0;
   int b = 0;
}

正直アホかと[Cints]は[ArrayList<ArrayList<CInt>>]で初期化されてるので、
[Cints]の型は当然 [ArrayList<ArrayList<CInt>>]になるのは分かるはずだが、
Javaでは[ArrayList<ArrayList<CInt>> Cints]なんて長い宣言をしなければならず、これが、
[ArrayList]の2次元であるからまだ分かりやすいけど、これが3次元で、[CInt]がもっと長いクラス名であった時、
どこに変数が書かれているのかわかりにくく、非常に汚くなる。
確かに、次のような場合はこのように書かなくてはならないのはわかるが

class C{
    Parent child = new Child();
    public static void main(String[] args){
    }
}
class Parent{
    int i = 0;
}
class Child extends Parent{
    Child(){
        i = 10;
    }
}

そういうのはプログラマがどうすれば綺麗になるのか考えて、取捨選択すればよいだけのことで、
強制的にこの[型]を使い、これで初期化する なんて明記しなくてはならないのはコードの見易さ的に
ダサいくて、
汚い。。。。という文章もやはり汚い