一、构造函数与默认构造函数
构造函数,是一种特殊方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
/**
* 矩形
*/
class Rectangle {
/**
* 构造函数
*/
public Rectangle(int length, int width) {
this.length = length;
this.width = width;
}
public static void main (String []args){
//使用构造函数创建对象
Rectangle rectangle = new Rectangle(10,5);
}
}
特别的一个类可有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分构造函数的重载。
构造函数跟一般的实例方法相似;
与其它方法不同点:
- 构造器没有返回类型
- 不会被继承,且可以有范围修饰符
构造器的函数名称必须和它所属的类的名称相同。它承担着初始化对象数据成员的任务。
如果在编写一个可实例化的类时没有专门编写构造函数,多数编程语言会自动生成缺省构造器(默认构造函数)。
如果在编写一个可实例化的类时没有专门编写构造函数,默认情况下,一个Java类中会自动生成一个默认无参构造函数。默认构造函数一般会把成员变量的值初始化为默认值,如int -> 0,Integer -> null。
但如果手动在某个类中定义了一个有参数构造函数,那么这个默认的无参构造函数就不会自动添加了。要手动创建!
/**
* 矩形
*/
class Rectangle {
/**
* 构造函数
*/
public Rectangle(int length, int width) {
this.length = length;
this.width = width;
}
/**
* 无参构造函数
*/
public Rectangle() {
}
}
二、类变量、成员变量和局部变量
Java中三种变量:类变量、成员变量和局部变量。分别存放在JVM的方法区、堆内存和栈内存。
public class Variables {
/**
* 类变量
*/
private static int a;
/**
* 成员变量
*/
private int b;
/**
* 局部变量
* @param c
*/
public void test(int c){
int d;
}
}
a作为类变量,存放在JVM的方法区;b作为成员变量,和对象一起存储在堆内存中(不考虑栈上分配的情况);c和d作为方法的局部变量,保存在栈内存。
介绍这三种变量类型,是因为很多人因为不知道这三种类型的区别,所以不知道他们分别存放在哪里,这导致不知道那些变量需要考虑并发问题。
关于并发问题,这里简单说明:
因为只有共享变量才会遇到并发问题,所以,变量a和b是共享变量,变量c和d是非共享变量。所以如果遇到多线程场景,对于变量a和b的操作需要考虑线程安全,而对于线程c和d的操作不需要考虑线程安全。
三、成员变量和方法作用域
通过封装手段,将成员变量、方法等包装在一个类中,那么被封装在类中的这些成员变量和方法,能不能被外部访问呢?能被谁访问呢?
这种能不能被访问、能被谁访问的特性,Java是通过访问控制修饰符来实现。
Java中,可以用访问控制符来保护对类、变量、方法和构造方法的访问,Java 支持 4 种不同的访问权限。
对于成员变量和方法的作用域,public,protected,private及不写间的区别:
public:
表明该成员变量或方法对所有类或对象都是可见的,所有类或对象都可直接访问。private:
表明该成员变量或方法是私有的,只有当前类对其具有访问权限,除此之外其他类或对象都没有访问权限,子类也没有访问权限。protected:
表明成员变量或方法对类自身,与同在一个包中的其他类可见,其他包下的类不可访问,除非是其的子类。default:
表明该成员变量或方法只有自己和其位于同一个包的内可见,其他包内的类不能访问,即便是它的子类。