java基础琐碎知识点

1、java变量类型

类变量(静态变量):在类中使用static关键字声明,在构造方法,方法,语句块以外。无论一个类创建了多少对象,类只拥有类变量的copy。静态变量在程序开始的时候创建,在程序结束的时候销毁。只能被静态的方法调用。与实例变量类似,有默认的初始值。可以通过ClassName.ValueName直接调用。

实例变量:声明在构造方法,方法,或者语句块以外。实例变量在对象被创建的时候创建,在对象被销毁的时候销毁。实例变量至少被一个构造方法,方法或语句块引用。使得外部能够通过这些方式获得实例变量的值。实例变量可以声明在引用前,也可以声明在引用后。实例变量是有默认值的,数值类型默认为0,布尔类型默认为false,引用类型默认为null。实例变量可以使用访问修饰符修饰。

局部变量:声明在构造方法,方法语句块中的变量。在方法或者语句块执行的时候创建,在执行完后会被销毁。访问修饰符不能用来修饰局部变量,他们被创建在栈中。没有默认值,所以一定初始化才能使用。

静态变量属于类,该类不生成对象就可以通过类名调用 静态变量。只要程序加载了类的字节码就好被分配空间

实例变量属于该类的对象,只有生成对象才能调用实例变量。必须创建了对象,才给分配空间

静态方法只用调用静态变量。非静态方法既能调用静态变量又能调用实例变量。

类的静态数据成员被所有创建的对象共享,任何对象访问静态变量使用的都是同一个数据,同一块内存的。无论哪个对象修改了静态变量,对其他的对象来说,这个静态变量已经变了。

2、java中的修饰符

1)访问修饰符

默认访问修饰符:可以用来修饰类,接口,方法,变量。默认的类,只能被本包中的其他类访问到。默认的接口中的方法为public访问类型,接口中的变量为public static final。

私有访问修饰符——private:只能用来修饰变量,方法,构造方法。使用private修饰的只能被所属类访问。private不能修饰外部类和接口。这个变量用来保护不想被外部访问到的变量和方法。可以通过提供的get,set方法来操作修改private修饰的变量。

公有访问修饰符——public:可以修饰类,变量,构造方法,方法

受保护的访问修饰符——protected:不能用来修饰外部类,和接口。能修饰内部类,变量,和方法。修饰的内部类,变量和方法能够被本包中的其他类调用。

protected修饰的内部类,方法,变量只能被本包中的其他类调用,内被继承该类的子类调用。

一个类中有方法被protected修饰,暂时把该类称为基类。跟基类在同一个包中的类无论是不是该基类的子类,都能通过基类的实例化或者基类子类的实例化对象访问到被protected修饰的方法。与基类不在同一个包中的基类的子类只能通过super关键字或者本子类的实例化访问到protected修饰的方法。与基类不在同一个包中也不是改基类的子类,是没有任何办法调用到在基类中被protected修饰的方法的。

在父类中被声明为protected的方法,在子类中可以被生命为public或者protected,不能声明为:private

2)非访问修饰符

延伸知识点:构造函数的作用是创建对象以及对象的初始化。构造函数在类的对象创建的时候就运行,普通的方法对象调用的时候才执行,构造函数只执行一次,普通的方法执行的次数取决于对象的调用。

子类继承父类的时候,子类对象初始化的时候,父类的构造函数也需要执行。因为子类需要使用父类的属性显示或隐式的调用父类的构造方法。子类总至少有一个构造函数以super()开头,可以是隐式的;至少有一个子类的构造函数开头不是this();。子类构造函数可以调用本类的构造函数,间接调用父类的构造函数。

this();或者super();都是在jvm虚拟机上构造出一个指定类型的对象。在一个构造函数内调用两个别的构造函数表示创建了两个对象,所以规定this();或者super();都需要放在构造函数的第一行。

在构造函数调用本类中别的构造函数时,this();或者super();都需要放在构造函数的第一行,所以一个构造函数内只能调用一个另外的构造函数。

this关键字:this();表示当前类的构造函数,这个方法只能放到构造方法的第一行,保证执行任何动作之前,对象已经初始化,构造函数只能被构造函数调用,保证对象只是初始化一次。

在普通方法中不用使用this();因为避免对本对象操作时,对象本身还未构建成功。如果在普通方法中想要调用构造方法,可以使用new一个对象的方法。

当成员变量与局部变量重名时,在方法中使用this时,表示的是该方法所在类的成员变量(this表示当前对象自己)。当不使用this时以局部变量为准

把自己当做参数传递时,也可以使用this(this当做当前参数进行传递)

遇到内部类或者匿名类,在内部类或匿名类中使用this表示的是该内部类或匿名类本身。如果想要调用外部类的方法或者变量可以:外部类名.方法名(静态方法),外部类名.this.方法名(普通方法)

static 修饰符:static方法就是没有this的。this表示的是对象,static变量或者方法是在类被加载的时候就被加载了,在对象创建前加载的。如果this放在static方法中编译器会去找this代表的对象,但是没有创建对象,找不到所以报错。

static 修饰的表示类变量或者类方法,所以局部变量不能使用static修饰。

在静态方法中不能访问非静态变量,因为非静态的变量是属于对象的,静态方法是在创建对象之前存在的。

final修饰符:final修饰的变量只能被赋值一次,重复赋值会报错。final修饰的对象不能修改的,但是对象中的变量的值是可以修改的。被final修饰的方法能被子类继承,但是不能被子类修改。被final修饰的类不能被继承。

abstract修饰符:使用abstract修饰的类是抽象类,该类不能实例化对象,不能使用final和abstract同时修饰一个类,因为被final修饰的类不能被继承,而抽象类只有被继承才能实例化,才有用。两者冲突。

抽象类中可以包含抽象方法和非抽象方法。但是一个类中包含了抽象方法,就一定是抽象类。因为抽象方法不被重写就没有用,它没有实体。抽象方法的具体实现由子类提供

synchronized修饰符:被synchronized修饰的方法同一时间只能被一个线程访问。

volatile修饰符:volatile修饰  的成员变量每次被线程访问的时候,都会从内存中重新读取该变量的值。当成员变量发生变化时,会强制的将变化后的值回写至内存,所以所有的线程看到该变量都是相同的值。

不能再final修饰符前面使用volatile,因为final修饰的变量不能修改。

java方法中的可变参数:在具有可变长度的参数的方法中可以当做数组使用。在调用发放中如何能和固定参数的方法匹配,也能够和可变长度的方法匹配,则优先和固定参数的方法匹配。可变长度的参数放在方法参数的最后面,因为如果放大了前面,不知道什么时候是对应的固定参数。每个方法只能有一个可变长度的参数,也是符合可变长度的方法参数放到最后面。

public static void main(String[] args) {
        VarArgsTest1 test = new VarArgsTest1();
        test.print("hello");
        test.print("hello", null);
    }

不要让空值威胁到可变长度的参数,不要隐藏实参类型

 public static void main(String[] args) {
        VarArgsTest1 test = new VarArgsTest1();
        String[] strs = null;
        test.print("hello", strs);
    }
发布了15 篇原创文章 · 获赞 0 · 访问量 1078

猜你喜欢

转载自blog.csdn.net/ma316110/article/details/80250938