Java中的类和对象_2
一、Java类中方法的表现形式及其基本特征?
Java类中方法是为了描述具有共同性质的一组数物的基本功能/行为。
Java类中方法的表现形式
1.实例方法格式
访问限制修饰符 方法的返回值数据类型 方法的名称(参数列表){方法体}
(1).访问限制修饰符---public 缺省的
(2).方法的返回值数据类型
返回值-----方法执行结果
数据类型---基本数据类型【复合数据类型】
有返回值---方法体中的最后一句话是“return”,方法的返回值数据类型一定是结果值的具体数据类型
没有返回值---方法体中的没有“return”,方法的返回值数据类型void代替。
(3).方法的名称---合法的标识符【首字母小写,从第二个单词开始首字母大写】
(4.)参数列表
参数----引入本方法以外的数据进入本方法进行运算【找帮手】局部变量
列表----可以有多个
没有参数的时候--()中的内容是空的
(5.)方法体--方法的身体【具体执行代码】
例如:
//--- 没有返回值,没有参数的实例方法
public void test1()
{
}
//---返回值为int,没有参数的实例方法
public int test2()
{
return 12;
}
//---- 没有返回值,有参数1个int型参数的实例方法
public void test3(int a)
{
}
//---返回值为String的,有一个UserBean参数的实例方法。
public String test4(UserBean user)
{
return “hello”;
}
public Student test5(UserBean user,int num,char value)
{
return null;
}
2.静态方法格式
实例方法的访问限制修饰符后面加上static关键字的方法就是静态方法【类方法】, 没有static关键字的方法就是实例方法
例如:
//--- 没有返回值,没有参数的静态方法【类方法】
public static void test1()
{
}
//---返回值为int,没有参数的静态方法【类方法】
public static int test2()
{
return test2;
}
//---- 没有返回值,有参数1个int型参数的静态方法【类方法】
public static void test3(int a)
{
}
//---返回值为String的,有一个UserBean参数的静态方法【类方法】。
public static String test4(UserBean user)
{
return “hello”;
}
public static Student test5(UserBean user,int num,char value)
{
return null;
}
3.构造方法格式
实例方法格式中去掉方法的返回值数据类型,方法的名称是类名这种方法就叫构造方法。
例如:
public class Person{
public Person(){ } --- 无参数的构造方法
public Person(int num){ } --- 有一个int型参数的构造方法
public Person(UserBean user){ } ---有一个UserBean 型参数的构造方法
public Person(UserBean user,int num,char value){}
}
构造方法作用就是将来为了创建对象用的。
当一个类创建好以后,会有一个默认的无参数构造方法存在,只是没有显式写出罢了。
当这个类中出现一个有参数的构造方法时,我们就需要将这个默认的无参数构造方法
显式写出,如果没有显式写出这个默认的无参数构造方法,那么这个默认的无参数构造方法将会被有参数的构造方法覆盖。
public class Student{
//存在一个默认的无参数构造方法
public Student(){}
public Student(String name){}
}
二、什么是方法重载?
在同一个类中方法的名称相同,参数不一样,这种现象就叫方法重载。
注意:(1) 方法重载与方法的返回值类型没有关系
public class UserBean{
public void test1(){}
public int test1(int num){return 0;}
}
(2) 在同一个类方法中方法名称相同参数不同 ---参数不一样---先看个数,后看类型
public class UserBean{
public void test1(int num){}
public int test1(int num1 ,double num2){return 0;} // int double
public int test1(double num2,int num1 ){return 0;} // double int
}
(3)1.实例方法重载 2.静态方法重载 3.构造方法重载 都可以重载
三、同一个Java类中方法与变量的调用关系?
在用一个类中:
1.构造方法中:可以访问实例变量/类变量/局部变量
(1.)构造方法中访问 实例变量: 默认this.实例变量, this可以被省略。
(2.)构造方法中访问 类变量: 默认类名.实例变量, 也可以this.类变量, 类名/this可以被省略
(3.)构造方法中访问 局部变量: 直接变量名称
2.实例方法中:可以访问实例变量/类变量/局部变量
(1.)实例方法中访问 实例变量: 默认this.实例变量, this可以被省略。
(2.)实例方法中访问 类变量: 默认类名.实例变量, 也可以this.类变量, 类名/this可以被省略
(3.)实例方法中访问 局部变量: 直接变量名称
3.静态方法中: 可以访问类变量/局部变量,不可以访问实例变量
(1.)静态方法中访问 类变量: 默认类名.实例变量, 类名可以被省略
(2.)静态方法中不能有this (static是属于类的,this是对象指针)
(3.)静态方法中访问 局部变量: 直接变量名称
public class Person{
public int perid=1001;//实例变量
public static String pername="zhangsan";//类变量
//构造方法中可以访问实例变量/类变量/局部变量
public Person(){
char sex='男'; //局部变量
//构造方法中访问实例变量默认this.实例变量,this可以被省略。
System.out.println("构造方法中-实例变量-perid【默认】=="+this.perid);
System.out.println("构造方法中-实例变量-perid=="+perid);
//构造方法中访问类变量默认类名.实例变量,也可以this.类变量,类名/this可以被省略
System.out.println("构造方法中-类变量-pername【类名】=="+Person.pername);
System.out.println("构造方法中-类变量-pername【this】=="+this.pername);
System.out.println("构造方法中-类变量-pername=="+pername);
//构造方法中访问局部变量直接变量名称
System.out.println("构造方法中-局部变量-sex=="+sex);
}
//实例方法中可以访问实例变量/类变量/局部变量
public void testMehtod1(){
char sex='男'; //局部变量
//实例方法中访问实例变量默认this.实例变量,this可以被省略。
System.out.println("实例方法中-实例变量-perid【默认】=="+this.perid);
System.out.println("实例方法中-实例变量-perid=="+perid);
//实例方法中访问类变量默认类名.实例变量,也可以this.类变量,类名/this可以被省略
System.out.println("实例方法中-类变量-pername【类名】=="+Person.pername);
System.out.println("实例方法中-类变量-pername【this】=="+this.pername);
System.out.println("实例方法中-类变量-pername=="+pername);
//实例方法中访问局部变量直接变量名称
System.out.println("实例方法中-局部变量-sex=="+sex);
}
//静态方法中不可以访问实例变量变量
//静态方法中可以访问类变量/局部变量
public static void testStaticMehtod(){
char sex='男'; //局部变量
//System.out.println("静态方法中-实例变量-perid=="+perid);//错误
//静态方法中访问类变量默认类名.实例变量,类名可以被省略
System.out.println("实例方法中-类变量-pername【类名】=="+Person.pername);
//静态方法中不能有this
//System.out.println("实例方法中-类变量-pername【this=="+this.pername);
System.out.println("静态方法中-类变量-pername=="+pername);
//静态方法中访问局部变量直接变量名称
System.out.println("静态方法中-局部变量-sex=="+sex);
}
}
测试类:
public class TestMain{
public static void main(String args[]){
Person per1=new Person();
per1.testMehtod1();
per1.testStaticMehtod();
}
}
四、同一个Java类中方法与方法的调用关系?
在用一个类中:
1.构造方法中:可以访问其他的 构造方法/实例方法/类方法
(1.)构造方法中访问 其他的构造方法: new 其他的构造方法;
(2.)构造方法中访问 实例方法: 默认this.实例方法,this可以被省略
(3.)构造方法中访问 类方法: 默认类名.类方法,也可以this.类方法,类名/this可以省略
2.实例方法中:可以访问其他的 构造方法/其它实例方法/类方法
(1.)实例方法中访问 构造方法: new 构造方法;
(2.)实例方法中访问 实例方法: 默认this.实例方法,this可以被省略
(3.)实例方法中访问 类方法: 默认类名.类方法, 也可以this.类方法, 类名/this可以省略
3.静态方法中:可以访问 构造方法/其他的静态方法,不可以访问实例方法
(1.)静态方法中访问 构造方法: new 构造方法;
(2.)静态方法中不能有this
(3.)静态方法中访问 类方法: 默认类名.类方法, 类名可以省略
4.为什么静态方法中不可以访问实例元素?
静态方法内存分配时机早于实例元素的内存分配时机,静态方法访问实例元素的时候,实例元素是不存在。
5.为什么静态方法可以访问构造方法?
构造方法是特殊的方法,是类初始化的入口,构造方法不需要实例化对象就能使用
(jvm中有类加载器第一次加载类时构造方法也会随着类一起加载分配内存空间,jvm中的类加载器第一次加载类时会执行类中的static域,jvm会专门划分一个内存区域给static程序块,可称为静态区,属于static这个类而this指针指向的是类的对象,在实例化对象(new)时jvm会在堆区分配内存给一个具体对象,this指针指向的是这个对象,而类中的static域始终是在静态区分配内存 this指向了堆区所以不能调用。)
所以静态方法可以访问构造方法,并且不能使用this。
public class Test6{
//同一个类中,方法与方法的关系
//1.构造方法访问其他的方法
//构造方法可以访问其他的构造方法,new 构造方法
//构造方法可以访问实例方法,默认this.实例方法,this.可以省略
//构造方法可以访问类方法,默认类名.类方法,也可以this.类方法,类名.this.可以省略
public Test6(){
//new Test6("zhangsan");
//this.shiliMethod("lisi");
//shiliMethod("lisi");
//Test6.staticMethod("wangwu");
//this.staticMethod("wangwu");
//staticMethod("wangwu");
}
public Test6(String name){
System.out.println("有参数的构造方法,参数name=="+name);
}
//2.实例方法访问其他的方法
//实例方法可以访问构造方法,new 构造方法
//实例方法可以访问其他实例方法,默认this.实例方法,this.可以省略
//实例方法可以访问类方法,默认类名.类方法,也可以this.类方法,类名.this.可以省略
public void shiliMethod(){
new Test6("zhangsan");
this.shiliMethod("lisi");
shiliMethod("lisi");
Test6.staticMethod("wangwu");
this.staticMethod("wangwu");
staticMethod("wangwu");
}
public void shiliMethod(String name){
System.out.println("有参数的实例方法,参数name=="+name);
}
//3.静态方法访问其他的方法
//静态方法中绝对不能有this
//静态方法可以访问构造方法,new 构造方法
//静态方法不可以访问实例方法
//静态方法可以访问其他类方法,默认类名.类方法,类名.可以省略
public static void staticMethod(){
new Test6("zhangsan");
//错误
//this.shiliMethod("lisi");
//错误
//shiliMethod("lisi");
Test6.staticMethod("wangwu");
//错误
//this.staticMethod("wangwu");
staticMethod("wangwu");
}
public static void staticMethod(String name){
System.out.println("有参数的静态方法,参数name=="+name);
}
}
测试类:
public class TestMain{
public static void main(String args[]){
//测试方法访问方法
//测试构造方法访问其他方法
//new Test6();
//测试实例方法访问其他方法
//Test6 t6=new Test6();
//t6.shiliMethod();
//测试静态方法访问其他方法
Test6 t6=new Test6();
t6.staticMethod();
}
}
总结:
1.类是什么?
类是一种抽象的概念,用来描述具有共同性质的一组事物的自定义符合数据类型
2.成员变量与局部变量的特征?
1.成员变量【全局变量】---类中方法外
(1.)可以使用访问限制修饰符,也可以不使用。
(2.)可以不用赋予初始值,系统自动赋予默认值,也可以根据需要自己设置一个初始值。
(3.)可以在本类中的任意一个方法中被使用
2.局部变量-----方法里/方法参数
(1.)不能使用访问限制修饰符。
(2.)必须设置初始值
(3.)只能在本方法中使用。
3.实例变量与静态成员变量的区别?
都是成员变量,都具有成员变量的特征,
有static关键字修饰的是静态成员变量,没有则是实例变量,
静态成员变量又叫类变量会在程序运行前分配数据内存空间,可以多个同类对象之间共享数据(共用一个内存空间),可以使用对象访问,也可以使用类名访问
实例变量是在程序运行时分配数据内存空间,不能在多个同类对象之间共享数据值(内存空间是独立的),只能使用对象访问
4.成员变量的隐藏?
在同一个类中成员变量与某一个方法中的局部变量的名称相同,这是我们在方法中使用这个成员变量的时候,得到的结果是局部变量的值,此时就是方法中的局部变量将类中成员变量的值隐藏了,这就是成员变量的隐藏。 如果需要访问被隐藏的成员变量的值,怎么办?通过this.成员变量的名称来调用变量
5.同一个类方法如何访问变量?
1.构造方法中:可以访问实例变量/类变量/局部变量
(1.)构造方法中访问 实例变量: 默认this.实例变量, this可以被省略。
(2.)构造方法中访问 类变量: 默认类名.实例变量, 也可以this.类变量, 类名/this可以被省略
(3.)构造方法中访问 局部变量: 直接变量名称
2.实例方法中:可以访问实例变量/类变量/局部变量
(1.)实例方法中访问 实例变量: 默认this.实例变量, this可以被省略。
(2.)实例方法中访问 类变量: 默认类名.实例变量, 也可以this.类变量, 类名/this可以被省略
(3.)实例方法中访问 局部变量: 直接变量名称
3.静态方法中: 可以访问类变量/局部变量,不可以访问实例变量
(1.)静态方法中访问 类变量: 默认类名.实例变量, 类名可以被省略
(2.)静态方法中不能有this (static是属于类的,this是对象指针)
(3.)静态方法中访问 局部变量: 直接变量名称
6.同一个类方法如何访问方法?
1.构造方法中:可以访问其他的 构造方法/实例方法/类方法
(1.)构造方法中访问 其他的构造方法: new 其他的构造方法;
(2.)构造方法中访问 实例方法: 默认this.实例方法,this可以被省略
(3.)构造方法中访问 类方法: 默认类名.类方法,也可以this.类方法,类名/this可以省略
2.实例方法中:可以访问其他的 构造方法/其它实例方法/类方法
(1.)实例方法中访问 构造方法: new 构造方法;
(2.)实例方法中访问 实例方法: 默认this.实例方法,this可以被省略
(3.)实例方法中访问 类方法: 默认类名.类方法, 也可以this.类方法, 类名/this可以省略
3.静态方法中:可以访问 构造方法/其他的静态方法,不可以访问实例方法
(1.)静态方法中访问 构造方法: new 构造方法;
(2.)静态方法中不能有this
(3.)静态方法中访问 类方法: 默认类名.类方法, 类名可以省略
7.方法的重载?
在同一个类中方法的名称相同,参数不一样,这种现象就叫方法重载。
(1) 方法重载与方法的返回值类型没有关系
(2) 在同一个类方法中方法名称相同参数不同 ---参数不一样---先看个数,后看类型
(3)1.实例方法重载 2.静态方法重载 3.构造方法重载 都可以重载