Java-进阶-day03-内部类

Java-进阶-day03-内部类

  • 参数传递(重点掌握)
  • 内部类(理解)
  • 工具类
  • 数组排序

一、参数传递

类名作为形参和返回值

总结:
	* 类名作为方法的形参传递的是什么?
		传递的是地址值

	* 类名作为方法的返回值返回的是什么?
		返回的是该对象的地址值

	总结:
		类名作为方法的返回值和参数,要的是该类型的对象

案例代码:


public class Test {
    public static void main(String[] args) {
        Student stu = new Student("张三", 13);
        System.out.println(stu);
        useStudent(stu);

        System.out.println("~~~~~~~~~~~~~~~~~~~");
        Student student = getStudent();
        System.out.println(student);
        student.show();
    }


    /**
            类名作为方法的返回值和参数,要的是该类型的对象
     */
    public static void useStudent(Student student) {
        System.out.println(student);
        student.show();
    }

    public static Student getStudent() {
    //     创建学生并返回
        Student stu = new Student("李四", 14);
        System.out.println(stu);
        return stu;
    }
}

抽象类作为形参和返回值

总结:
	* 抽象类作为方法的形参传递的是什么?
	   抽象类的子类对象 --> 地址值

	* 抽象类作为方法的返回值返回的是什么?
		返回的是抽象类子类对象 --> 地址值

接口名作为形参和返回值

总结:
	* 接口作为方法的形参传递的是什么?
	    接口的实现类的对象  

	* 接口作为方法的返回值返回的是什么?
		返回的是该接口的实现类的对象

二、内部类

内部类的概念与分类

  • 什么是内部类?
  • 内部类有哪些分类?
总结:
	1.什么是内部类?
		类中有类 

		描述一个事物的时候,发现另外一个事物随之存在的, 这个事物称之为内部类
		内部类所在类,称之为外部类


	2.内部类的分类?
		静态内部类
		成员内部类
		局部内部类
		匿名内部类

	内部类与外部类之间的关系: 包含的关系

成员内部类的定义

  • 如何定义成员内部类?
  • 创建成员内部类对象的格式为?
总结:
	* 格式

		public class 外部类{

			修饰符 class 内部类{

			}
		}


		
	* 创建成员内部类对象的格式 
		* 间接调用   
		  	在外部类成员的位置 ,定义 一个方法,在方法内部创建内部类的对象
       	* 直接调用
       		* 普通成员内部类
       			外部类.内部类 内部类的对象 = new 外部类() . new 内部类();
       		* 静态内部类
       			 外部类.内部类 内部类的对象 = new 外部类.内部类();

局部内部类定义

  • 局部内部类的定义位置为?
  • 如何使用局部内部类?
总结:

	* 局部内部类的定义位置
		在外部类的方法内定义了一个类

	* 如何使用局部内部类
		只能在该方法内使用内部类

匿名内部类

  • 什么是匿名内部类?
  • 匿名内部类的格式是什么?
总结:

	1.什么是匿名内部类?
	  存在于方法内的没有名字的一个类

	2.匿名内部类的格式是什么?
		new 抽象类/接口(){
			重写抽象类和接口中所有的抽象方法
		}.方法名();

	  匿名对象: 没有名字的对象就是匿名对象
	  Student stu = new Student();  有名字的对象,名字是stu
	  new Student(); 没有名字的对象  匿名对象

		抽象类/接口名 对象名 = new 抽象类/接口(){
			重写抽象类和接口中所有的抽象方法
		};

		对象名.方法名();

案例代码:

Inter接口

public interface Inter {
	void eat();
}

AnonymousDemo类(测试类)

public class AnonymousDemo {

	public static void main(String[] args) {

		//有名字的匿名内部类对象
		Inter inter = new Inter() {
			@Override
			public void eat() {
				System.out.println("eating...");
			}
		};

		//使用匿名内部类对象的对象名调用方法
		inter.eat();
		System.out.println("---------");

		//匿名的匿名内部类对象直接调用自己的方法
		new Inter(){
			@Override
			public void eat() {
				System.out.println("eat");
			}
		}.eat();

		useInter(new Inter() {
			@Override
			public void eat() {
				System.out.println("匿名内部类对象作为参数传递");
			}
		});

		useInter(getInter());

	}

	public static void useInter(Inter inter) {
		//匿名内部类对象作为参数传递
		inter.eat();
	}

	public static Inter getInter() {
		//返回值为匿名内部类对象
		return new Inter() {
			@Override
			public void eat() {
				System.out.println("返回值为匿名内部类对象");
			}
		};
	}
}

匿名内部类在开发中的使用

 * 案例演示:
	一般都是在方法传递的时候,来进行使用

三、工具类

数学工具类Math

* 方法摘要
	>* public static double abs(double num): 取绝对值  | |
	>* public static double ceil(double num): 向上取整  
	>* public static double floor(double num):向下取整
	>* public static long round(double num): 四舍五入 
	>* public static int max(int a, int b) : 求最大值
	>* public static int min(int a, int b) : 求最小值
	>* public static double pow(double a, double b): Math.pow(2,3);
	>* public static double random()  : 随机的范围[0,1)  new Random
	>* Math.PI  -> 圆周率

System类

* System类的常用方法 
	>* public static void exit(int status):终止当前运行的Java虚拟机非零表示异常终止
	>* public static long currentTimeMillis():返回当前时间(以毫秒为单位)

Object类

  • 什么是Object类?
  • Object中常用的两个方法?
总结:

	1.什么是Object类?
		类 Object 是类层次结构的根类。
		每个类都使用 Object 作为超类。
		所有对象(包括数组)都实现这个类的方法。
	2.Object中常用的两个方法
		toString();
		equals();

Object类之toString方法

  • Object类中的toString方法返回的是什么?
总结:
	1. Object类中的toString方法返回的是什么?
		* 如果重写了toString方法
			打印的是对象中的属性的值,而不是地址值
		* 如果没有重写toString方法
		    地址值
			
		问题: toString方法的作用?
			方便打印对象中的属性的值

Object类之 equals 方法

  • equals方法的作用?
  • equals方法跟==号的区别?
总结:
	1.equals方法的作用
		比较两个对象的地址值
	  
	2.equals方法和==的区别
		* == 
			如果比较的是基本数据类型  比较的是具体的数值是否相等
			如果比较的是引用数据类型  比较的是地址值是否相等
			
		* equals
			* 如果没有重写Object中的equalse方法
				比较的是两个对象的地址值
			* 如果重写了Object中的equalse方法
				按照自己的比较规则进行比较两个对象中的内容


		* equals重写后的代码:
			public boolean equals(Object o) {

		        /*
		          自己跟自己比较 有意义吗? 没有
		          如果是自己跟自己比较,直接返回true
		         */

		        if (this == o) return true;

		        /*
		           o == null : 空值 ,调用方法会出现空指针异常
		           getClass() != o.getClass() : 比较的对象 是否是来自于同一个类的
		           getClass 方法获取一个类的字节码对象的 Class
		         */
		        if (o == null || getClass() != o.getClass()) return false;


		        // 多态向下转型
		        Student student = (Student) o;

		        if (this.age != student.age) return false;
		        return name != null ? name.equals(student.name) : student.name == null;
		    }

冒泡排序:


/*
    冒泡排序:
        一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,
        依次对所有的数据进行操作,直至所有数据按要求完成排序
 */
public class ArrayDemo {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {24, 69, 80, 57, 13};
        System.out.println("排序前:" + arrayToString(arr));

        /*
        //第一次比较
        for(int i=0; i arr[i+1]) {
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        System.out.println("第一次比较后:" + arrayToString(arr));

        //第二次比较
        for(int i=0; i arr[i+1]) {
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        System.out.println("第二次比较后:" + arrayToString(arr));

        //第三次比较
        for(int i=0; i arr[i+1]) {
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        System.out.println("第三次比较后:" + arrayToString(arr));

        //第四次比较
        for(int i=0; i arr[i+1]) {
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        System.out.println("第四次比较后:" + arrayToString(arr));
        */


        // 外层循环控制的是 比较多少次
        for(int x=0; x<arr.length-1; x++) {
            // 内层循环 每一次跟谁比较
            for(int i=0; i<arr.length-1-x; i++) {
                if(arr[i] > arr[i+1]) {
                    int temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                }
            }
        }

        System.out.println(Arrays.toString(arr));

        // System.out.println("排序后:" + arrayToString(arr));

    }

    //把数组中的元素按照指定的规则组成一个字符串:[元素1, 元素2, ...]
    public static String arrayToString(int[] arr) {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                sb.append(arr[i]);
            } else {
                sb.append(arr[i]).append(", ");
            }
        }
        sb.append("]");
        String s = sb.toString();
        return s;
    }
}
ublic static String arrayToString(int[] arr) {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                sb.append(arr[i]);
            } else {
                sb.append(arr[i]).append(", ");
            }
        }
        sb.append("]");
        String s = sb.toString();
        return s;
    }
}

你可能感兴趣的:(Java进阶)