• 3.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详解

  • 相关阅读:
    本地计算机 上的 Redis Server 服务启动后停止
    RabbitMQ 命令行
    mysql ORDER BY 中文出现错误问题
    使用javascript纯前端导出excel
    软件测试概念学习
    excel控件只为简单写入数据表--github找到ExcelUtil笔记
    快速创建Spring web项目
    PQGrid商业化的表格组件
    mybatis传入参数为0被误认为是空字符串的解决方法
    MyBatis like报错
  • 原文地址:https://www.cnblogs.com/lifexy/p/10779351.html
Copyright © 2020-2023  润新知