on java 8学习笔记

2022.2.15

第三章

  1. new 关键字创建出来的对象位于堆中,而基本数据类型则会被创建在栈中

  2. {
    int x = 12;
        {
         int x = 96; // 语法错误
        }
    }
    

    这种写法在java中是错的,但在c++里是允许的

  3. 字段(有时叫作“数据成员”)和方法(有时叫作“成员函数”)

  4. 如果变量作为类成员而没被初始化过就会被java默认初始化,但是如果变量是类的方法中的,那么就不会被默认初始化

  5. public class test {
        public double f(){
            return 1.0;
        }
        public static void main(String[] args){
            int x= (int) new test().f();
        }
    }
    

    进行强转就不会报错了

  6. 有关于improt,我想看书的应该没几个是正常用记事本写java的把,应该都是用的ide吧,我试着用记事本的import写法发现不太行,然后我找到了这篇文章https://blog.csdn.net/weixin_40268421/article/details/111593086

  7. 为什么要有static

    第一种情况是,有时候我们需要一小块共享空间来保存某个特定的字段,而并不关心创建多少个对象,甚至有没有创建对象。第二种情况是,你需要使用一个类的某个方法,而该方法和具体的对象无关;换句话说,你希望即便没有生成任何该类的对象,依然可以调用其方法。

  8. 由于所有的 Java 代码文件都默认导入了java.lang,所以列表中的类我们都可以直接调用。

  9. main()的参数是一个String对象的数组,虽然目前我们并不会使用args参数,但 Java 编译器会强制你传递该参数,因为它用于获取控制台的输入。

第四章 操作符

  1. 牢记一点吧,都是引用,而在java中引用实际上就是值

  2. 出于效率原因,Integer会通过享元模式来缓存范围在-128~127内的对象,因此多次调用Integer.valueOf(127)生成的其实是同一个对象。而在此范围之外的值则不会这样,比如每次调用Integer.valueOf(128)返回的都是不同的对象。因此需要特别注意,在进行==!=的比较时,范围不同的值生成对象的方式并不一样,这会影响到比较的行为,从而产生不同的结果。另外,通过new Interger()生成的对象都是新创建的,无论其值处于什么范围。所以通过不同方式创建的Integer对象,也会影响到比较的结果。——译者注

  3. 在Java 9及更新版本中已经弃用new Integer(),因为它的效率远远低于Integer.valueOf()

  4. .equal()的默认方法是只比较对象的引用,所以.equal()方法最好自己重写一下

  5. 在Java中,把int类型当作boolean类型并不合法

  6. 基本浮点型转化位整型,小数点后无论多大都不会被四舍五入,除非round方法

  7. 基本数据类型在java算术中依旧存在溢出风险且不会报错

  8. 注意Java不允许将数字当作布尔值使用,虽然这在C和C++里是允许的

第五章 控制流

  1. for循环的步进部分都是出了循环然后步进再进行布尔表达式判定

  2. java 类名 字符串1 
    

    字符串1就是main中的参数

  3. 关于0.0-1.0开区间闭区间那个,按作者的意思,因为可能性太小,所以不一定会出来0.0,即便它包括了0.0.

第六章 初始化和清理

  1. 之所以使用构造器方法这种形式创建和初始化对象,是为了避免对象的创建和初始化分离开导致的错误

  2. 方法重载中基本数据类型的所占字节数如果小于了重载方法中占最小字节数的基本数据类型,则被传入的基本数据类型会被转化为这个重载方法中占最小字节数的类型,比如传入的是int,最小最小字节数为long ,则会被转化为long类型;如果传入的数据类型比重载方法的参数类型更大,那么必须强制转化成小的,不然报错

  3. 你可能会想:“为什么只通过参数列表来区分重载方法?为什么不根据方法的返回值来区分?”比如下面定义的两个方法虽然具有相同的名字和参数,但很容易就能通过返回值区分开来:

    void f() {}
    int f() { return 1; }
    

    只有编译器能从上下文中明确地判断出语句的含义,这种方式才是可行的。比如在int x = f()中,x的类型能够告诉编译器,我们想要调用哪个版本的f(),但还可以调用f()并忽略它的返回值。这被称为调用方法的副作用,此时我们不关心返回值,而只是想要方法调用的其他效果。因此,如果这样调用方法:

    我想从另一个角度说一下吧,因为这本身就存在歧义,因为java中方法其实就是c语言中的函数,那么你见过哪个函数一个x值可以对应两种不同的y值还有行为的,这又不是赌命

    f();
    

    此时Java如何确定应该调用哪个f()?阅读代码的人又该如何理解它呢?由于存在这些问题,我们不能使用返回值类型来区分重载方法。

  4. this关键字只能在非静态方法中使用。

    其实感觉吧构造器除外

  5. this的使用

    1. this可以让你得到当前对象的引用

    2. 尽量在本类调用方法时不用this.方法名()

    3. return this 在方法中可以实现同一个对象不断使用一个方法,例如

      person.方法名().方法名().方法名()
      
    4. 将自身引用传给外部类或者方法

    1. 编译器禁止在非构造器的普通方法里调用构造器。
    2. 不能同时调用两个构造器
    3. 构造器调用必须出现在方法的最开始部分,否则编译器会报错。

    这里第三点指的应该时构造器方法

  6. 静态方法也可以创建自己的对象

    public class test {
    
        public static void f(){
            class  a {
                public a(){
                    System.out.println("hello");
                }
            }
            new a();
        }
    
        public static void main(String[] args){
            test.f();
        }
    }
    
  7. public class test {
        int i =1;
        public test(int i){
            i=i;
            System.out.println(i);
        }
        public static void main(String[] args){
            new test(5);
    
        }
    }
    

    这么做是合法的

其他

  1. 有关于内存泄漏的概念https://zh.wikipedia.org/wiki/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F

    简单来说就是已经不用的内存没有还给系统

  2. 有关于析构函数,虽然我还没看https://docs.microsoft.com/zh-cn/cpp/cpp/destructors-cpp?view=msvc-170

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cjz-lxg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值