包,修饰符,访问修饰符

  • 包(package)

    包提供了类的多层命名空间,可以解决类的命名冲突,类文件管理等问题;[类似于文件夹]

    访问其他包下的类(同一个包的类直接调用即可):

// 默认方法(冲突情况下只能用这种方式)
com.study.part1.Bus bus = new com.study.part1.Bus();
// 1.包名.类名
import com.study.part1.Bus;
// 2.导入包
import com.study.part1.*;
  • 访问修饰符

    成员访问权限:private→default→protected→public

    类的访问权限:default→public

    1.成员访问级别

修饰符同一个类中同一个包中子类全局范围内
private
protected
public
// 局部变量和成员变量
public class Test {
    public static void main(String[] args) {
        int i = 1;
        Other other = new Other();
        System.out.println(other.j);
        System.out.println(j);// 报错,对象的成员变量的调用错误示范;
        System.out.println(other.run().k);// 报错,方法的局部变量不能调用;
        // 方法的局部变量是随着方法的使用和结束产生和消除的,不能够调用;
        // 类的成员变量初始化的时候已经产生,可以直接调用;

}

class Other {
    void run(){
        int k = 1;
    }
    int j =1;
}

2.类的访问级别

default:包范围;

public:全局范围;

  • 初始化块本质上就是一块初始化的代码)

    初始化块是对构造方法的补充,可用于处理那些与参数无关的、固定的初始化逻辑;

    执行顺序:

    1.初始化块总是在构造方法之前执行;

    2.多个初始化块之间按书写顺序执行;

    3.初始化块与成员变量的初始化,按照代码书写顺序执行;

public class Driver{
  private long no;
  private String name;
  private int age = 18;
  
  // 初始化块,不需要外界的输入
  no = System.currentTimeMillist();
    
  public Driver(String name, int age){
    this.name = name;
    this.age = age;
  }
  
  public long setNo(){
  }
    return this.no  
  public long getNo(){
  }
    this.no = no;
  
  public int getAge(){
    return this.age;
  }
  public int setAge(int age){
    this.age = age;
  }
  // 构造方法和set,get保证了私有成员变量的封装,不能够用Diver.age直接访问,对于age或者no进行
  // 修改或者访问必须用封装好的方法set,get,这是JVM默认的规则,在编写代码的时候可以直接用
  // generator生成构造器和访问修改方法;
]
  • static关键字关键区别:生命周期、调用方式

    static修饰的成员是类的成员,该成员属于类,不属于单个对象;

    个人理解:在类初始化的时候静态变量就会存储在静态存储区,与之相关的方法在调用和退出后,该静态变量仍然是保存在静态存储区的,不会随着方法的结束而结束;静态变量的值是可变的,只有final修饰的常量的值是不可变的,只是静态变量不会在每个对象的初始化时也同时进行新的初始化;

    • 修饰:

      1.java类中可包含成员变量,方法,构造方法,初始化块,内部类;

      2.其中,static可以修饰的是成员变量,方法,初始化块,内部类(仅不能修饰构造方法);

    • 类变量

      1.以static修饰的成员变量叫类变量(静态变量);

      2.类变量属于类,它随类的信息存储在方法区(1份),并不随对象存储在堆中;

      3.类变量可以通过类名来访问,也可以通过对象名来访问,建议通过类名来访问它

    • 类方法

      和类变量一样;静态方法不能够被重写,最好用类来调用;

    • 静态块

      静态块属于类,在类加载的时候被隐式调用一次,之后再也不会被调用;

static{}
  • 静态块,初始化块,构造方法对比

    • 初始化块:构造方法

      **相同:**都是给对象进行初始化;

      **区别:**1.初始化块给所有对象进行统一初始化,构造方法只给对应对象初始化;

      应用:将所有构造方法所具有共性的东西定义在初始化块中;(先初始,再构造,初始化块中的成员是所有对象中都包含的)

    • 初始化块(非静态初始化块:静态初始化块(静态块))

      1.构造代码块用于初始化对象,每创建一个对象就会被执行一次;静态代码块用于初始化类,随着类的加载而执行,不管创建几个对象,都只执行一次。

      2.静态代码块优先于构造代码块的执行

    • 执行顺序:(静态块必在最前)

      • 父类的静态初始化块

      • 子类的静态初始化块

      • 父类的初始化块

      • 父类的构造函数

      • 子类的初始化块

      • 子类的构造函数

  • final关键字

    final关键字可用于修饰类、方法、变量

    • final关键字修饰类

      final关键字修饰的类不能被继承

public final class Father{
}

public class Son extends Father{
}
// 报错不能够继承final类;
  • final关键字修饰的方法

    final关键字修饰的方法不能被重写

public class Father{
  public final void call{
    System.out.println("I am F");
  }
}

public class Son extends Father{
  @override
  public void call{
    System.out.println("I am Son");
  }
}
// final方法不可以被子类重写;
  • final关键字修饰的变量

    final关键字修饰的变量一经赋值,不可更改;

    • final修饰成员变量
// 类的成员变量final;
public class Demo{
  public static int a = 1;
  public static final b = 2;
  
  static{
    b = 3;// 报错,final常量不可再修改;
    a = 3;// 不会报错;
  }
}
// 对象实例的成员变量final;
public class Demo{
  public int a = 1;
  public final int b = 2;
  public final int c;
  
  c = 2;
  public Demo(){
    b =2;// 报错,final常量不可再修改;
  }
  
}
- **final修饰局部变量**
public class Demo{
  public static void main(String[] args){
  
    final int i = 1;
    i = 2;// 报错,局部常量也不可以进行修改;
  }
}
- **final修饰引用类型变量**

  1.引用类型变量,保存的仅仅是一个引用(地址);

  2.final只保证这个引用类型变量所引用的地址不会改变,但这个对象的内容可以发生改变。
public class Test{

  public static void main(String[] args) {
    // 修改引用类型变量的数据√
    final int[] i = {1, 2, 3, 4, 5, 6};
    i[1] = 6;// 这是可以进行修改的;
    
    Arrays.sort(i);// 对数组进行排序也是可以的
    
    // 直接修改地址是不行的;
    i = null;
    i = new int[] {2, 3, 4, 5, 6};
    // 以上都是不行的,i只能够指向固定的内存地址
  }
}

  • final变量的宏替换原则

    满足下述三个条件的变量相当于直接量:

    1.使用final关键字修饰;

    2.在声明变量的时候指定了初始值;

    3.该初始值可以在编译时被确定下来;

    编译时,编译器会把程序中所有用到该变量的地方直接替换成它的值;

final int i = 10;
final double d =3.14 * 5;
final String s = "Hello"
// 如下:d*3 = 3.14*5*3,直接进行替换;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值