美文网首页
java 编程的逻辑 读书笔记

java 编程的逻辑 读书笔记

作者: 快感的感知 | 来源:发表于2021-01-23 16:37 被阅读0次

1.编程基础

所谓的程序,基本上就是告诉计算机要操作的数据和执行的指令序列,即对什么数据做什么操作,比如:
1.读文档,就是将数据从磁盘加载到内存,然后输出到显示器上;
2.写文档,就是将数据从内存写回磁盘;
3.播放音乐,就是将音乐的数据加载到内存,然后写到声卡上;
4.聊天,就是从键盘接收聊天数据,放到内存,然后传给网卡,通过网络传给另一个人的网卡,再从网卡传到内存,显示在显示器上。
5.总结:基本上程序很大一部分工作就是操作内存中的数据

1.1 Java 数据类型和变量

  • 整数类型:有4种整型byte/short/int/long,分别有不同的取值范围;

  • 小数类型:有2种类型float/double,有不同的取值范围和精度;

  • 字符类型:char,表示单个字符;

  • 真假类型:boolean,表示真假。
    Java是面相对象的语言,除了基本数据类型,其他都是对象类型(对象基本由基本数据类型,数组合其他对象结合而成)。

  • 变量概念:为了操作数据,需要把数据放在内存中,为了方便找到和操作数据需要给这个位置起个名字。

  • 变量 :表示内存中的一个位置,存放的值可以变,但含义不变
    数组类型和基本类型的明显不同:

  • 一个基本类型变量,内存中只会有一块对应的内存空间。

  • 数组有两块:一块用于存储数组内容本身,另一块存储内容的位置。
    给数组中元素赋值是改变数组内容,给数组变量赋值则会让变量指向一个不同的位置。

1.2 基本运算

  • 整数相除不是四舍五入,而是直接舍去小数。
    比如:10/4=2而不是2.5 10/4.0=2.5 因为要按小数计算至少一个数表示为小数形式。

1.3 函数

作用:计算机程序的一种重要结构,可减少重复代码,分解复杂操作

1.3.1 栈

函数调用主要是通过栈来存储相关的数据,栈是一块内存,先进先出类似桶,主要存放函数调用过程中需要的数据,包括参数,返回地址,以及函数内定义的局部变量,

1.4 理解数据背后的二进制

image
十进制 二进制 互转

29=2 x 10^1 + 9 x 10^0


image image
  • -1的补码:1的原码表示是00000001,取反是11111110,然后再加1,就是11111111

  • 负数的二进制:不是简单的将最高位变为1,比如:a = -1;二进制应该是10000001,但实际,他应该是11111111. 因为负数使用的是补码表示法,因为计算机只能做加法,

  • 正数的运算结果出现负数:正数最大表示01111111,即127,负数最小10000000,而计算机只能做加法,1-1其实是1+(-1)
    127 01111111
    1 00000001
    +-------------------------
    -128 10000000
    看到上面就知道为啥会出现负数,因为超出范围最高位往往是1,然后会被看作负数。

  • 小数计算为什么会出错:因为使用二进制,二进制不能精确表示0.1

  • char:本质上是一个固定占用两个字节的无符号正整数,这个正整数对应于Unicode编号,用于表示那个Unicode编号对应的字符。

2.类

2.1重写(Override)与重载(Overload)

方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

class Animal{
   public void move(){
      System.out.println("动物可以移动");
   }
}
 
class Dog extends Animal{
   public void move(){
      System.out.println("狗可以跑和走");
   }
}

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

public class Overloading {
    public int test(){
        System.out.println("test1");
        return 1;
    }
 
    public void test(int a){
        System.out.println("test2");
    }   
 
    //以下两个参数类型顺序不同
    public String test(int a,String s){
        System.out.println("test3");
        return "returntest3";
    }   
 
    public String test(String s,int a){
        System.out.println("test4");
        return "returntest4";
    }  
}
2.2 类加载过程

在Java中,所谓类的加载是指将类的相关信息加载到内存。在Java中,类是动态加载的,当第一次使用这个类的时候才会加载,加载一个类时,会查看其父类是否已加载,如果没有,则会加载其父类。

寻找要执行的实例方法的时候,是从对象的实际类型信息开始查找的,找不到的时候,再查找父类类型信息。

2.2.1 内存分为栈和堆,方法区

1.堆内存用来存放由new创建的对象和数组。
2.栈内存用来存放方法或者局部变量等
3.堆是先进先出,后进后出
4.栈是后进先出,先进后出
5.存放类的信息

2.2.2 Java继承是把双刃剑

子类和父类之间可能存在实现细节的依赖,如果子类不知道把基类的实现细节,就不能正确的进行扩展。

2.2.3 怎么避免继承,有三种方法:

使用final关键字
优先使用组合而非继承
使用接口

2.2.4使用final避免继承

我们提到过final类和final方法,final方法不能被重写,final类不能被继承,我们没有解释为什么需要它们。通过上面的介绍,我们就应该能够理解其中的一些原因了。

给方法加final修饰符,父类就保留了随意修改这个方法内部实现的自由,使用这个方法的程序也可以确保其行为是符合父类声明的。

给类加final修饰符,父类就保留了随意修改这个类实现的自由,使用者也可以放心的使用它,而不用担心一个父类引用的变量,实际指向的却是一个完全不符合预期行为的子类对象。

2.2.5 优先使用组合而非继承
public class Child {
    private Base base;
    private long sum;

    public Child(){
        base = new Base();
    }
    
    public void add(int number) {
        base.add(number);
        sum+=number;
    }

    public void addAll(int[] numbers) {
        base.addAll(numbers);
        for(int i=0;i<numbers.length;i++){
            sum+=numbers[i];
        }
    }
    
    public long getSum() {
        return sum;
    }
}
2.2.6 接口和抽象类
  • 接口更重要的是降低了耦合,提高灵活性,分解复杂问题
  • 抽象类的设计目的,是代码复用。也是一种减少犯错的机制

相关文章

网友评论

      本文标题:java 编程的逻辑 读书笔记

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