当前位置: 移动技术网 > IT编程>开发语言>Java > 3.JAVA-方法重载,类的封装,构造/析构方法

3.JAVA-方法重载,类的封装,构造/析构方法

2019年04月28日  | 移动技术网IT编程  | 我要评论

1.方法重载

和c++的函数重载一样,主要是实现多个相同的函数名,但是参数表不同.

参数表不同主要有以下几种

  • 1) 参数个数不同
  • 2) 参数类型不同
  • 3) 参数顺序不同

 

2.类和对象

类class

用来描述一个对象的结构,但是类不能直接使用,必须生成对象后才能使用

对象

通过类来生成的一个对象, 根据类生成的对象都具备相同的行为(class成员函数),但是属性(class成员变量)不一定相同.

 

3.对象引用分析

示例如下:

class people
{
         string name;
         public void print(){
                  system.out.println("name:"+name);
         }
}

public class test{
                  public static void main(string args[]){
                  people peoplea = new people(); //在栈空间定义一个peoplea地址,然后通过new在堆空间创建一段内存,使peoplea引用它

                  peoplea.name ="小张";

                  people peopleb = peoplea;   //在栈空间定义一个peopleb地址,然后使peopleb引用peoplea所指向的堆空间.

                  peopleb.print();
                  }
}

打印如下:

 

可以看到通过引用,可以让两个对象指向同一块堆空间

 

4.类的封装

成员变量访问权限有以下4种:

 

  • 在java中,成员变量权限默认是为default (和c++不同,c++默认为private).
  • 上图的同一包,表示在同一个目录中的类成员访问权限(在后续章节学习package包的时候会详细讲解)

 

5.构造方法

  • 构造方法的作用,用来类对象实例化的时候,初始化其属性(成员变量)所准备的
  • 如果类中没有定义构造方法,编译器会默认提供一个无参数的构造方法。
  • 构造方法可以带参数,但是不能有任何返回类型的声明
  • 构造方法不能定义static类型,因为构造方法是在运行期间才会去生成对象
  • 构造方法支持多个方法重载

示例:

class people
{
         public  people(string name){                 //构造方法
                  this.name = name;           //类中有个隐藏的this属性,它永远指向当前对象
         }
         public void print(){
                  system.out.println("name:"+name);
         }
}

public class test{
                  public static void main(string args[]){
                  people peoplea = new people("小张"); //调用 构造方法people(string name) 来初始化属性
                  peoplea.print();
                  }
}

 

6.析构方法

  • 在java中,也有析构方法,不过和c++中类前面加~号的不一样。
  • 在java中,如果需要自己写析构方法,则在类中定义一个void finalize()方法.
  • finalize必须是protected权限的,因为java中的类,默认都是继承于object,所以重写析构方法时,需要和object的一致

ps:一般用不到它,因为java有自动内存回收机制

 

计数当前共有多少个对象示例,代码如下:

class counter
{
         private static int cnt = 0;
         public counter()
         {
                  cnt++;
         }
         public static void printcnt()
         {
                  system.out.println("cnt:"+cnt);
         }

         protected void finalize()
         {
                  cnt--;
         }
}

public class test{
                  public static void main(string args[]){

                  counter cnt1 = new counter();
                  counter.printcnt();

                  counter cnt2 = new counter();
                  counter.printcnt();

        
                  cnt2 = null;                           //将cnt2置为null

                  try
                 {
                    system.gc();                           //告诉回收站,有垃圾,需要清理内存
                    thread.currentthread().sleep(1000);    //休眠1000毫秒,因为需要给finalize()方法提供执行时间
                   counter.printcnt();                       //释放掉cnt2后,则输出1(因为还有cnt1存在)
                }
                  catch(interruptedexception e)   //sleep休眠可能产生interruptedexception异常.所以需要用try捕捉
                {
                   e.printstacktrace();              //打印回溯信息
                }
         }
}

 运行打印:

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网