黑马程序员技术交流社区

标题: 学习经历 [打印本页]

作者: 啰嗦的奶子    时间: 2019-5-9 17:03
标题: 学习经历
1,面向对象的特征:抽象,继承,封装, 多态
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,它只关注有哪些,而不关注细节。它包括数据抽象和行为抽象
继承:继承是从已有类得到继承信息创建新类的过程,父类(超类,基类) 子类(导出类,派生类)
封装:把数据和方法装进类中以及具体的实现的隐藏,只向外界提供最简单的编程接口,被称为“封装”;
多态性:对同一消息作出不同的响应。即父类接口建立起一种基本形式,不同的子类有不同的方式表示此接口
    实现运行时多态:1. 方法重写(子类继承父类并重写父类中已有的或抽象的方法);
              2. 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。


2,多态性分为编译时的多态性和运行时的多态性。
    编译时多态性:使用private或static或final修饰的变量或者方法,使用静态绑定。
    运行时多态性:比如方法重写实现后绑定,根据具体的实例对象才能具体确定是哪个方法
 绑定:函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系
关于JAVA方法的静态绑定和动态绑定:http://www.cnblogs.com/ygj0930/p/6554103.html

3,父类不能调用子类新添的方法原因:因为在代码的编译阶段,编译器通过 声明对象的类型(即引用本身的类型) 在方法区中该类型的方法表中查找匹配的方法
    PS:确保方法的存在性,保证能程序的安全性。
   

4,静态绑定:在JVM运行过程中,会把类的类型信息、static属性和方法、final常量等元数据加载到方法区,
         这些在类被加载时就已经知道,不需对象的创建就能访问的。
   动态绑定:JVM会把刚才引用的实例对象压入操作数栈,用它进行实际调用,根据实例对象所属的类型去查找它的方法表,找到匹配的方法进行调用。
    需要等对象创建出来,使用时根据堆中的实例对象的类型才进行取用的就是动态绑定的内容。

5,创建枚举:枚举包含固定数目(不能在产生新对象),可供选择的不变对象(final static)。
public class EnumDemo {
    private String day;
    public static final EnumDemo 
            MON = new EnumDemo("MON"),
            SUN = new EnumDemo("SUN");
    
    private EnumDemo(String day) {
        this.day = day;
    }
    public String toString() { //重写toString方法,便于打印日期
        return day;
    }    

}


6,对于private方法会被自动认为是final方法

7,要阻止某个类产生对象,可以在该类中只添加方法的声明而无具体实现,该类称为抽象类。 添加方法: abstract void f();,
被abstract修饰的类不能被实例化

8,在JAVA中所有转型都会被检查,在进入运行时期仍然会对其进行检查,然后决定是否抛出异常。

9,JAVA运行:  编译+运行
在编译后,一个JAVA文件会生成多个.class文件。进入main方法,在发现要用到类时,此时类未被加载,JVM会找到类.class文件来加载类,创建CLASS对象,并且初始化静态变量。这就相当于建立了一个该类的
一个模板,之后每次建立一个该类的对象时,只会初始化非静态变量。
    main方法开始时只是启动了一个java虚拟机,除了一些必要类库,其他类都不加载,目的主要是为了速度快。
class One{
    int i ;
    {
        System.out.println("父非静态变量" + i);
    }
    static {
        System.out.println("父静态变量");
    }
    public One() {
        System.out.println("基类构造函数");
    }
}
class Two extends One{
    static {
        System.out.println("子类静态变量");
    }
    public static void printf(){
        System.out.println("静态方法子类");
    }
    {
        System.out.println("子的非静态变量");
    }
    public Two() {
        System.out.println("子类构造函数");
    }
}
public class Demo {
    public static void main(String[] args) {
        Two.printf();
        /**
         * 父静态变量
子类静态变量
静态方法子类

         */
        //Two two = new Two();
        /**
         * 父静态变量
子类静态变量
父非静态变量0
基类构造函数
子的非静态变量
子类构造函数
         */
        //Two two2 = new Two();
        /**
         * 父非静态变量0
基类构造函数
子的非静态变量
子类构造函数
         */
    }
    
}
10,静态内部类中可以定义静态字段或方法,但也可以定义普通方法,它可以不依赖于外部类实例被实例化。。 非静态内部类中不能定义static字段或方法,
必须依赖于外部类实例来实例化。
11,可以在不同类中定义相同名的变量,即使是内部类。而在同一个类中不可以。即使在不同代码块也行, 但是在有包含关系的{}就不行。 
12,而静态的方法是无法被重写的,所谓静态,就是在运行时,虚拟机已经认定此方法属于哪个类。
.java中的变量都是静态绑定的,方法的话只有static和final(所有private默认是final的)是静态绑定的
13,在Java开发中,上下文类和工具类中通常会有大量的静态成员.因为一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝
作者: 夜听雨    时间: 2019-8-12 15:22
面对生活的选择,可怕的不是“大环境”,而是我们自己。勇于走出自己的舒适圈,勇于挑战自己,加油……
作者: 柠檬leung不酸    时间: 2019-9-12 14:00
除了恐惧和欲望,还有什么可以激励自己长期地努力?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2