/*
- 一,理解万事万物皆对象
- 1,在java中,我们将功能,结构等封装到类中,通过类的实例化来调用具体的功能结构
- 例如Scanner,String
- 文件路径file,网络地址 URL都是类
- 2,在java语言与前端(html,css,js),后端数据库交互时,前后端的结构在java端交互时,都体现为类,对象。
- 二,匿名对象
- 1,通过new 类名()来创建一个对象,没有显式的赋一个变量名,直接调用方法即为匿名对象
- 2,特征:匿名对象只能调用一次。
- 3,使用:如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象
- 开发中经常将匿名对象作为实参传递给一个方法调用
*/
package com.atguigu.contact;
import java.util.*;
public class Object4 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
new Phone().play();//匿名对象使用必须new一次创建对象,但不必命名
new Phone().call();//匿名对象每次使用都要new一次,所以适合调用一次的情况
new Phone().price = 1699;//
new Phone().showPrice();//因为是新对象所以price还是初始值0.0
//匿名对象的使用
PhoneShop show = new PhoneShop();
show.showPhone(new Phone());//此处相当于将匿名对象的首地址值赋给了showPhone的形参p
//形参p可以在方法内被多次使用,间接实现了匿名对象的多次使用。
//测试自定义int数组工具类
int[] arr = new int[] {23,41,12,-9,0,34,81,4,9,2,77,14,19,45,85};
IntArrayUtil test = new IntArrayUtil();
test.print(arr);
System.out.println(test.search(arr,34));
test.search(arr, 23);
test.sort(arr);
test.print(arr);
test.reverse(arr);
test.print(arr);
test.sort(arr);//要用二分查找排序,首先数组要有序,而且查找的自定义方法设置的是正序
int k = test.binarySearch(arr, 0);
if(k < 0) {
System.out.println("未找到");
}else {
System.out.println("找到目标在数组的角标:" + k);
}
System.out.println("请输入随机数组的长度");
int i = scan.nextInt();
int[] arr1 = new int[i];
test.setRandomValue(arr1);
test.print(arr1);
test.sort(arr1);
test.print(arr1);
}
}
class Phone{
double price = 1999;
public void play(){
System.out.println("使用手机玩游戏");
}
public void call() {
System.out.println("使用手机打电话");
}
public void showPrice() {
System.out.println("手机价格是:" + price);
}
}
class PhoneShop{
public void showPhone(Phone p) {
p.call();
p.play();
p.showPrice();
}
}
//创建自定义数组工具类
class IntArrayUtil{
//求数组最大值
public int maxValue(int[] arr) {
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if(arr[i] >= max) {
max = arr[i];
}
}
return max;
}
//求数组最小值
public int minValue(int[] arr) {
int min = arr[0];
for (int i = 0; i < arr.length; i++) {
if(arr[i] <= min) {
min = arr[i];
}
}
return min;
}
//求数组总和
public int sumValue(int[] arr) {
int sum = arr[0];
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
//求数组平均值
public int averageValue(int[] arr) {
int average;
average = sumValue(arr) / arr.length;
return average;
}
//数组排序
public void sort(int[] array) {
for (int i = 0; i < array.length -1; i++) {
int k = i;
int temp = 0;
for (int j = i; j < array.length; j++) {
if(array[j] < array[k]) {
k = j;//如果找到一个更小的值则K的角标变换为次值的角标,最后k是最小值的角标
}
}
temp = array[i];
array[i] = array[k];
array[k] = temp;//将找到的最小值与本次外层循环的第一个数值交换位置
}
}
//数组反转
public void reverse(int[] arr) {
for (int i = 0; i < arr.length / 2; i++) {
int temp;
temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
}
//数组遍历输出
public void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println("\n");
}
//数组随机赋值,范围0-100
public void setRandomValue(int[] arr) {
for (int i = 0; i < arr.length; i++) {
arr[i] = (int)(Math.random() * 101);
}
}
//数组二分查找
public int binarySearch(int[] arr,int dest) {
int start = 0;
int end = arr.length - 1;
for(;start <= end;) {//或者使用while(start <= end)
int middle = (start + end) / 2;
if(arr[middle] == dest) {
System.out.println(dest + "在数组中的角标是" + middle);
return middle;
}else if(dest < arr[middle]) {
end = middle - 1;//通过改变头尾赋值来不断缩小范围,最终收敛到start=end结束循环
}else if(dest > arr[middle]) {
start = middle + 1;
}
}
return -1;
}
//数组遍历查找,不需要数组先排序
public int search(int[] arr, int dest) {
for (int i = 0; i < arr.length; i++) {
if(arr[i] == dest) {
System.out.println(dest + "目标在数组中的角标是:" + i);
return i;
}
}
return -1;
}
}