---------------------- android培训、java培训、期待与您交流! ---------------------
构造函数构建创造对象时使用的函数
特点
1.函数名与类名相同
2.不用定义返回值类型
3.没有具体的返回值
作用
给对象进行初始化
注意
1.默认构造函数的特点
2.多个构造函数是以重载的形式存在的
创建对象都必须通过构造函数初始化
一个类中如果没有顶一个过构造函数,那么该类中会有一个默认的空参数的构造函数
如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有了。
一般函数和构造函数的区别
构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。
一般函数:对象创建后,需要函数功能时才调用。
构造函数:对象创建时,只调用一次。
一般函数:对象创建后,可以被调用多次。
什么时候定义构造函数?
在描述事物时,该事物一存在就具备的一些内容,这些内容定义在构造函数中
class Person
{
private String name;
private int age;
//定义一个Person的构造函数
Person ()//构造函数,而且是空参数的
{
name="baby";
age=1;
System.out.println("person run");
//return; //结束函数
}
//有的孩子一出生就有名字
Person(String n)
{
name=n;
}
Person(String n,int a)
{
name=n;
age=a;
}
public void speak()
{
System.out.println(name+":"+age);
}
public void setName(String n)
{
name=n;
}
}
class ConsDemo
{
public static void main(String[] args)
{
Person p=new Person();//构造函数在对象创建时就运行(给对像初始化)
p.speak();
Person p1=new Person("旺财");
p1.speak();
Person p2=new Person("小强",10);
p2.speak();
}
}
this关键字
当成员变量和局部变量重名,可以用关键字this来区分
this:代表当前对象。
this就是所在函数所属对象的引用。
简单来说,哪个对象调用了this所在的函数,this就代表哪个对象。
this也可以用于在构造函数中调用其他构造函数
注意:只能定义在构造函数的第一行。因为初始化动作要先执行。
只要在本类中使用了本类的对象,通常使用this
class Person
{
private String name;
private int age;
//定义一个Person的构造函数
Person ()//构造函数,而且是空参数的
{
name="baby";
age=1;
System.out.println("person run");
//return; //结束函数
}
//有的孩子一出生就有名字
Person(String name)
{
this.name=name;//this.name是对象的name
}
Person(String n,int a)
{
this(name);//给该对象初始化name,对象间的调用,必须放在第一个语句
age=a;
}
public void speak()
{
System.out.println(name+":"+age);
}
public void setName(String n)
{
name=n;
}
/*
判断是否是同龄人
*/
public boolean conpare(Person p)
{
return this.age==p.age;//this.age是p1的age,p.age是p2的age
}
}
class ThisDemo
{
public static void main(String[] args)
{
//Person p=new Person("旺财");
//p.speak();
//Person p1=new Person("小强");
//p1.speak();
Person p1=new Person("aa",30);
Person p2=new Person("cc",12);
p2.conpare(p1);
}
}
static(静态)关键字
特点:
1.static是一个修饰符,用于修饰成员;
2.static修饰的成员被所有的对象所共享;
3.static优先于对象存在,因为static的成员随着类的加载就已经存在了;
4.static修饰的成员多了一种调用方式,就是可以直接被类名所调用;调用格式为类名.静态成员;
5.static修饰的数据是共享数据,对象中存储的是特有数据;
成员变量和静态变量的区别
1.两个变量的生命周期不同
成员变量随着对象的创建而存在,随着对象的被回收而释放;
静态变量会随着类的加载而存在,随着类的消失而消失;
2.调用方式不同
成员变量只能被对象调用,
而对于静态变量,可以被对象调用,也可以被类名调用;
3.别名不同
成员变量,也称为实例变量;
静态变量,又称为类变量(区别于类型变量);
4.数据的存储位置不同
成员变量数据存储在堆内存的对象中,所以也叫做对象的特有数据;
静态变量数据存储在方法区(共享数据区)的静态区中,所以也叫对象的共享数据;
static的使用情况
1.静态变量
当分析对象中所具备的成员变量的值都相同时,这时,这个成员就可以被静态修饰
只要数据在对象中都是不同的,那就是对象的特有数据,必须存储在对象中,是非静态的;
如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的;
2.静态函数
函数是否用静态修饰,需参考一点,该函数功能是否访问到对象中的特有数据;
简单来说,从源代码看,该功能是否需要访问非静态的成员变量,
如果需要,该功能就是非静态的;否则,就可以将该功能定义为静态的;
当然,也可以定义为非静态的,但是非静态需要被对象调用,而仅创建对象,调用非静态的、没有访问特有数据的方法,该对象的创建时没有意义的。
静态代码块
随着类的加载而执行,而且只执行一次
作用
用于给类进行初始化
class StaticCode
{
static int num;//只能进行赋值
static
{//不只能够赋值,还能够运算
num=10;
num*=3;
System.out.println("hhhh");
}
void show()
{
System.out.println("show run");
}
}
class Person
{
private String name;
{//构造代码块,不同于static代码块。可以给所有对象进行初始化,创建了几个对象就执行几次
//System.out.println("person run");
cry();
}
Person()//构造函数是给对应的对象进行针对性的初始化
{
name="baby";
//cry();
}
Person(String name)
{
this.name=name;
//cry();
}
public void cry()
{
System.out.println("cry");
}
public void speak()
{
System.out.println("name:"+name);
}
}
class StaticCodeDemo
{
//static
//{//在主函数之前执行(随着类的加载而执行)
//System.out.println("a");
//}
public static void main(String[] args)
{
//new StaticCode().show();
Person p1=new Person();
Person p2=new Person("旺财");
p1.speak();
p2.speak();
}
}
※注意:
1.静态方法只能访问静态成员(非静态既可以访问静态,又可以访问非静态);
2.静态方法中不可以使用this或者super关键字(this代表对象,而静态方法存在时,对象尚不存在);
3.主函数是静态的;
class Person
{
String name;//成员变量,又叫做实例变量
static String country="CN";//静态变量,又叫做类变量。单独开辟空间存储country,被所有的对象所共享
//不仅可以被对象使用,也可以被类名访问
public void show() //如果使用static修饰,show()随着类的加载而存在,此时不存在对象,而name存在于对象中,故编译时会报错
{
System.out.println(country+":"+name);
//System.out.println(Person.country+":"+this.name);
}
}
class StaticDemo
{
int num=4;
public static void main(String[] args)
{
Person p=new Person();//p是类类型变量,区别于类变量
p.name="小强";
p.show();
System.out.println(p.country);
System.out.println(Person.country);
new StaticDemo().show();
}
public void show()
{
System.out.println(num);
}
}
主函数特殊之处(public static void main(String[] args)
1.格式是固定的;
2.被jvm所识别和调用
public:因为权限必须是最大的;
static:虚拟机在调用主函数时不需要对象,直接用主函数所属类名调用即可;
void:主函数没有具体的返回值;
main:函数名,不是关键字,只是一个jvm识别的固定的名字;
String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型;
class MainDemo
{
public static void main(String[] args) //new String[0],产生了数组实体,但是没有存储元素
{
System.out.println(args);//[Ljava.lang.String;@bdb503
System.out.println(args.length);// 0
System.out.println(args[0]);
}
}
当编译器编译时,如果该类中使用了其他类,编译器会在CLASSPATH下或当前目录下查找使用的类,
如果查找无此类,则继续查找与使用类的名字相同的*.java文件,并自动编译
class ArrayToolDemo
{
public static void main(String[] args)
{
int[] arr={4,8,2,9,72,6};
ArrayTool tool=new ArrayTool();
int max=ArrayTool.getMax(arr);
int index=ArrayTool.getIndex(arr,10);
System.out.println("max="+max);
System.out.println("index="+index);
}
}
/**
建立一个用于操作数组的工具类,其中包含着常见的对数组操作的函数,如:最值、排序等。
@author C.C.
@version v1.0
*/
public class ArrayTool
{
private ArrayTool(){};//该类中的方法都是静态的,所以该类不需要创建对象,
//为了保证不让其他程序创建该类对象,可以将该类的构造函数私有化
/*
获取整型数组的最大值。
@param arr 接收一个元素为int类型的数组;
@return 返回该数组中的最大元素值;
*/
public static int getMax(int[] arr)//没有访问到特有数据,需加static
{
int maxIndex=0;
for (int x=1;x<arr.length ;x++ )
{
if(arr[x]>arr[maxIndex])
maxIndex=x;
}
return arr[maxIndex];
}
/**
对数组进行选择排序
@param arr 接收一个元素为int类型的数组;
*/
public static void selectSort(int [] arr)
{
for(int x=0;x<arr.length-1;x++)
{
for(int y=x+1;y<arr.length;y++)
{
if(arr[x]>arr[y])
swap(arr,x,y);
}
}
}
/**
用于给数组进行元素的位置指环
@param arr 接收一个元素为int类型的数组;
@param a int;
@param b int;
*/
private static void swap(int[] arr,int a,int b)
{
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
/**
获取指定的元素在指定数组中的索引
@param arr 接收一个元素为int类型的数组;
@param key 要找的元素;
@return 返回该元素第一次出现的位置,如果不存在,则返回-1;
*/
public static int getIndex(int[] arr,int key)
{
for (int x=0;x<arr.length ;x++ )
{
if(arr[x]==key)
return x;
}
return -1;
}
/**
将int数组转换成字符串
格式是:{e1,e2,...};
@param arr 接收一个元素为int类型的数组;
@return 返回该数组的字符串表现形式
*/
public static String arrayToString(int[] arr)
{
String str="[";
for (int x=0;x<arr.length ;x++ )
{
if(x!=arr.length-1)
{
str=str+arr[x]+",";
}
else
str=str+arr[x]+"]";
}
return str;
}
}
javadoc -d myhelp -author -version ArrayTool.java //在当前目录下创建myhelp目录存放
使用set classpath=.;c:\myclass //包含已存在的类
----------------android培训、java培训、期待与你交流,详细查看:http://edu.csdn.net/heima------------