zoukankan      html  css  js  c++  java
  • Java探索之旅(6)——对象和类

    1.知识要点

    假设:

             public  ClassName{
                  int data;
                  String name;
                  ClassName(){data=1;}
                  public static int getdata(){return data;}}</span>

       ❶含main()的为主类。多个类放在一个文件中,只能有一个主类。

       ❷类可以不定任何构造方法(函数),系统默认提供无参构造函数。当且仅当无任何无参构造函数时才提供。

       ❸构造函数与类同名,无返回类型。

       ❹对象声明:ClassName objectRef=new ClassName(....)
         实质上,obejectRef为一个包含对ClassName对象的引用变量。即为引用类型,简称为ClassName对象。

       ❺类似于匿名数组,也有匿名对象,如new ClassName()就可以直接用于参数或者输出。因为此时对象不需要引用。

       ❻类的数据域也可以是引用类型。例如name同样为String引用类型,倘若其没有引用任何变量,初始化为null。

       ❼Java的类的数值域,数值类型默认0,引用类型默认null,boolean默认false,char默认‘u0000’。但是局部变量没有初始化值,比如在main中不要试图定义变量,未经初始化输出。

       ❽不需要某个对象的时候。显式的赋给null,其之前的引用的对象进入垃圾回收机制。

       ❾类似数组,对象名之间的赋值,后者指向的对象进入垃圾回收机制,Java系统自动的收回所占空间。


    2.静态变量、常量与方法

       ❶静态变量(类变量):类的所有实例共享数据,存储在公共地址,某对象修改,其他的对应修改。关键字static。可以使用类名(推荐)或者引用变量调用

       ❷常量:关键词final static。所有类的对象共享。推荐使用类名访问,增加可读性。

       ❸静态方法:静态方法在前面添加static关键字。比如常用的Math.random

      注意:

        静态变量和静态实例可以在实例方法和静态方法中使用。相反,实例方法和实例变量仅能使用于实例方法。因为静态方法、变量不属于某个特定的类。
        所谓实例方法和实例变量是依赖具体实例的,比喻半径r依赖于某个圆实例,getArea()得到圆的面积,也是依赖实例。倘若不依赖,就可以定义为静态方法或者静态变量(比如 PI)

    package Study_Class;
    public class MyCircle {
    	double radius;//实例变量
    	static int j=2;
    	final static double Pi=3.14159;
    	
    	MyCircle(){radius=1.0;}
    	MyCircle(double r)
    	{
    		if(r>0) radius=r;
    		else  radius=0;		
    	}
    	
    	public static  void main(String[] args)
    	{
    		//int k=j;//错误!!!,实例变量不在静态方法中使用
    		//getArea();//错误!!!,实例方法不能在今天方法中使用
    		MyCircle circle1=new MyCircle(2.0);
    		System.out.println("the area of circle is"+circle1.getArea());//实例方法使用实例来调用	
    	}
    	
    	public double getArea()//实例方法
    	{
    		return Math.pow(radius, 2)*Pi;
    	}
    
    }
    </pre><pre code_snippet_id="497932" snippet_file_name="blog_20141027_2_2668877" name="code" class="java">   

    3.publicprivate修饰符以及数据域的封装

       ❶类、方法、数据域前面有public修饰符,表示可以被任何其他类(通过实例访问,某个public类的public数据域和方法)访问。

       ❷如果不带修饰符。代表可以被同一包类的任何一个类访问(包私有)。即,同一个包的类,可以通过该public类实例访问,public类的public类和方法,也通过实例访问,不带修饰符的数据域和方法。

       ❸不同的包,只能通过实例访问,public类的public数据域和方法。

       ❹仅仅只有类内定义的对象,能够访问该类的私有方法和私有数据。包内,其他类都不可以。如果为了限制用户创造实例,可将构造方法限定为私有。

       ❺对于私有数据,可以用public接口方法(函数)修改。为了避免数据被篡改,推荐数据域声明为私有。

    简而言之:

    pravite限制访问权限在类内,默认修饰符限制访问权限在包内,public没有限定权限。

    package Study_Class;
    public class MyCircle {
    	private double radius;//实例变量
    	static int numberofObject=0;
    	final static double Pi=3.14159;
    	
    	MyCircle(){radius=1.0;numberofObject++;}
    	MyCircle(double r)
    	{
    		if(r>0) 
    			radius=r;
    		else  
    			radius=0;
    		numberofObject++;
    	}
    	
    	public void setRidus(double r)
    	{
    		if(r>0) 
    			radius=r;
    		else  
    			radius=0;	
    	}
    	
    	public void getArea()//实例方法
    	{System.out.println("The area is --- "+Math.pow(radius, 2)*Pi);}
    	void gerRadius()
    	{System.out.println("The radius is---  "+radius);}
    }
    

       在同一个包内使用上面定义的类如下:

    package Study_Class;
    public class testCircle//同一个包类调用MyCircle类 
    {
    	public static  void main(String[] args)
    	{
    		MyCircle circle1=new MyCircle(2.0);
    		circle1.gerRadius();//无修饰符的方法
    		circle1.getArea();//实例方法使用实例来调用
    		
    		circle1.setRidus(3.5);
    		circle1.gerRadius();
    		circle1.getArea();//实例方法使用实例来调用
    		
    		MyCircle circle2;//只是定义了引用变量
    		System.out.println("The number is---  "+MyCircle.numberofObject);//1个实例
    		circle2=new MyCircle();
    		System.out.println("The number is---  "+MyCircle.numberofObject);//2个实例
    	}
    }
    注意:
          ①同一个包类,可以由实例调用public和无修饰符的方法和变量
          ②可以由类名调用静态变量
          ③定义引用类型,实际没有创造实例。
    
    

    4.对象参数和对象数组

    package Study_Class;
    public class testCircle//同一个包 
    {
    	public static  void main(String[] args)
    	{
    		MyCircle[] circle=new MyCircle[5];//每个均是默认null的引用变量
    		for(int i=0;i<circle.length;i++)
    			circle[i]=new MyCircle(i);	
    		print(circle);//静态方法中使用静态方法
    		System.out.println("The number of Object is---  "+MyCircle.numberofObject);//2个
    	}
    	private static void print(MyCircle[]  circle)
    	{
    		for(MyCircle u:circle)
    			{u.gerRadius();u.getArea();}
    						
    	}
    }

      使用对象数组和给方法传递对象参数如上图。

    注意:

       ①对象参数的实质仍旧为引用传递,而不是值传递。
       ②静态方法中不能使用非静态的数据和方法。如上图的print应该定义为static.
       ③对象存储于堆中

  • 相关阅读:
    C
    B
    D
    I
    B
    E
    B
    L
    H
    bzoj3276磁力 两种要求下的最大值:分块or线段树+拓扑
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5393095.html
Copyright © 2011-2022 走看看