Java基础之this,static,构造函数
构造函数


函数名与类名相同
不用定义函数的返回值
没有具体的返回值(因为构造函数没有结果)
构造函数:构建创造对象时候调动的函数,可以给对象初始化,但给对象赋值推荐用set
public class Person
{
public Person()
{
System. out.print("我被new了" );
}
public static void main(String[] args)
{
Person p = new Person();//会选择空参数的构造函数进行调用
}
}
默认的构造函数
如果没有在该类中定义构造函数,编译的时候会自动的加上一个空参数的构造函数,但是如果你手动加了一个构造函数,那么该类默认的构造函数就没有了
构造函数和一般函数的区别
构造函数在对象创建时,就会调用对应的构造函数,对对象进行初始化操作一般函数在对象创建后,需要函数功能时才调用构造函数对象创建时,会调用一次一般函数在对象创建后,调用多次
多个构造函数是以重载的形式体现的
构造函数内存图解
this关键字的作用
this:this所在函数所属对象的引用,简单的说,哪个对象调用了this所在的函数,this就代表哪个对象
this关键字调用其他构造函数
必须放在第一句话。this(String name);因为初始化动作要先执行
this的实际应用
public class Demo {
public static void main(String[] args) {
Person p = new Person("张三" , 17);
Person p2 = new Person("李四" , 18);
//这么调用是不是有点太牵强了呢?
System. out.print(p.compare(p, p2));
}
}
class Person {
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String name ;
public int age ;
public boolean compare(Person p, Person p2) {
return p.age == p2.age;
}
}
可以利用this这么调
public boolean compare(Person p )
{
return this.age == p.age;
}
p1.compare(p2 );
static关键字
1.数据共享
public String name ;
public static String country;
//正常情况下, 要是创建一个对象,其中每个对象都会创建country的全局变量
//但是你发现,国家都是中国,这个时候就可以加上static静态的,不然会导致数据重复
//static起到了数据共享的作用,单独存放在一个区域,谁要用调用它就可以了
2.static关键字特点
2.1加载顺序,static优先于对象的存在
进内存之后先加载被static修饰的成员,随着类的加载就加载完。
因为static需要数据共享,要是先加载对象的话,需要共享数据
找谁去啊?
2.2static修饰的成员被所有对象所共享
例子:就像饮水机一样,饮水机就像是被static修饰的成员一样
如果要是想用饮水机,就得用杯子,但是杯子不用一个,
这时候就需要对象,饮水机就被很多杯子所共享
2.2调用方式
可以用过new对象的方式来调用
可以用过类名.静态成员来调用
2.3什么时候用,static修饰的数据是共享数据,而对象存储的是特有数据
静态的好处就是又多了一种调用方式,而且不用创建对象
那么name如果变成静态的,如果一个对象给name变成李磊
是不是所有name都变成了李磊,这样就行,有些数据是共享
的。
在一个就是静态变量随着类的消失而消失,很占内存,如果你加载很多类
那么Java虽然有GC机制,但是相对来说还是少用为好!
3.成员变量和静态变量的区别
3.1变量的生命周期不同
成员变量 随着对象的创建而创建,随着对象被GC回收被释放
静态变量 随着类的加载而存在,随着类的消失而消失
3.2变量的调用方式不同
成员变量 只能用过new对象的方式访问
静态变量 可以用过类名访问,还可以通过对象访问,但推荐用类名访问
3.3别名不同,叫发不同
成员变量 -- 实例变量
静态变量 -- 类变量
3.4数据的存储位置不同
成员变量 存储在堆内存中,所以也叫对象的特有数据
静态变量 存储在方法区的静态方法区,所以也叫对象的共享数据
4.static关键字注意事项
4.1静态函数不可以访问非静态成员(成员函数,成员变量)
class Demo
{
public static String name;
public int age ;
public void getName()
{
System. out.print(Demo.name + this. age);
}
}
class Demo
{
public static String name;
public int age ;
public static void getName()
{
System. out.print(age);
}
}
//很好解释,因为静态变量是根据类的创建而来的。有类的时候还没有对象呢,你访问age,就是访问对象中的age
4.2静态函数里面不可以使用this和super关键字
也很好解释,因为类变量先有,你this指向的是所属对象,有类的时候还没有对象,那么this指向谁呢?
4.3main函数就是一个静态的
public 因为权限必须是最大的
static 不需要对象调用,直接需要主函数的类名调用即可
void 主函数没有具体的返回值,因为返回给JVM,JVM要它有啥用啊
main 函数名称,并不是关键字,只是被JVM识别的名字
String[] args 主函数参数列表,String类型的数组
public static void main(String[] args)//new String[0]默认是这样的
{
//运行的时候输入 java Demo 张三 李四 王五
System. out.println(args.length );
for(int x = 0; x < args.length; x++)
{
System. out.print(args[x] + "\n" );
}
}
局部代码块和构造代码块
定义在方法中的代码块,叫局部代码块。作用是:让变量尽可能的早的从内存消失,提高程序效率
定义在方法外的代码块,叫做构造代码块。作用是:构造函数重复的数据定义在构造代码块中,每次调用构造都会先执行构造代码块
定义在方法外的代码块,叫做构造代码块。作用是:构造函数重复的数据定义在构造代码块中,每次调用构造都会先执行构造代码块
Random和Math
Random类
Random r = new Random(); 空参数的构造函数有默认种子
Random r = new Random(long send);保持随机数随机一次之后不变
r.nextInt(); int范围内随意一个数
r.nextInt(int x); 随机一个从0开始(包含0),到x结束(不包含x)的随机数
Math静态类
int randomNumber = (int)(Math.random() * 100 + 1);