发表于: 2019-11-03 19:58:51

2 727


今天完成的事情:基础学习:反射总结:

1.什么时候加载类(类的加载时机)?
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。
(1)创建类的实例
(2)访问类的静态变量,或者为静态变量赋值
(3)调用类的静态方法
(4)使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
(5)初始化某个类的子类
(6)直接使用java.exe命令来运行某个主类
2.类加载器的分类?
(1)Bootstrap ClassLoader 根类加载器
* 也被称为引导类加载器,负责Java核心类的加载
* 比如System,String等。在JDK中JRE的lib目录下rt.jar文件中
(2)Extension ClassLoader 扩展类加载器
* 负责JRE的扩展目录中jar包的加载。
* 在JDK中JRE的lib目录下ext目录
(3)Sysetm ClassLoader 系统类加载器
* 负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径
3.获取字节码对象的三种方式?
(1)Object类的getClass()方法,判断两个对象是否是同一个字节码文件
(2)静态属性class,锁对象
(3)Class类中静态方法forName(),读取配置文件
4.反射中所用到的方法?
(1)构造方法
|--获取:getConstructor()和getConstructors()
|--执行:newInstance()
(2)普通的成员方法
|--获取:getMethod()和getMethods()
|--执行:invoke()
(3)成员变量
|--非私有:getField()和getFields()
|--私有:getDeclaredField
|--访问私有的成员变量先执行:setAccessible(true),然后执行set方法
5.泛型的擦除?
泛型只在编译期有效,在运行期会被擦除掉,生成.class文件之后泛型就没有了
6.暴力反射?
可以获取字节码对象中的所有属性和方法,包括私有.对于私有的属性和方法要使用暴力反射,即使用getDeclaredXxx()方法获取,
然后再设置可以访问,即调用setAccessible(true)
7.谈谈你对动态代理的理解?
8.JDK1.8的新特性?
(1)接口中可以定义有方法体的方法,如果是非静态,必须用default修饰
(2)如果是静态的就不用了
9.网络编程的三要素?
(1)IP地址
(2)端口号
(3)协议
10.UDP和TCP的区别?
(1)UDP:面向无连接,数据不安全,速度快。不区分客户端与服务端。
(2)TCP:面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
(3)三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
11.多线程中的总结?
(1)sleep()方法?释放执行权,不释放锁?
(2)wailt()方法?既释放锁,又释放执行权?

练习    String

public class StringTest1{
    public static void main(String[] args) {
        //demo1();
        //demo2();
        //demo3();
        //demo4();
        //demo5();
        //demo6();
        //demo7();
        //demo8();
        demo9();
    }

    public static void demo9() {
        String s = "ab";
        String s1 = "abc";
        String s2 = s + "c";
        String s3 = s;
        System.out.println(System.identityHashCode(s));
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));
        System.out.println(System.identityHashCode(s3));
        System.out.println("-------------------------------------------");
        String str1 = "重地";
        System.out.println(str1.hashCode());
        String str2 = "通话";
        System.out.println(str2.hashCode());
        System.out.println("-------------------------------------------");
        String str3 = "方面";
        //identityHashCode是根据对象再内存中的地址计算出一个hashCode值
        System.out.println(System.identityHashCode(str3));
        String str4 = "树人";
        System.out.println(System.identityHashCode(str4));
        System.out.println("-------------------------------------------");
        String str5 = "儿女";// 30 50
        //这里的hashCode方法调用的是String类中重写的hashCode方法,此方法根据字符串中的字符数组的每个元素计算出来的hashCode值的和
        System.out.println(str5.hashCode());
        String str6 = "农丰";// 40 40
        System.out.println(str6.hashCode());
    }

    public static void demo8() {
        String str1 = "AA";
        String str2 = "AA";
        System.out.println(str1 == str2);
        Person p1 = new Person("AA", 12);
        Person p2 = new Person("AA", 21);
        System.out.println(p1.name == p2.name);
    }

    public static void demo7() {
        String a = "hello2";
        final String b = "hello";
        String d = "hello";
        String c = b + 2;
        String e = d + 2;
        System.out.println((a == c));
        System.out.println((a == e));
    }

    public static void demo6() {
        // 定义一个字符串变量
        String str = "Hello ";
        System.out.println(System.identityHashCode(str));
        // 进行字符串连接运算
        str = str + "Java";
        // System.identityHashCode(str)是根据地址值算出的hashCode
        System.out.println(System.identityHashCode(str));
        // 进行字符串连接运算
        str = str + ", www.study.com";
        System.out.println(System.identityHashCode(str));
    }

    public static void demo5() {
        // 下面的定义创建了几个对象
        String str = "Hello " + "Java ," + "www.study.com";

        String str2 = new String("Hello Java");
    }

    public static void demo4() {
        String str1 = "Hello Java的长度:10";
        final String s1 = "Hello ";
        String str2 = s1 + "Java" + "的长度:10";
        System.out.println(str1 == str2);
        final int len = 10;
        String str3 = s1 + "Java" + "的长度:" + len;
        System.out.println(str1 == str3);
    }

    public static void demo3() {
        String str1 = "Hello Java的长度:10";
        // 因为str2的值包含了方法调用,因此不能在编译时确定
        String str2 = "Hello " + "Java" + "的长度:" + "Hello Java".length();
        System.out.println(str1 == str2);
        int len = 10;
        // 因为str3的值包含了变量,因此不能在编译时确定
        String str3 = "Hello " + "Java" + "的长度:" + len;
        System.out.println(str1 == str3);
        System.out.println(System.identityHashCode(str1));
        System.out.println(System.identityHashCode(str3));
    }

    public static void demo2() {
        String str1 = "Hello Java的长度:10";
        // 虽然str2的值不是常量,但因为str2的值可以在编译时确定
        // 所以str2也会直接引用字符串常量池中对应的字符串
        String str2 = "Hello " + "Java" + "的长度:" + 10;
        System.out.println(str1 == str2);
    }

    public static void demo1() {
        // str1的值是字符串直接量(常量)
        // 因此,str1指向字符串常量池中的"Hello Java"字符串
        String str1 = "Hello Java";
        // str2也指向字符串常量池中的"Hello Java"字符串
        String str2 = "Hello Java";
        // 下面程序将输出true
        System.out.println(str1 == str2);
        // System.out.println(System.identityHashCode(str1));
        // System.out.println(System.identityHashCode(str2));
    }
}

class Person {
    String name;
    int age;

    public Person() {
        // TODO Auto-generated constructor stub
    }

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
}                      
明天计划的事情:接着任务1和学习基础                          
遇到的问题:进度缓慢 诱惑很大                           
收获:学习了基础知识 反射的总结


返回列表 返回列表
评论

    分享到