Java入门第二章第2节:Java类的方法与对象 实验+图解讲解

简介

👨‍💻个人主页:@云边牧风
👨‍🎓小编介绍:欢迎来到云边牧风破烂的小星球🌝
📋专栏:Java基础知识
🔑本章内容:Java类的方法+对象
记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~

一、类的方法

接着第二章第一节的内容,上一节讲到了类的概念 + 类体的声明 + 类体的内容 + 成员变量和局部变量,这次我们讲类的方法

1、方法的定义:

方法的定义包括两部分:方法声明方法体

例如👇:

void dogBite( String  name )  

{

  System.out.println( name + " ,咬他!" );

}

区分为👉

2、方法的定义格式:

[public | protected | private]

  [static][ final][abstract]

  返回类型  方法名([参数列表]) [throws exceptionList]

  {

  方法体

  }

 其中

方法声明

通常包含: 修饰符 方法类型 方法名 参数
public  static void main ( String[ ] args )
方法类型可以是任意的 Java 类型, void 代表该方法无返回值
参数的类型也可以是任意的 Java 类型

②方法体

通常包含:局部变量定义、 Java 语句

关于Java的修饰符有👇:

  • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

  • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

  • public : 对所有类可见。使用对象:类、接口、变量、方法

  • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

换成图表是这样的:

方法的参数、方法内定义的局部变量
有效范围问题:(在上一节已讲到,这里就当是复习了)

方法参数 在整个方法内有效 ,方法内定义的 局部变量 从它定义的位置之后开始有效
如果 局部变量 的定义是在一个 复合语句 中,那么该局部变量的有效范围是该复合语句;
如果 局部变量 的定义是在一个 循环语句 中,那么该局部变量的有效范围是该循环语句。

例子👇:

void   看门 ( People  p )   {
		String  日志=“”;
		if  ( p.身份 == "小偷")  {
			String  s = "小偷来啦!";
			报警();	 咬他();
			日志 += s;
		}
		if  ( p.身份 == "主人")  {
			日志 += "主人来啦!";
			for  (int  i = 1 ;  i <= 100 ;  i ++)    {
				摇尾巴();
			}
		}
		System.out.println(日志);
		System.out.println(s);
		System.out.println(p.身份);
		System.out.println(i);
}

根据上面的定义可知:

3、方法的重载:

方法的多态性
一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同 ,即:或者是参数的个数不同,或者是参数的类型不同。

例如对

class Area    {  
	float getArea(float r)   { 
			return 3.14f*r*r;
	}
	double getArea(float x,int y)	{
			return x*y;
    }
	float getArea(int y,float x) { 
			return x*y;
    }
	double getArea(float x,float y,float z) { 
			return (x*y+x*z+y*z)*2.0;
     }
}

有👇:

注意:
方法的返回类型和参数的名字不参与比较,即: 即使两个方法类型不同,也必须保证参数不同。 例如:
double  getArea (float x,int y){
  return x*y;
}


float  getArea (float y,int x){
  return x*y;
}

4、构造方法:

一种特殊方法,它的 名字必须与它所在的类的名字完全相同 ,而且 没有类型 ,构造方法也 可以重载
没有类型并不是指返回类型是 void ,其实返回的类型是类本身 

例如👇: 

构造方法用于 创建一个对象
构造方法很“特殊”, 不能被其他方法调用 ;只能在 初始化一个对象 的时候使用
从内存分配上讲,一个对象通过构造方法初始化结束过后,才得到该对象的内存模型(就跟new是一样的操作)
Java 中, 类至少需要一个构造方法
如果类中没有构造方法 ,那么在使用该类创建对象时, JVM 会为该类 自动提供一个无参数的构造方法 ,称为 默认构造方法 。如:
class  Puppy   {
  String  name;
  static  String  voice = "汪汪~~";
}

在Main中:

Puppy  d = new Puppy();

调用了默认构造方法,无参数;实际上,默认构造方法的方法体中无任何代码。

注意👇:

如果类定义了一个或者多个构造方法,那么Java不提供默认的构造方法。例如:

class Lader   {     
  float above,bottom,height;
  Lader(float x,int y,float h) { 
                above=x;      
                bottom=y;            
                height=h;
   }
}

在Main中构造时:

Lader  l1 = new  Lader(0.1100100);

Lader  l2 = new  Lader();    //(l1和l2在一个Main里面同时出现时)

合法:Lader  l1 = new  Lader(0.1100100);

非法:Lader  l2 = new  Lader();

当然:

构造方法中 通常写一些初始化成员变量的赋值语句 ,当然也可以写其他代码。例如:
class  Puppy   {
  String  name = "旺财";
  Puppy()  {
  System.out.println("旺财来也!");
  }
}

在Main中执行

public class Main {
    public static void main(String[] args) {
        Puppy  d = new Puppy();
    }
}

结果为👉:

练习:

定义钟表类 ,在该类中定义构造方法实现对钟表对象的初始化。在创建钟表对象时可以传递时分秒数据进行初始化,也可以不传递任何数据。

代码可以简写为👇: 

class Clock
{
    int s,f,m;  //没有赋值的话,默认的初始化是零
    Clock()
    {
        System.out.println(s+":"+f+":"+m);
    }
    Clock(int x,int y,int z)
    {
        s=x;
        f=y;
        m=z;
        System.out.println(s+":"+f+":"+m);
    }
}
public class Main {
    public static void main(String[] args) {
        Clock p1=new Clock();//不传递的初始化
        Clock p2=new Clock(4,50,10);//传递的初始化
        Clock p3=new Clock(8,30,0);//传递的初始化
    }
}

运行结果为👉:

5、类方法和实例方法:

类中的方法也可分为 实例方法 类方法 :不加关键字 static 的是实例方法;加关键字 static 的是类方法
重复一般!!!有static是类方法,没有static是实例方法
构造方法是特殊的方法 不能 static 修饰构造方法

实例方法既能对类变量操作,也能对实例变量操作 ;而 类方法只能对类变量进行操作

例如:

class  A   {
  int   a ;
  static  int  b;
  void   f()  {
  a = 120;//合法
  b = 210;//合法
  }
  static  void   g()  {
  a = 1;//非法
  b = 2;//合法
  }
}

 即👇:

实例方法可以调用该类中的其他方法 ;而 类方法只能调用该类的类方法 ,不能调用实例方法。

例如👇:

class  A   {       //这是一个类(class),叫A
  static int   a;  //定义了一个类变量(类变量),叫a的一个整型变量
  static  void   g()  {    //定义了一个类方法
  a = 3;
  }
  void   f()  {    //定义了一个实例方法(没有被static修饰的)
  g();   //合法的——实例方法可以调用类(class)中的其他方法(可以理解为所有的)
  }
  static  void   h()  {    //定义了一个类方法(被static修饰了)
  g();    //合法的——类方法可以调用类方法
  f();    //非法的——类方法不可以调用实例方法
  }
}

二、对象

可能大家看到“对象”一词时,不是很容易理解,就算是学过Java的都不一定能理解;这里小编就说一下自己的见解:

前边学过了类(class),而对象就是用class定义出来的量,比如常见的语句 int a :int是类名(整型),而被它定义的a则是它的对象了。

2.0对象的概念

类是创建对象的模板。
当使用一个类创建了一个对象时,我们也说该对象是这个类的一个 实例
在程序中,同一个类可以创建多个对象。

2.1、创建对象

包括对象声明和为对象分配内存两个步骤。

1)对象声明

一般格式为:  类名  对象名;

如:  People  xiaobian;

2)为对象分配内存

使用 new 运算符 和类的 构造方法 为声明的对象分配内存
new 运算符的功能可以理解为:“给我一个新对象”
如果类中没有构造方法,系统会调用默认的构造方法

3)对象的内存模型

例子:西游记人物

class 西游记人物 {  

  float  身高, 体重;

  String  发型, 耳朵,,, 嘴巴;

  void  喊话(String s)     {   

  System.out.println(s);    

  }

}

执行代码:

  西游记人物   猪八戒;       //声明对象 

  猪八戒 = new  西游记人物(); //分配内存,使用了new 运算符和默认构造方法

可以这么理解👇:

首先,声明了一个对象“猪八戒”。

西游记人物   猪八戒;

此时的内存模型如图所示:

然后,实例化对象“猪八戒”。

猪八戒 = new  西游记人物();

此时,JVM会做两件事:

为“西游记人物”类的“发型”等成员变量 分配内存 ;接着 执行构造方法 。如果成员变量没有被初始化,则系统提供默认值。
new 运算符在为成员变量分配内存后,将 返回一个引用 给变量“猪八戒”,即:记录对象的起始地址。

创建多个不同对象
一个类可以通过使用 new 运算符创建多个不同对象, 这些对象将分配不同的内存空间 ,因此, 改变一个对象的成员变量不会影响其他对象的状态
例如:创建两个“西游记人物”类型的对象:
西游记人物   猪八戒 = new  西游记人物 ();
西游记人物   孙悟空 = new  西游记人物 ();

2.2、使用对象

通过使用 运算符“ .” ,对象可以访问自己的 成员变量 或者 调用方法
例如:
class 西游记人物 {  

  float  身高, 体重;

              String  发型, 耳朵,,, 嘴巴;

  void  喊话(String s)     {    System.out.println(s);

  }
}

执行代码:
西游记人物  猪八戒 = new  西游记人物 ();

  猪八戒.发型 = "光头";  //访问成员变量

  猪八戒.喊话(  "俺老猪五百年前是帅哥! ");  //调用方法

}

2.3、对象的引用和实体

用类创建一个对象时,类中的成员变量被分配内存空间,这些内存空间称做该对象的 实体 ,而对象中存放着 引用 (即地址)。
一个类创建的多个对象, 如果具有相同的引用,那么就具有完全相同的实体

例如:类Point:用xy坐标表示的点

class  Point {
  int  x,y;
  Point(int  x,int y) {
  this.x = x;
  this.y = y;
  }
}

执行代码:

Point   p1 = new  Point(1,1);    //①

Point   p2 = new  Point(100,100);    //②

p1 = p2;    //③

执行完①和②之后是这样的:

但执行到③的时候:

其实👉: 

没有实体的对象称作 空对象 空对象不能使用
如果一个实体不再被任何对象所拥有,则变成了“ 内存垃圾 ”;
Java 有“ 垃圾回收 ”机制,周期性的 检测某实体是否已经不再被任何对象所拥有 ,发现则回收内存。
System.gc (); 运行垃圾收集器,立即回收垃圾内存

2.4、参数传值

当方法被调用时,如果方法有参数,参数必须要实例化,即 参数变量必须有具体的值
Java 中,方法的所有参数都是“传值”的 ,也就是说,方法中参数变量的值是调用者指定的值的 拷贝
参数传值的精度转换问题:
对于基本数据类型的参数,向该参数传递
值的精度不可以高于该参数的精度
例如:不可以向 int 型参数传递一个 float 值,但可以向 double 型参数传递一个 float 值。

参数传值对变量的影响:
传递 基本类型 的变量
由于基本类型变量中保存的是“值”,因此在方法体中修改形参的值,不会影响实参的值;
传递 引用类型 的变量
由于引用类型变量中保存的是“地址”,是实参对象实体的首地址。因此在方法体中修改形参所引用的对象实体的值,其实就是修改了实参对象实体的值。

可变参数:
public void f(int … x)
public void g(double a, int … x)
public void method( int … x, int y )//这是不被允许的

例如👇:

public int getSum( int … x) {
	int sum=0;
	for( int i=0;i<x.length;i++)
		sum=sum+x[i];
	return sum;	
}

 可以执行以下的操作:

getSum(1,2,3);
getSum(4,5);
getSum(1,2,3,4,5,6,7,8,9);

for的扩展用法:

public int getSum( int … x) {

  int sum=0;

  for( int  param:x )    //其中param是新定义的变量

  sum = sum + param;

  return sum; 

}

结束语:

以上是Jav第二章的第2节,希望大家喜欢

下一节开始讲关键字、包、访问权限和类的组合

喜欢的可以点赞+关注哈 ❤

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云边牧风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值