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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值