首页 > 编程语言 > 详细

Java_内部类&API

时间:2021-03-04 16:43:05      阅读:18      评论:0      收藏:0      [点我收藏+]

1. 参数传递

1.1 类名作为形参和返回值

1、类名作为方法的形参

  方法的形参是类名,其实需要的是该类的对象

  实际传递的是该对象的【地址值】

2、类名作为方法的返回值

  方法的返回值是类名,其实返回的是该类的对象

  实际传递的,也是该对象的【地址值】

示例代码:

class Cat {
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

//操作类
class CatOperator {
    //1.类名作为方法的形参
    //方法的形参是类名,其实需要的是该类的对象
    public void useCat(Cat c) { //Cat c = new Cat();
        c.eat();
    }

    //2.类名作为方法的返回值
    //方法的返回值是类名,其实返回的是该类的对象
    public Cat getCat() {
        Cat c = new Cat();
        return c;
    }
}

public class CatDemo {
    public static void main(String[] args) {
        //创建操作类对象,并调用方法
        CatOperator co = new CatOperator();
        Cat c = new Cat();
        co.useCat(c);

        Cat c2 = co.getCat(); //new Cat()(Cat c2 = new Cat();)
        c2.eat();
    }
}

1.2 抽象类作为形参和返回值

抽象类作为形参和返回值

  方法的形参是抽象类名,其实需要的是该抽象类的子类对象

  方法的返回值是抽象类名,其实返回的是该抽象类的子类对象

示例代码:

public abstract class Animal {
    public abstract void eat();
}
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
public class AnimalOperator {
    //方法的形参是抽象类名,其实需要的是该抽象类的子类对象
    public void useAnimal(Animal a) { //Animal a = new Cat();
        a.eat();
    }

    //方法的返回值是抽象类名,其实返回的是该抽象类的子类对象
    public Animal getAnimal() {
        Animal a = new Cat();
        return a;
    }
}
public class AnimalDemo {
    public static void main(String[] args) {
        //创建操作类对象,并调用方法
        AnimalOperator ao = new AnimalOperator();
        Animal a = new Cat();
        ao.useAnimal(a);

        Animal a2 = ao.getAnimal(); //new Cat()(Animal a2 = new Cat();)
        a2.eat();
    }
}

1.3 接口名作为形参和返回值

接口作为形参和返回值

  方法的形参是接口名,其实需要的是该接口的实现类对象

  方法的返回值是接口名,其实返回的是该接口的实现类对象

示例代码:

public interface Jumping {
    void jump();
}
public class Cat implements Jumping {
    @Override
    public void jump() {
        System.out.println("猫跳高了");
    }
}
public class JumpingOperator {
    public void useJumping(Jumping j) { //Jumping j = new Cat();
        j.jump();
    }

    public Jumping getJumping() {
        Jumping j = new Cat();
        return j;
    }
}
public class JumpingDemo {
    public static void main(String[] args) {
        //创建操作类对象,并调用方法
        JumpingOperator jo = new JumpingOperator();
        Jumping j = new Cat();
        jo.useJumping(j);

        Jumping j2 = jo.getJumping(); //new Cat()(Jumping j2 = new Cat();)
        j2.jump();
    }
}

 

2. 内部类

2.1 内部类的基本使用

内部类概念:

在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类。

/*
    格式:
    class 外部类名 {
        修饰符 class 内部类名 {
            
        }
    }
*/

class Outer {
    public class Inner {
        
    }
}

内部类的访问特点:

  内部类可以直接访问外部类的成员,包括私有

  外部类要访问内部类的成员,必须创建对象

示例代码:

//外部类
public class Outer {
    private int num = 10;

    //内部类
    public class Inner {
        public void show() {
            System.out.println(num);
        }
    }

    public void method() {
        Inner i = new Inner();
        i.show();
    }
}

2.2 成员内部类

成员内部类的定义位置:

  在类中方法,跟成员变量是一个位置

外界创建成员内部类格式:

  格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;

  举例:Outer.Inner oi = new Outer().new Inner();

成员内部类的推荐使用方案:

  将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。

示例代码:

public class Outer {
    private int num = 10;

    /*
    //成员内部类
    public class Inner {
        public void show() {
            System.out.println(num);
        }
    }
    */
    private class Inner {
        public void show() {
            System.out.println(num);
        }
    }

    public void method() {
        Inner i = new Inner();
        i.show();
    }
}
public class InnerDemo {
    public static void main(String[] args) {
        //创建内部类对象,并调用方法
//        Inner i = new Inner(); 错误
//        Outer.Inner oi = new Outer().new Inner(); //内部类是public修饰才可行
//        oi.show();

        Outer o = new Outer();
        o.method();
    }
}

2.3 局部内部类

局部内部类定义位置:

  局部内部类是在方法中定义的类

局部内部类方式方式:

  局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用

  该类可以直接访问外部类的成员,也可以访问方法内的局部变量

示例代码:

public class Outer {
    private int num = 10;

    public void method() {
        int num2 = 20;
        //局部内部类(局部内部类是在方法中定义的类)
        class Inner {
            public void show() {
                //直接访问外部类的成员
                System.out.println(num);
                //访问方法内的局部变量
                System.out.println(num2);
            }
        }
        Inner i = new Inner();
        i.show();
    }
}
public class OuterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}

局部内部类的方法调用也是间接调用,通过外部类对象调用它的成员方法,在这个方法内部,创建局部内部类对象来调用方法。

2.4 匿名内部类

匿名内部类的前提:

  存在一个类或者接口,这里的类可以是具体类也可以是抽象类

匿名内部类的格式:

  格式:new 类名 ( ) { 重写方法 }; 或 new 接口名 ( ) { 重写方法 };

new 类名或接口名() {
    重写方法;
};

例如:
new Inner() {
    public void show() {
    }
};

匿名内部类的本质:

本质:是一个继承了该类或者实现了该接口的子类匿名对象

public class Outer {
    public void method() {
        //匿名内部类本质是一个继承了该类或者实现了该接口的子类匿名对象
        /* 整体可以看做是 Inter的一个实现类对象
        new Inter() {
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        }.show(); //直接调用方法
        */

        //多次调用的话以下方法更好
        Inter i = new Inter() {
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        };
        i.show();
        i.show();
    }
}
public interface Inter {
    void show();
}
public class OuterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}

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

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

  当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去,来简化传统的代码

/*
    跳高接口
 */
public interface Jumping {
    void jump();
}
public class Cat implements Jumping {
    @Override
    public void jump() {
        System.out.println("猫可以跳高了");
    }
}
public class Dog implements Jumping {
    @Override
    public void jump() {
        System.out.println("狗可以跳高了");
    }
}
/*
    接口操作类,里面有一个方法,方法的参数是接口名
    方法的形参是接口名,其实需要的是该接口的实现类对象
 */
public class JumpingOperator {
    public void method(Jumping j) { //new Cat();  new Dog();
        j.jump();
    }
}
public class JumpingDemo {
    public static void main(String[] args) {
        //创建接口操作类的对象,调用method方法
        JumpingOperator jo = new JumpingOperator();
        Jumping j = new Cat();
        jo.method(j);

        Jumping j2 = new Dog();
        jo.method(j2);
        System.out.println("---------");

        //匿名内部类的简化,即使没有Cat类,下面的语句也可以执行
        jo.method(new Jumping() {
            @Override
            public void jump() {
                System.out.println("猫可以跳高了");
            }
        });

        //匿名内部类的简化
        jo.method(new Jumping() {
            @Override
            public void jump() {
                System.out.println("狗可以跳高了");
            }
        });

        jo.method(new Jumping() {
            @Override
            public void jump() {
                System.out.println("猪可以跳高了");
            }
        });
    }
}

 

3. 常用API 

3.1 Math

1、Math类概述:

  Math 包含执行基本数字运算的方法

2、Math中方法的调用方式:

  Math类中无构造方法,但内部的方法都是静态的,则可以通过 类名.进行调用

3、Math类的常用方法:

public static int abs(int a):返回参数的绝对值

public static double ceil(double a):返回大于或等于参数的最小double值,等于一个整数

public static double ?oor(double a) :返回小于或等于参数的最大double值,等于一个整数

public static int round(?oat a) :按照四舍五入返回最接近参数的int

public static int max(int a,int b):返回两个int值中的较大值

public static int min(int a,int b) :返回两个int值中的较小值

public static double pow(double a,double b):返回a的b次幂的值

public static double random():返回值为double的正值,[0.0,1.0)

示例代码:

/*
    Math类中的常用方法
 */
public class MathDemo {
    public static void main(String[] args) {
        //public static int abs(int a):返回参数的绝对值
        System.out.println(88); //88
        System.out.println(-88); //88
        System.out.println("--------");

        //public static double ceil(double a):返回大于或等于参数的最小double值,等于一个整数
        System.out.println(Math.ceil(12.34)); //13.0
        System.out.println(Math.ceil(12.56)); //13.0
        System.out.println("--------");

        //public static double ?oor(double a):返回小于或等于参数的最大double值,等于一个整数
        System.out.println(Math.floor(12.34)); //12.0
        System.out.println(Math.floor(12.56)); //12.0
        System.out.println("--------");

        //public static int round(?oat a):按照四舍五入返回最接近参数的int
        System.out.println(Math.round(12.34F)); //12.0
        System.out.println(Math.round(12.56F)); //13.0
        System.out.println("--------");

        //public static int max(int a,int b):返回两个int值中的较大值
        System.out.println(Math.max(66, 88)); //88
        System.out.println("--------");

        //public static int min(int a,int b):返回两个int值中的较小值
        System.out.println(Math.min(66, 88)); //66
        System.out.println("--------");

        //public static double pow(double a,double b):返回a的b次幂的值
        System.out.println(Math.pow(2.0, 3.0)); //8.0
        System.out.println("--------");

        //public static double random():返回值为double的正值,[0.0,1.0)
        System.out.println(Math.random());
        System.out.println(Math.random() * 100);
        System.out.println((int) (Math.random() * 100) + 1); // [1,100]
    }
}

3.2 System

System 包含几个有用的类字段和方法,它不能被实例化。

System类的常用方法 :

public static void exit(int status):终止当前运行的Java虚拟机,非零表示异常终止

public static long currentTimeMillis():返回当前时间(以毫秒为单位)

示例代码:

需求:在控制台输出1-10000,计算这段代码执行了多少毫秒 

public class SystemDemo01 {
    public static void main(String[] args) {
        System.out.println("开始");
        //public static void exit(int status):终止当前运行的Java虚拟机,非零表示异常终止
        System.exit(0);
        System.out.println("结束");  //不会运行
    }
}
public class SystemDemo {
    public static void main(String[] args) {
        //public static long currentTimeMillis():返回当前时间(以毫秒为单位)
        //获取开始的时间节点
        long start = System.currentTimeMillis();
        for (int i = 1; i <= 10000; i++) {
            System.out.println(i);
        }
        //获取代码运行结果后的时间节点
        long end = System.currentTimeMillis();
        System.out.println("共耗时:" + (end - start) + "毫秒");
    }
}

3.3 Object类的toString方法

public String toString():返回对象的字符串表示形式。建议所有子类重写该方法,自动生成。

Object类概述:

  Object 是类层次结构的根,每个类都可以将 Object 作为超类。所有类都直接或者间接的继承自该类, 换句话说,该类所具备的方法,所有类都会有一份。

  构造方法:public Object()

回想面向对象中,为什么说子类的构造方法默认访问的是父类的无参构造方法?

  因为它们的顶级父类只有无参构造方法

查看方法源码的方式:

  选中方法,按下Ctrl + B 

重写toString方法的方式:

  1. Alt + Insert 选择toString

  2. 在类的空白区域,右键 -> Generate -> 选择toString 

toString方法的作用:

  以良好的格式,更方便的展示对象中的属性值

示例代码:

package day12.API_Object;

public class Student extends Object {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ‘}‘;
    }
}
package day12.API_Object;

/*
    Object 是类层次结构的根,每个类都可以将 Object 作为超类。
    所有类都直接或者间接的继承自该类

    查看方法源码的方式:选中方法,按下Ctrl + B

    建议所有子类重写此方法(toString()方法)
    重写方式:自动生成即可
 */
public class ObjectDemo {
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("张三");
        s.setAge(18);
        System.out.println(s); //重写前,输出:day12.API_Object.Student@7f63425a
        //重写toString()方法后,输出:Student{name=‘张三‘, age=18}

        System.out.println(s.toString()); //day12.API_Object.Student@7f63425a
        //重写toString()方法后,输出:Student{name=‘张三‘, age=18}

        /*
            public void println(Object x) { //x = s;
            String s = String.valueOf(x);
            synchronized (this) {
                print(s);
                newLine();
            }
        }

            public static String valueOf(Object obj) { //obj = x;
            return (obj == null) ? "null" : obj.toString();
        }

            public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
         */
    }
}

3.4 Object类的equals方法

public boolean equals(Object obj):比较对象是否相等。默认比较地址,重写可以比较内容,自动生成。

equals方法的作用:

  用于对象之间的比较,返回true和false的结果

  举例:s1.equals(s2);  (s1和s2是两个对象)

重写equals方法的场景:

  不希望比较对象的地址值,想要结合对象属性进行比较的时候。

重写equals方法的方式:

  1. alt + insert 选择equals() and hashCode(),IntelliJ Default,一路next,?nish即可

  2. 在类的空白区域,右键 -> Generate -> 选择equals() and hashCode(),后面同上。

 

示例代码:

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        //比较地址是否相同,如果相同,直接返回true
        /*
            this --- s1
            o --- s2
         */
        if (this == o) return true;

        //判断参数是否为null
        //判断两个对象是否来自同一个类
        if (o == null || getClass() != o.getClass()) return false;

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

        //比较年龄是否相同
        if (age != student.age) return false;

        //比较姓名内容是否相同
        return name != null ? name.equals(student.name) : student.name == null;
    }
}
/*
    重写equals方法的场景
    不希望比较对象的地址值,想要结合对象属性进行比较的时候。
 */
public class ObjectDemo_2 {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("李四");
        s1.setAge(28);

        Student s2 = new Student();
        s2.setName("李四");
        s2.setAge(28);

        //需求:比较两个对象的内容是否相等
//        System.out.println(s1 == s2); //false (s1,s2 分别代表两个地址值,比较的不是内容)

        System.out.println(s1.equals(s2)); //false  //重写equals()方法后输出为:true
        /*
            public boolean equals(Object obj) {
            //this --- s1
            //obj --- s2
            return (this == obj); //比较的是this和obj的地址值即还是比较的s1和s2的地址值
        }

         */
    }
}

3.5 冒泡排序原理

冒泡排序概述:

  一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序。

如果有n个数据进行排序,总共需要比较n-1次

每一次比较完毕,下一次的比较就会少一个数据参与

3.6 冒泡排序代码实现

代码示例:

public class ArrayDemo {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {24, 69, 80, 57, 13};
        System.out.println("排序前:" + arrayToString(arr));

        //这里减1,是控制每轮比较的次数
        for (int x = 0; x < arr.length - 1; x++) {
            //-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("排序后:" + 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;
    }
}

3.7 Arrays

Arrays的常用方法:

public static String toString(int[] a):返回指定数组的内容的字符串表示形式

public static void sort(int[] a):按照数字顺序排列指定的数组

import java.util.Arrays;

public class ArraysDemo {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {24, 69, 80, 57, 13};

        //public static String toString(int[] a):返回指定数组的内容的字符串表示形式
        System.out.println("排序前:" + Arrays.toString(arr));

        //public static void sort(int[] a):按照数字顺序排列指定的数组
        Arrays.sort(arr);
        System.out.println("排序后:" + Arrays.toString(arr));
    }
}

工具类设计思想:

  1、构造方法用 private 修饰

  2、成员用 public static 修饰

 

Java_内部类&API

原文:https://www.cnblogs.com/may3/p/14477842.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!