Java日常-知识点补充1

192 阅读5分钟

一、数组

将数组友好输出

import java.util.Arrays;

public class DemoPrintArrays{
    public static void main(String[] args){
        int[] a = new int[]{10, 20, 30};        
        System.out.println(Arrays.toString(a));
    }
}

其中体现了面向对象的编程思想:找到JDK提供的Arrays类,该类中提供了将数组转换为指定格式字符串的toString()方法

二、局部变量与成员变量

  1. 定义位置不同
  2. 作用范围不同
  3. 默认值不一样,如
public class DemoParam{
   //成员变量
   String name;
   public void methodA(){ 
       System.out.println(name); //输出null
   }
   public void methodB(){
       //局部变量
       int age;
       System.out.println(age); //报错,age不会自动赋默认值
   }
   
   //方法的参数属于局部变量
   public void methodC(int param){
       //因为方法的参数在调用方法的时候,必然会被赋值的
       System.out.println(param);  //不会报错
   }
}
  1. 内存位置不一样

局部变量:位于栈内存 成员变量:位于堆内存

  1. 生命周期不一样

局部变量:随着方法进栈而诞生,随着方法出栈而消失 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失

  1. 当方法的局部变量和类的成员变量重名时,根据**“就近原则”,优先使用局部变量**

三、封装性

  1. 成员方法属于封装
  2. private修饰成员属性,提供getXxx()setXxx()方法属于封装

四、private修饰布尔属性的getXxx()方法

  1. private修饰的布尔属性值的getXxx()方法为isXxx()
private boolean male;
public void setMale(boolean male){
    this.male = male;
}

public boolean isMale(){
    return male;
}

五、赋值问题

  1. = 赋值符号,如果右侧是引用类型,则是将对象地址赋值给左侧
  2. set() 函数,如果右侧是引用类型,同样是将对象地址赋值给左侧

以上两种情况,如果右侧对象发生改变,则左侧对象同样发生改变

  1. ListaddAll()方法,是直接调用右侧对象中的元素

此种情况,如果右侧对象再次发生改变,左侧对象元素不会改变

六、关于相等判断

一)、==

1. 基本数据类型:

比较两个变量是否相等

2. 引用数据类型:

1). String

比较两个变量物理地址是否相等

注意:
a. 用" "创建的字符串,只要顺序、大小写一致,均视为同一个对象,即共用同一个地址。
b. 用substring()等方法处理后的字符串,地址都会改变
c.直接打印对象显示的是hashCode(模拟地址),即使hashCode相等,并不代表物理地址相同

2). 其他引用类型

比较两个变量物理地址是否相等,hashCode()方法返回的不是物理地址

二)、equals()

1. 基本数据类型

比较两个变量是否相等

注意:
只有基本数据类型的封装类才有此方法

2. 引用数据类型

1). String

比较两个变量是否相等

注意:
String类重写了equals()方法,用于比较两个变量是否相等

2). 其他引用类型

比较两个变量物理地址是否相等,hashCode()方法返回的不是物理地址

七、IDEA项目结构

Project包含Module

Module包含package

八、ArrayList

  1. ArrayList<E>其中的代表泛型

注意: 泛型只能是引用类型,不能是基本类型,但可以是其封装类

  1. 对于ArrayList集合来说,直接打印得到的不是地址值,而是内容,如果内容为空,得到的是空的中括号:[]

注意:直接打印数组得到的是地址值

九、静态代码块

1. 特点:

  1. 当第一次用到含静态代码块的类时,静态代码块执行唯一一次
  2. 静态代码块比构造方法先执行

2. 典型用途:

用来一次性对静态成员变量进行赋值

3. 代码:

public class Student{
    static{
        System.out.println("静态代码块执行了!);
    }
    public Student(){
        System.out.println("构造方法执行了!");
    }
}

public class DemoStatic{
    public static void main(String[] args){
        Student stu1 = new Student();
        Student stu2 = new Student();
    }
}

执行结果:

静态代码块执行了!
构造方法执行了!
构造方法执行了!

十、 接口

1. 如果是java7,接口中可定义:

1). 常量
2). 抽象方法

2.如果是java8,接口中可定义:

3). 默认方法
4). 静态方法

3.如果是java9,接口中可定义:

5).私有方法

1. 默认方法

默认方法可以有方法体:当接口升级时,如果没有默认方法这一功能,需要为每一个实现类重写接口方法,因此默认方法出现了,只需在接口中实现一次,其所有实现类都可以实现默认方法。

  1. 接口的默认方法,可以通过接口实现类对象,直接调用,那么一个实现类同时实现多个接口,如果这些接口中的默认方法冲突,可以通过实现类覆盖接口默认方法解决
  2. 接口的默认方法, 也可以被接口实现类进行覆盖重写

2. 静态方法

java8开始,接口当中允许定义静态方法

格式: 就是将abstract或者default替换成static,且有方法体 注意:
1. 不能通过接口实现类的对象来调用接口中的静态方法,因为实现的多个接口的静态方法,可能会产生冲突

2.通过接口名称,直接调用其中的静态方法

3. 私有方法

问题描述:
我们需要抽取一个共有方法,用来解决两个默认方法之间重复代码问题,但这个共有方法不应该让实现类使用,应该是私有化的。
解决方案: java9开始,接口当中允许定义私有方法。 包含:1. 普通私有方法:解决多个默认方法之间重复代码问题2. 静态私有方法:解决多个静态方法之间重复代码问题

4. 成员变量

接口当中也可以定义“成员变量”,但是必须是public static final从效果上看,这其实就是接口的【常量】
public:公有

static:与对象无关

final:不可变

注意事项:

  1. 接口当中的常量,可以省略public static final,不写也是此种修饰符
  2. 接口当中的常量必须进行赋值

5.优先级问题

当一个类如果直接父类当中的方法,和接口当中的默认方法产生冲突,优先使用父类的方法