在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限,
public:公共的protected:受保护的(空的):默认的private:私有的
不同权限的访问能力
可见,public具有最大权限。private则是最小权限。
编写代码时,如果没有特殊的考虑,建议这样使用权限:
成员变量使用private,隐藏细节。构造方法使用 public ,方便创建对象。成员方法使用public,方便调用方法 代码块
在java中用{ }括起来的称为代码块,代码块可分为以下四种:构造代码块丶静态代码块丶局部代码块丶同步代码块。
构造代码块
格式:直接在类中定义且没有加static关键字的代码块称为构造代码块位置: 类中,方法外执行: 每次执行构造方法之前都会执行一次。如果存在多个构造代码块,执行顺序由他们在代码中出现的次序决定,先出现先执行。使用场景: 例如统计对象的个数 也就是每次执行构造方法之前要执行的代码就可以放在构造代码块中
代码示例
public class Test {
{
System.out.println("我是构造代码块");
System.out.println("我会在创建对象时被调用,每次创建时都会被调用");
System.out.println("优先于类构造函数执行");
}
}
静态代码块
格式:直接在类中定义且加static关键字的代码块称为静态代码块位置:类中,方法外执行:当类被加载的时候执行,并只执行一次。静态代码块先于主方法执行。如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。使用场景: 例如加载驱动,这种只需要执行一次的代码就可以放在静态代码块中 注意事项:静态代码块不能存在于任何方法体内。静态代码块不能直接访问实例变量和实例方法,需要通过类的实例对象来访问。
代码示例
public class Test {
static {
System.out.println("我是静态代码块");
System.out.println("我会在类被加载的时候执行,并只执行一次");
System.out.println("我优先于构造代码块执行");
}
}
静态代码块和构造代码块的异同
相同点:都是JVM加载类后且在构造函数执行之前执行,在类中可定义多个,一般在代码块中对一些static变量进行赋值。不同点:静态代码块在非静态代码块之前执行。静态代码块只在第一次new时执行一次,之后不在执行。而非静态代码块每new一次就执行一次。
局部代码块
位置:方法体内定义的代码块称为局部代码块执行:调用方法,执行到局部代码块的时候就执行。局部代码块和一般语句的执行顺序由他们在代码中出现的次序决定,先出现先执行。使用场景:节省内存空间,没有多大的意义
代码示例
public class Test {
public static void main(String[] args) {
{
int num = 10;
System.out.println("局部代码块");
// 把局部代码块中的变量占用的空间会释放
}
// System.out.println(num);找不到符号
}
}
同步代码块:
使用synchronize(){ }包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数的不一致性。同步代码块需要写在方法中。后面的课程在细说 native关键字
native:本地的,原生的。用法:
只能修饰方法, native 修饰的方法称为本地方法。这种方法是没有方法体的,我们查看不了它的实现,所以大家不需要关心该方法如何实现的表示这个方法的方法体代码不是用Java语言实现的,而是由C/C++语言编写的。但是对于Java程序员来说,可以当做Java的方法一样去正常调用它,或者子类重写它。
Object类源码(部分):
package java.lang;
public class Object {
//本地方法
private static native void registerNatives();
//静态代码块
static {
registerNatives();
}
......
......
}
包装类
概述:Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:
下面我们以Integer类为例,简单学习一下包装类的。Integer类就是包装一个对象中的原始类型 int 的值。常用方法有
代码示例
// int--->Integer
Integer i1 = new Integer(10);// i1对象表示的整数就是10
Integer i2 = Integer.valueOf(10);// i2对象表示的整数就是10
// String--->Integer
Integer i3 = new Integer("100");// i3对象表示的整数就是100
Integer i4 = Integer.valueOf("100");// i4对象表示的整数就是100
// Integer--->int
int num1 = i1.intValue();
int num2 = i2.intValue();
int num3 = i3.intValue();
int num4 = i4.intValue();
装箱与拆箱的概述
基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:
装箱:从基本类型转换为对应的包装类对象。拆箱:从包装类对象转换为对应的基本类型。
自动装箱与自动拆箱
由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。例如:
// 自动装箱
Integer i = 10;
// 自动拆箱
int num = i;
基本类型与字符串之间的转换
基本类型转换为String
方式一:直接在数字后加一个空字符串方式二:通过String类静态方法valueOf()
//int --- String
int number = 100;
//方式1
String s1 = number + "";
//方式2
//public static String valueOf(int i)
String s2 = String.valueOf(number);
String转换成基本类型
方式一:除了Character类之外,其他所有包装类都具有parseXxx静态方法可以将字符串参数转换为对应的基本类型。例如:
public static int parseInt(String s):将字符串参数转换为对应的int基本类型。public static long parseLong(String s):将字符串参数转换为对应的long基本类型。....
// 基本类型--->字符串:
String str1 = 100 + "";// str1字符串的内容:"100"
String str2 = String.valueOf(100);// str2字符串的内容: "100"
// 字符串--->基本类型:
int num1 = Integer.parseInt(str1);
int num2 = Integer.parseInt(str2);
System.out.println(num1+num2);// 200
注意:如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出java.lang.NumberFormatException异常。
方式二:字符串转为包装类,然后可以自动拆箱为基本数据类型
public static Integer valueOf(String s):将字符串参数转换为对应的Integer包装类,然后可以自动拆箱为int基本类型
包装类对象的缓存问题
代码示例
Integer i = 1;
Integer j = 1;
System.out.println(i == j);//true
Integer a = 128;
Integer b = 128;
System.out.println(a == b);//false
又例如:
Double d1 = 1.0; Double d2 = 1.0; System.out.println(d1==d2);//false 比较地址,没有缓存对象,每一个都是新new的



