• Java面向对象之封装静态


       面向对象的三个特征:封装、继承和多态。

      Java开发的过程就是找合适的库对象使用,没有对象创建新对象。找对象,建立对象,使用对象并维护对象之间的关系。

      类就是对现实生活中事物的描述,而对象就是这类事物实实在在的个体。对应到Java编程中,描述就是class定义的类结构,

    对象就是通过new申请堆内存建立的实体。定义类,就是在描述事物,就是在定义属性和行为。属性和行为共同成为类中的成员

    (成员变量和成员方法)。

      成员变量和局部变量的区别:

      1.作用范围:成员变量作用于整个类中,局部变量作用于函数中或者语句中;

      2.存储位置:成员变量在堆内存中,因为对象的存在才在内存中存在,局部在栈内存中。

      匿名对象:

        Car c=new Car(); c.num=5;  等价于    new Car().num=5;  

    如果new Car().num=5;  new Car().color="blue";  new Car().run; //创建了三个对象

    功能函数问题

    main()
    {
    	Car c=new Car();
    	show(c);//show(new Car())
    }
    public static void show(Car c)
    {
    	c.num=3;
    	c.color='black';
    	c.run();
    }
    

      参量c是副本,但是由于只创建了一个对象,c其实包含着指针,main函数中的c和参量c都是指向堆控件对象。

     

      特征一:封装

      隐藏对象的内部细节(相对于用户透明),对外提供公共访问接口,可以控制传入的数据(加入逻辑判断等语句),提高代码的健壮性。

      好处:将变化隔离;便于使用;提高重用性;提高安全性。

      prinvate关键字:

        私有修饰符,用于修饰类中的成员(成员变量和成员函数),是封装的一种表现形式。(权限在访问不到的形式,就是封装)

      构造代码块,没有函数名和类型及参数只有  {...}

      作用:给对象初始化,对象一建立就运行,且优先于构造函数执行,定义对象共性;和构造函数区别是,构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化。当然了,构造函数还是要执行的。  

      构造函数私有化后不能用此构造函数创建对象。

      构造函数如:Person(String name){name =name;}//原来成员变量有name,但是这里两个都当成局部变量,必须要用this,this.name=name;

      this关键字:

        就代表本类的对象,代表它所在函数所属对象的引用,当函数内部要用到调用本类对象时用到。

      public boolean compear(Person p)
      {
        return this.age==p.age;
      }

      main (){

        Person p1=new Person(20);
        Person p2=new Person(25);
        boolean b=p1.compare(p2);

      }

      this:在构造函数间调用时使用

      例如 :  

      Person(Sting name)
      {

        this.name=name;
      }
      person(String name,int age)
      {
        //this.name=name;
        this(name);//只能放在第一行,初始化的动作要先执行
        this.age=age;
      }

       static关键字:

    class Person
    {
        String name;
        String country ="CN";
        public void show()
        {
             System.out.println(name+"::"+country);
        }      
    }    
    class StaticDemo
    {
        public static void main(String[]  args)
        {    
            Person p=new Person();
            p.name="zhangsan";
            p.show();      
        }
    }
    

     

      有这么一种情况,当很多都是中国人的对象时,country这个成员变量在很多对象间都是通用的,当创建很多对象时,堆内会占用很多不必要的空间,所以 String country ="CN";这样就可以了。其在方法区/共享区/数据区,这里面放着方法(功能函数)和共享的数据。

    用法:当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用。类名.静态成员,比如System.out.println(Person.country);

    static特点:

    1.随着类的加载而加载;(也就是静态随着类的消失而消失,它的生命周期最长)

    2.优先于对象而存在;(静态是先存在的,对象是后存在的)

    3.被所有对象所共享;

    4.可以直接被类名调用。

    实例变量和类变量的区别:

    1.存放位置

      类变量随着类的加载而存在于方法区中。

      实例变量随着对象的建立而存在于堆内存中

    2.生命周期:

      类变量生命周期最长,随着类的消失而消失

      实例变量生命周期随着对象的消失而消失

    静态使用注意:

    1.静态方法只能访问静态成员(变量或者方法,当类名调用时非静态还没有呢);

       非静态既可以访问静态也可以访问非静态;

    2. 静态方法中不可以定义this,super关键字,因为静态优先于对象存在,所以静态方法中不可以出现this。

    3.主函数是静态的。

    优缺点:

    1.优点,对对象的共享数据进行单独空间的存储,节省空间,还可以直接被类名调用;

    2.缺点,生命周期过长,访问出现局限性(静态虽好,只能访问静态)。

     

    静态代码块

    static

    {

      静态代码块中的执行语句

    }

    特点:随着类的加载而执行,只执行一次

    用于给类进行初始化

    随着类加载只执行一次,优先于主函数,而且还是不能访问非静态

    class hello1 {
        static
        {
            System.out.println("a");
        }
    }
    
    class hello {
        static
        {
            System.out.println("b");
        }
        public static void main(String[] args)
        {
            new hello1();
            new hello1();
            System.out.println("over");
        }
        static
        {
            System.out.println("c");
        }
    }

    结果  b c a over   

  • 相关阅读:
    随机出题问题
    简读《构建之法》提问
    大二下第一次课后作业
    大道至简第七第八章读后感
    继承与接口动手动脑
    大道至简第六章读后感
    数组里的随机数问题
    大道至简第五章读后感
    输入法的用户界面
    搜索水王
  • 原文地址:https://www.cnblogs.com/BetterThanEver_Victor/p/6102919.html
Copyright © 2020-2023  润新知