美文网首页
java 基础

java 基础

作者: 北海北_6dc3 | 来源:发表于2020-02-13 10:45 被阅读0次

    JAVA 字符串

    参考资料:
    一张图让你明白 java string 的 内存分配
    java 字符串内存分配的分析与总结
    常量池,堆,栈

      String s3 = new String("i love china");
    

    如上代码,建立了几个对象?
    两个

    • 一个是i love china对象,放入常量池中(然后在把这个对象作为参数,传递进去)
    • 构造函数创建new String对象。
    • 然后在栈中变量s3存放了一个指针,指向new String对象
        public String(String original) {
            this.value = original.value;
            this.hash = original.hash;
        }
    

    验证:

            String t1 = "abc";
            String t = new String("abc");
            String t2=t.intern();
    
    
            System.out.println(t1== t); //result = false
            System.out.println(t1== t2); //result = true
    

    java参数的传递

    值传递
    参考资料:https://www.cnblogs.com/9513-/p/8484071.html

    父子类多态

    public class Fu {
        public int num = 100;
    
        public void show() {
            System.out.println("show Fu");
            System.out.println(this.num);
        }
    
        public static void function() {
            System.out.println("function Fu");
        }
    }
    
    class Zi extends Fu {
        public int num = 1000;
        public int num2 = 200;
    
        @Override
        public void show() {
            System.out.println("show Zi");
            System.out.println(this.num);
        }
    
        public void method() {
            System.out.println("method zi");
        }
    
        public static void function() {
            System.out.println("function Zi");
        }
    }
    
    class DuoTaiDemo {
        public static void main(String[] args) {
            //要有父类引用指向子类对象。
            //父 f =  new 子();
            Fu f = new Zi();
            System.out.println(f.num);  //输出为父类变量100
            //报错,找不到
            //System.out.println(f.num2);
    
            f.show();  //输出为子类方法及变量
             //报错,找不到
            //f.method();
           // f.function();
        }
    }
    

    匿名类

    https://www.cnblogs.com/chenssy/p/3390871.html
    在使用匿名内部类的过程中,我们需要注意如下几点:

    1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
    2、匿名内部类中是不能定义构造函数的。
    3、匿名内部类中不能存在任何的静态成员变量和静态方法。
    4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
    5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

    public class Test1 {
        public void test(Product p) {
            System.out.println("购买了一个" + p.getName() + ",花掉了" + p.getPrice());
        }
    
        public void test1(Device d)
        {
            System.out.println("方法1,购买了一个"+d.getName()+",花掉了"+d.getPrice());
        }
    
        public static void main(String[] args) {
            Test1 tt = new Test1();
    
            String testFinalVal="haha";
            //jdk1.8默认增加语法糖,后续如果未改变,则增加final标志,否则报错
            int a=10;
    
            //此处调用test方法时,需要传入一个Productt参数
            //此处传入其匿名实现类的实例,不带构造函数
            tt.test(new Product() {
                @Override
                public double getPrice() {
                    System.out.println(testFinalVal);
                    //Error:(30, 36) java: 从内部类引用的本地变量必须是最终变量或实际上的最终变量
                   //System.out.println(a);
                    return 567.8;
                }
    
                @Override
                public String getName() {
                    return "AGP显卡";
                }
            });
    
            //带有构造函数
            tt.test1(new Device("电子示波器"){
                @Override
                public double getPrice()
                {
                    return 67.8;
                }
            });
            a=11;
        }
    }
    
    interface Product {
        double getPrice();
        String getName();
    }
    
    abstract class Device
    {
        private String name;
        public abstract double getPrice();
        public Device(){}
        public Device(String name)
        {
            this.name=name;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    

    上面例子中,演示了从接口、抽象类实现匿名类的过程。匿名内引入外部变量,需要设置为final,原理上就是闭包问题,java将外部自由变量通过构造函数,传递进去了,里面改变,外部不会改变,但是如果不为final。从里面改变了,外部看着效果就不对了

    一个依赖于外部环境自由变量的函数
    这个函数能够访问外部环境里的自由变量

    自动拆装箱

    public class TestInterger {
        public static void main(String[] args) {
            test();
        }
    
        public static void test() {
            int i = 40;
            int i0 = 40;
            Integer i1 = 40;
            Integer i2 = 40;
            Integer i3 = 0;
            Integer i4 = new Integer(40);
            Integer i5 = new Integer(40);
            Integer i6 = new Integer(0);
            Double d1=1.0;
            Double d2=1.0;
    
            System.out.println("i=i0\t" + (i == i0));  //  true
            System.out.println("i1=i2\t" + (i1 == i2));//  true
            System.out.println("i1=i2+i3\t" + (i1 == i2 + i3));//  true
            System.out.println("i4=i5\t" + (i4 == i5));//  false
            System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));//  true
            System.out.println("d1=d2\t" + (d1==d2));//  false
    
            System.out.println();
        }
    }
    

    参考资料:
    https://www.jianshu.com/p/0ce2279c5691

    Arrays.asList 坑

    参考资料:
    https://blog.csdn.net/xlgen157387/article/details/91376347

    • 平时的list我们是 java.util.ArrayList。
    • Arrays.asList转化出来的类是 java.util.Arrays.ArrayList,因为它没有重写add,remove方法,所以一旦初始化元素后,集合的size就是不可变的。
    • Arrays.ArrayList将外部数组的引用直接通过“=”赋予内部的泛型数组,所以本质指向同一个数组。
            ArrayList(E[] array) {
                a = Objects.requireNonNull(array);
            }
    

    1、不可使用基础类型

    由于Arrays.ArrayList参数为可变长泛型,而基本类型是无法泛型化的,所以它把int[] arr数组当成了一个泛型对象,所以集合中最终只有一个元素arr。

    相关文章

      网友评论

          本文标题:java 基础

          本文链接:https://www.haomeiwen.com/subject/hawjactx.html