今天是周二,没有什么很特别的事情。这篇博客是周三早上在公司写的,昨天晚上不知道为啥有点困,不过周三早起也很困。。是不是应该早点睡觉?从12点半睡到8点半还不够吗,那就再早点吧。嘿嘿,周三早上去公司的时候碰到了隔壁楼的一个小姐姐,虽然不是特别好看但是长得很可爱,比较年轻,看起来好像学生。好怀念在学校的时候,女生都那么单纯可爱。扯远了扯远了,是时候学习了。哎,呆的还是好尴尬,难受哦,我太弟弟了。

public class ClassTest {
    private static String word = "说了句话!";

    class Cat {
        public void say() {
            System.out.println("喵喵~~");
        }

        public void saySth() {
            System.out.println("喵喵~~" + word);
        }

    }

    public static void main(String[] args) {
        ClassTest classTest = new ClassTest();

        /**
         * 内部类,面向对象程序设计中,可以在一个类的内部定义另一个类,
         * 静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。
         * 内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。
         *
         * 在调用的时候内部类要通过外面这层类进行调用才行
         **/
        ClassTest.Cat cat = classTest.new Cat();
        cat.saySth();

        ClassTest.Cat cat1 = classTest.new Cat();
        cat1.say();
        /**
         * 匿名类
         * 匿名类是不能有名字的类,它们不能被引用,只能在创建时用New语句来声明它们
         * 匿名类的声明是在编译时进行的,实例化在运行时进行,这意味着for循环中的一个new语句会创建相同匿名类的几个实例,
         * 而不是创建几个不同匿名类的一个实例
         * 匿名类的目的是在某个地方需要特殊的实现,因此在该处编写其实现,并获取它的实例,调用它的方法
         * 不要在匿名内部类编写其他的方法,是不可见的。
         * 形式为:new <类或接口> <类的主体>
         * 最后的say是直接调用匿名类定义的say方法
         */
        new Object(){
            void say(){
                System.out.println("匿名类输出");
            }
        }.say();

        //匿名内部类重写Dog类的say()方法,匿名类直接new的话需要类之前已经声名过
        new Dog(){
            void say(){
                System.out.println("汪汪汪");
            }
        }.say();

        test();

    }
    public static void test(){
        // 方法中的匿名内部类
        new Object()
        {
            void say()
            {
                System.out.println("test---say");
            }
        }.say();
        // 方法中的内部类,只是这个内部类只能在内部调用但是不能在外层的类中进行调用
        class Person{
            public void say(){
                System.out.println("Person say something!");
                class PersonSon{
                    public void say() {
                        System.out.println("i am her son");
                    }
                }
                PersonSon personSon = new PersonSon();
                personSon.say();
        }
    }
        Person person = new Person();
        person.say();

    }
}

/**
 * 文件类Dog,很普通的文件类
 */
class Dog {
    void say()
    {
        System.out.println("汪汪~~");
    }
}

接口的默认方法
假设没有默认方法这种机制,那么如果要为Mortal增加一个新的方法revive,那么所有实现了Mortal接口的类,都需要做改动。
但是引入了默认方法后,原来的类,不需要做任何改动,并且还能得到这个默认方法
通过这种手段,就能够很好的扩展新的类,并且做到不影响原来的类

构造器与构造方法
我总是要把构造器和方法混淆,后来发现,方法实际上是需要用于执行java代码的,而构造器,是一个类的实例
类的实例,我们需要用类来创建对象,进而访问其属性,因为实例是需要被用来调用的,但是调用的话,我们不得不去考虑一个问题,就是对象,最终是被存储在内存里面的,而存储的时候,我们的内存不得不需要给他再另外开辟新的内存空间,那么,java是如何给这种我们所需要的类来开辟内存空间的呢?这就涉及到了java的内存机制,就是说,我们必须要给这个类制作一个构造器,而且这个构造器的名称必须和这个类的名称是一致的,这样,我们的java编译器才能识别这个类,进而给这个类在内存中开辟内存空间,也就是我们所说的,我们手动,人为的给他进行“初始化”