专栏首页Linux驱动JAVA-方法重载,类的封装访问权限,构造/析构方法

JAVA-方法重载,类的封装访问权限,构造/析构方法

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).
  • 上图的同一包,表示在同一个目录中的类成员访问权限

包的定义以及使用参考: 13.JAVA-包package、import使用

接下来我们来看看default区别

定义common.demo.Test类:

package common.demo ;  //指定生成的class文件位于common/demo/目录下
public class Test
{ 
         static int i=10;                           //默认为default权限
         public  static void main(String args[]){
                  System.out.println("Hello World");
         }
}

定义common.demo.CallTest类,此类和common.demo.Test类位于同一包:

package common.demo ;  //指定生成的class文件位于common/demo/目录下
import common.demo.*;     //导入common.demo包里的所有类

public class CallTest
{ 
         public static void main(String args[]){
                  System.out.println("i:"+Test.i);       //打印静态属性i
         }
}

运行打印:

然后我们屏蔽" package common.demo ;"后,则CallTest类不在common.demo包里了,所以访问Test.i将会报错,编译后如下图所示:

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();              //打印回溯信息
                }
         }
}

运行打印:

下章学习:4.JAVA-数组、String详解

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 13.JAVA-包package、import使用

    之前我们学习java时,生成的class文件都是位于当前目录中,假如出现了同名文件,则会出现文件覆盖问题,因此就需要设置不同的目录(定义包),来解决同名文件冲突...

    张诺谦
  • 8.JAVA-向上转型、向下转型

    如上图所示,可以看到打印的是class B的print,这是因为我们通过子类B去实例化的,所以父类A的print方法已经被子类B的print方法覆盖了.从而打印...

    张诺谦
  • 27.C++- 智能指针

    智能指针 在C++库中最重要的类模板之一 智能指针实际上是将指针封装在一个类里,通过对象来管理指针. STL中的智能指针auto_ptr 头文件: <memor...

    张诺谦
  • Volley源码分析学习

    2)根据SDK版本来创建HttpStack的实现,如果是2.3以上的,则使用基于HttpUrlConnection实现的HurlStack,反之,则利用Http...

    用户3106371
  • 设计模式之 策略模式

    定义 :封装了一些列算法,它们之前可以相互替换,此模式使得算法的改变,不会影响到使用它们的客户端

    用户3094376
  • PHP设计模式之命令模式

    命令模式,也称为动作或者事务模式,很多教材会用饭馆来举例。作为顾客的我们是命令的下达者,服务员是这个命令的接收者,菜单是这个实际的命令,而厨师是这个命令的执行者...

    硬核项目经理
  • 【今日壁纸】2019-01-09

    作者:知道君, 转载或复制请以 超链接形式 并注明出处 夏末浅笑。 原文地址:《【今日壁纸】2019-01-10》 发布于2019-01-10

    夏末浅笑
  • 【今日头像】2019-01-10

    夏末浅笑
  • 聊聊spring boot tomcat jdbc pool的属性绑定

    本文主要研究一下spring boot tomcat jdbc pool的属性绑定

    codecraft
  • The `useMongoClient` option is no longer necessary in mongoose 5.x, please remove it.

    mongoose升级到5.X版本就不支持useMongoClient 这种写法了,而是应该写成useNewUrlParser。

    acoolgiser

扫码关注云+社区

领取腾讯云代金券