类和对象基本知识点-java

java命名的基本原则包括:变量名、方法名首单词小写,其余单词只有首字母大写;接口名、类名首单词第一个字母大写;常量名完全大写。包的名称都应该由小写字母组成。

标识符

作用:标识符就是用于给java程序中变量、类、方法等命名的符号。

1.标识符的规则:

标识符也有一定的命名规则,不是什么名字都可以用的。
规则1:标识符可以用字母、数字、下划线、美元符号组成,但不能包含%、@、空格等其他特殊字符。不能以数字开头。
规则2:标识符不能是java的关键字和保留字。但可以包含关键字和保留字。
规则3:标识符严格区分大小写。
规则4:标识符的命名最好能反映出其作用。

2.变量名规则:

在这里插入图片描述
注意:1、不能以数字开头
2、不能以下划线和美元符之外的其他特殊字符开头
3、不能使用java关键字

Java中内存管理:为了充分利用资源,Java有一个系统级的线程,用来对内存的使用进行跟踪,它可以在系统空闲时对不用的内存空间进行回收,从而使程序员从繁忙的内存管理中解放出来。

在Java源程序中,可以有0个或多个import语句。

声明一个类,可以使用的权限修饰符只有publicdefault两种。

在Java中,所有类的根类是java.lang.Object.

在一个Java源程序文件中,可以包含多个类,但只能有一个类使用public修饰符,该类的名字必须与源程序文件的名字相同。另外,当程序中创建多个类时,必须使用包含main()方法的类。

public、protected、private和default都是java中的访问控制:

public protected default private
本类
本类所在的包 ×
其他包中的子类 × ×
其他包中的非子类 × × ×

new关键字的作用:为对象分配内存空间、调用类的构造方法、为对象返回一个引用。
例题:
在java中,内存分配的运算符是new.

static关键字的作用

static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法。(注意:不能修饰普通类,除了内部类,这是为什么?)
简而言之,被static关键字修饰的内容都是静态的。
静态是相对于动态的,动态是指Java程序在JVM上运行时,JVM会根据程序的需要动态创建对象并存储对象(分配内存),对象使命结束后,对象会被垃圾回收器销毁,即内存回收由JVM统一管理并分配给其他新创建的对象;静态是指Java程序还没有运行时,JVM就会为加载的类分配空间存储被static关键字内容;如静态成员变量,Java类加载到JVM中,JVM会把类以及类的静态成员变量存储在方法区域,我们知道方法区是线程共享且很少发生GC(Garbage Collection,垃圾收集,垃圾回收)的区域,所以被static关键字修饰的内容都是全局共享的,且只会为其分配一次存储空间。所以当类的某些内容不属于对象,而由对象共享即属于类的时候,就可以考虑是否用static关键字修饰

1.修饰代码块

在类中,用static修饰的代码块称为静态代码块,反之称为实例代码块。
实例代码块会随着对象的创建而执行,即每个对象都会有自己的实例代码块,表现出来就是实例代码块的运行结果会影响当前的内容,并随着对象的销毁而消失(内存回收);而静态代码块是当Java类加载到JVM内存中而执行的代码块,由于类的加载在JVM运行期间只会发生一次,所以静态代码块也只会执行一次
因为静态代码块的主要作用是用来进行一些复杂的初始化工作,所以静态代码块跟随类存储在方法区的表现形式是静态代码块执行的结果存储在方法区,即初始化量存储在方法区并被线程共享。

2.修饰成员变量

类中用static关键字修饰的成员变量称为静态成员变量,因为static不能修饰局部变量(为什么?),因此静态成员变量也能称为静态变量。静态变量跟代码块类似,在类加载到JVM内存中,JVM会把静态变量放入方法区并分配内存,也由线程共享。访问形式是:类名.静态成员名。

public class StaticTest {
    
    
	public static void main(String[] args) {
    
    
		System.out.println(D.i);
		System.out.println(new D().i);
	}
}
class D {
    
    
	static {
    
    
		i = 2;
		System.out.println("D : 静态代码块1");
	}
	static int i;
}

静态变量存储在类的信息中,且可以在线程间共享,那么它当然也属于该类的每个对象,因此可以通过对象访问静态变量,但编译器并不支持这么做,且会给出警告。

。一个类的静态变量和该类的静态代码块的加载顺序。类会优先加载静态变量,然后加载静态代码块,但有多个静态变量和多个代码块时,会按照编写的顺序进行加载。

class D {
    
    
	static {
    
    
		i = 2;
		System.out.println("D : 静态代码块1");
	}
	static {
    
    
		i = 6;
		System.out.println("D : 静态代码块2");
	}
	static int i;
}

可以想一下运行的结果。
。静态变量可以不用显式的初始化,JVM会默认给其相应的默认值。如基本数据类型的byte为0,short为0,char为\u0000,int为0,long为0L,float为0.0f,double为0.0d,boolean为false,引用类型统一为null。
。静态变量既然是JVM内存中共享的且可以改变,那么对它的访问会引起线程安全问题(线程A改写的同时,线程B获取它的值,那么获取的是修改前的值还是修改后的值呢?),所以使用静态变量的同时要考虑多线程情况。如果能确保静态变量不可变,那么可以用final关键字一起使用避免线程安全问题;否则需要采用同步的方式避免线程安全问题,如与volatile关键字一起使用等。
。static关键不能修饰局部变量,包括实例方法和静态方法,不然就会与static关键字的初衷-共享相违背。

3.修饰方法

用static关键字修饰的方法称为静态方法,否则称为实例方法。通过类名.方法名调用,但需要注意静态方法可以直接调用类的静态变量和其他静态方法,不能直接调用成员变量和实例方法(除非通过对象调用)。

class D {
    
    
	static {
    
    
		i = 2;
		System.out.println("D : 静态代码块");
	}
	static final int i;
	int j;
	
	static void method() {
    
    
		System.out.println(i);
		System.out.println(new D().j);
		
		method1();
		new D().method2();
	}
	
	static void method1() {
    
    
		System.out.println(i);
	}
	void method2() {
    
    
		System.out.println(i);
	}
}

注意:既然类的实例方法需要对象调用才能访问,而静态方法直接通过类名就能访问,那么在不考虑部署服务器的情况下,一个类是如何开始执行的呢?最大的可能就是通过“类名.静态方法”启动Java,而我定义那么多静态方法,JVM又是如何知道主入口呢?
或许,你想到了main方法。
注意:static关键字虽然不能修饰普通类,但可以用static关键字修饰内部类使其变成静态内部类。static关键字本身的含义就是共享,而Java类加载到JVM内存的方法区,也是线程共享的,所以没必要用static关键字修饰普通类。

4.静态导入

在用import导入包或者类时,可以用static修饰包名或者类,表示静态导入。静态导入可以与动态导入放在一起比较来加深理解。
动态导入是当你程序运行时需要new一个不在此包中的类的对象时,才会根据全路径类名加载类;而静态导入则是随着类的加载而加载静态导入的类,所以它是提前导入的(可以直接使用,不用使用类名.方法或者属性的方式)。

super关键字

1.在子类中,通过super关键字可以在子类中使用父类的功能
2.super关键字相当于是父类的一个引用该对象
3.如果在构造方法中使用,必须出现在调用位置的第一行

this关键字

每个对象都有一个名为this的引用,它指向当前对象的本身,主要有如下4个方面:
(1)this调用本类中的属性,也就是类中的成员变量。成员方法中没有与成员变量同名的参数时,this可以省略。(成员方法中默认的是引用方法中的参数,而不是成员变量)
(2)this调用本类中的其他方法。其中,成员方法名前的this可以省略。
(3)this调用本类中的其他构造方法。在构造方法中,可以通过this调用本类中具有不同参数表的构造方法。
(4)返回对象值。例如,在代码中,可以使用return this 返回某个类的引用。此时这个this关键字就代表类的名称。

猜你喜欢

转载自blog.csdn.net/zhanlong11/article/details/114272782