栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 面向对象 第二天

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 面向对象 第二天

一,怎样理解万事万物皆对象

1,在Java语言范畴中,我们都将功能、结构封装到类中,通过类的实例化,来调用具体的功能结构 ;2,涉及到Java语言与前端HTMl、后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。 匿名对象的使用

package com.atguigu.java;
public class InstanceTest {
	public static void main(String[] args) {
		Phone p=new Phone();
		System.out.println(p);  //com.atguigu.java.Phone@15db9742 ---是一个地址值
		p.sendEmail();
		p.playGame();
		
		new Phone().price=1999;   
		new Phone().showPrice();  //double型price默认初始化值为0.0(一个新的Phone对象)		
		System.out.println("**********");
		//想要调用show()方法,则需要造一个方法所在类的对象
		PhoneMall mall=new PhoneMall();
		//匿名对象的常用情景
		mall.show(new Phone());  //相当于把这个匿名的对象赋给了形参phone
	}
}

class PhoneMall{
	public void show(Phone phone){  //Phone型的形参phone
		phone.sendEmail();
		phone.playGame();
	}
}
class Phone{
	double price;
	public void sendEmail(){
		System.out.println("发送邮件");
	}
	public void playGame(){
		System.out.println("玩游戏");
	}
	public void showPrice(){
		System.out.println("手机价格为:"+price);
	}
}

数组工具类的封装(分成两个文件演示)

①ArrayUtil.java:

package com.atguigu.java;

public class ArrayUtil {
	//求最大最小平均总和,需要知道求谁的,所以都要有形参
	//求数组的最大值
	public int getMax(int[] arr){
		int maxValue=arr[0];
		for(int i=0;iarr[i]){
				minValue=arr[i];
			}
		}
		return minValue;
	}
	//求数组的总和
	public int getSum(int[] arr){
		int sum=0;
		for(int i=0;iarr[j+1]){
					 int temp=arr[j];
					 arr[j]=arr[j+1];
					 arr[j+1]=temp;
				}
			}
		}
	}
	
	//遍历数组
	public void print(int[] arr){
		for(int i=0;i 

测试–ArrayUtilTest.java:

package com.atguigu.java;

public class ArrayUtilTset {
	public static void main(String[] args) {
		ArrayUtil util=new ArrayUtil();
		int[] arr=new int[]{32,34,32,5,3,54,654,-98,0,-53,5};
		int max=util.getMax(arr);
		System.out.println("最大值为:"+max);
		
		int min=util.getMin(arr);
		System.out.println("最小值为:"+min);
		
		int sum=util.getSum(arr);
		System.out.println("总和为:"+sum);
		
		int avg=util.getAvg(arr);
		System.out.println("平均值为:"+avg);
		//排序
		System.out.println("排序前:");
		util.print(arr); //遍历排序前
		System.out.println(); //换行比较
		util.sort(arr); //排下序
		System.out.println("排序后:");
		util.print(arr); //遍历排序后
		//查找
		System.out.println("查找");
		int index = util.getIndex(arr, 5);  
		if(index>=0){
			System.out.println("找到了,索引地址为:"+index);  //4找到的是经过上面排序操作后的索引值
		}else{
			System.out.println("找不到");
		}
	}
}

方法的重载(overload)

重载的概念:
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。

简而言之,满足“两同一不同” 即为重载。
两同:同一个类,同一个方法名
一不同:参数列表不同(包括参数个数不同,参数类型不同)

如下图,Arrays类中重载的多个binarySearch()方法、sort()方法:


如我们写的ArrayUtil提供了很多功能操作(反转、复制),但只能对int型数组进行。若对String型则需要进行方法的重载。
如下:我们对ArrayUtil中数组的反转操作进行方法的重载:
则以上两个同名方法构成了重载。

此时,当我们在ArrayUtilTest.java中通过util对象调用reverse()方法时会出现选择提示,我们根据参数进行选择:

package com.atguigu.java1;
public class OverLoadTest {
	public static void main(String[] args) {
	}
	//如下的4个方法构成了重载
	public void getSum(int i,int j){
		System.out.println("1");
	}
	public void getSum(double d1,double d2){
		System.out.println("2");
	}
	public void getSum(String s,int i){		
		System.out.println("3");
	}
	public void getSum(int i,String s){		
		System.out.println("4");
	}
	//判断是否构成重载:严格按照 "两同一不同" ,跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系
//	public int getSum(int i,int j){ //不构成重载,因为不满足“两同一不同”和上面第一个参数列表相同
//		return 0;
//	}
//	public void getSum(int m,int n){ //不构成重载,参数列表和第一个相同。只是参数名和第一个参数列表里的参数名不同,认为不满足“参数列表不同”
//	}
//	private void getSum(int i,int j){  //不构成重载,不满足 "两同一不同"	
//	}
}

严格按照 “两同一不同”

练习

package com.atguigu.exer;

public class OverloadExer {
	public static void main(String[] args) {
		OverloadExer test =new OverloadExer();
		test.mOL(5);
		test.mOL(5, 6);
		test.mOL("dingdingdang");
	}
	//如下三个方法构成重载
	public void mOL(int i){
		System.out.println(i*i);
	}
	public void mOL(int i,int j){
		System.out.println(i*j);
	}
	public void mOL(String s){
		System.out.println(s);
	}
	
}


package com.atguigu.exer;

public class OverloadExer {
	public static void main(String[] args) {
		OverloadExer test =new OverloadExer();
		int value1=test.max(3, 7);
		System.out.println(value1);
		double value2=test.max(10.6, 5.2);
		System.out.println(value2);
		double value3=test.max(0.03, 0.05, 1.15);
		System.out.println(value3);
	}
	//如下三个方法构成重载
	public int max(int i,int j){
		return (i>j)?i:j;    //一步到位,若用if语句太繁琐
	}
	
	public double max(double d1,double d2){
		return (d1>d2)?d1:d2;    //一步到位,若用if语句太繁琐
	}
	public double max(double d1,double d2,double d3){
		double max=(d1>d2)?d1:d2;    //一步到位,若用if语句太繁琐
		return (max>d3)?max:d3;
	}
	
}

可变个数的形参(jdk5.0新增内容)

JavaSE 5.0 中提供了Varargs(variable number of arguments)机制, 允许直接定义能和多个实参相匹配的形参 。从而,可以用一种更简单的方式,来传递个数可变的实参。

package com.atguigu.java1;

public class MethodArgsTest {
	public static void main(String[] args) {
		MethodArgsTest test=new MethodArgsTest();
		test.show(12);
		test.show("hello");  //输出show(string)
		System.out.println("******");
		test.show("hello","world");
		test.show("hello","world","didida");
	}
	public void show(int i){
		System.out.println(i);
	}
	public void show(String s){
		System.out.println("show(string)");  
	}
	public void show(String ... strs){  //此即为可变个数的形参(直接定义能和多个实参相匹配的形参 ),填几个都行,可以识别
		System.out.println("show(string...strs)");
		//遍历,实际认为它是一个数组
		for(int i=0;i 

注意:
①jdk 5.0 认为public void show(String[] strs){}与public void show(String … strs){}无区别,所以二者不能构成重载。
即:可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载(二者不能共存)。

②可变个数的形参在方法的形参中,必须声明在末尾,且最多只能声明一个可变形参(可变个数形参不知道要匹配多少个,所以不可以在前面声明,只能放最后且也因此只能声明一个)。
eg:public void show( int i ,String …arrs){ } -----正确书写格式

方法参数的值传递机制

首先我们知道:
关于对象的赋值机制:
如果变量是基本数据类型,此时赋的值是变量所保存的数据值;
如果变量是引用数据类型,此时赋的值是变量所保存的数据的地址值。


类似于对象的赋值,方法参数的值传递机制如下:
如果参数是基本数据类型,此时实参赋给形参的是实参中真实存储的数据值;
如果参数是引用数据类型,此时实参赋给形参的是实际存储数据的地址值。

分析问题:

package com.atguigu.java1;

public class ValueTransferTest1 {
	public static void main(String[] args) {
		int m=10;
		int n=20;
		System.out.println("m="+m+",n="+n);
		ValueTransferTest1 test=new ValueTransferTest1();
		test.swap(m, n);	
		System.out.println("m="+m+",n="+n);
	}
	public void swap(int m,int n){
		int temp=m;
		m=n;
		n=temp;
	} 
}

我们发现并没有显示m和n交换成功。原因如下:
再如:

运行ArrayUtilTest.java发现排序无效:
原因:

上述定义临时变量写法确实交换了arr[j]和arr[j+1]。但通过 swap(arr[j],arr[j+1]); 若调用如下swap()方法,实际上只是把两个实参arr[j]和arr[j+1]传给了i和j,只交换了i和j的值,arr[j]和arr[j+1]还是原来的值。
所以说:如果参数是基本数据类型,此时实参赋给形参的是实参中真实存储的数据值。

想实现交换效果可以传入引用数据类型
对ArrayUtil进行修改:

排序成功

相关解释:

package com.atguigu.java1;

public class ValueTransferTest2 {
	public static void main(String[] args) {
		Data data =new Data();
		data.m=10;
		data.n=20;
		System.out.println("m="+data.m+",n="+data.n); 
		ValueTransferTest2 test=new ValueTransferTest2();
		test.swap(data);
		System.out.println("m="+data.m+",n="+data.n);  
	}
	public void swap(Data data){  //此处的形参为引用数据类型,名为data的Data型数据
		//交换m、n值
		int temp=data.m;
		data.m=data.n;
		data.n=temp;
	}

}
class Data{
	int m;
	int n;
	
}

所以说:如果参数是引用数据类型,此时实参赋给形参的是实际存储数据的地址值

练习:
最后输出的是:

本题内存解析:

做貌似简单的题目(擦亮眼睛):


若用此法,我们会发现,第一位元素除了12后变为1,其余元素除以1,原样输出。


正确写法(一):
倒着除,巧妙解决问题。


正确写法(二):
额外开辟空间temp。


练习:

package com.atguigu.exer;

public class Circle {
	double radius; //半径
	//求圆的面积
	public double findArea(){
		return  Math.PI*radius*radius;
	}
}

package com.atguigu.exer;

public class PassObject {
	public static void main(String[] args) {
		PassObject test=new PassObject();
		Circle c=new Circle();
		test.printAreas(c, 5);
		System.out.println("Now radius is:"+c.radius);
	}

	public void printAreas(Circle c, int time){
		System.out.println("RadiusttArea");
		//设置圆的半径
		for(int i=1;i<=time;i++){
			c.radius=i;
			System.out.println(c.radius+"tt"+c.findArea());
		}
		c.radius=time+1;
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/770515.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号