java 基础

2020-02-13  本文已影响0人  北海北_6dc3

JAVA 字符串

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

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

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

    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

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }

1、不可使用基础类型

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

上一篇 下一篇

猜你喜欢

热点阅读