黑马Java第十二讲笔记—内部类

198 阅读8分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天, 点击查看活动详情

🎨 个人介绍

👉大家好,我是:旺仔不是程序员

👉认真分享技术,记录学习过程的点滴,如果我的分享能为你带来帮助,请支持我奥🍻

👉你的支持,是我每天更新的动力。

👉赞点:👍 留言:✍ 收藏:⭐

👉个人格言:想法一步一步的落实,才是你我前进最佳选择。

1. 参数传递

1.1 类名作为形参和返回值

1 )类名作为方法的形参

  1. 方法的形参是类名,其实需要是该类的对象
  2. 实际传递的是该类对象的地址值

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

  1. 方法的返回值是类名,其实返回的是该类的对象
  2. 实际传递的也是该类对象的地址值

3 )代码实例

class Cat {
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
​
class CatOperator {
    public void useCat(Cat c) {
        c.eat();
    }
    
    public Cat getCat() {
        Cat c = new Cat();
        return c;
    }
}
​
public class CatDemo {
    // 创建类对象并调用该方法
    CatOprator co = new CatOprator();
    Cat c = new Cat();
    
    co.useCat(c);
    
    Cat c2 = new co.getCat();
    c2.eat();
}

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

1 )抽象类作为形参和返回值

  1. 方法的形参是抽象类名,其实需要的是给抽象类的子类对象
  2. 方法的返回值是抽象类名,其实返回的是该类的子类对象

2 )代码实例

abstract class Animal {
    public abstract Animal{
        @Override
        public void eat() {
            System.out.println("猫吃鱼");
        }
    }
}
​
class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
​
class AnimalOperator {
    public void useAnimal(Animal a) {
        a.eat();
    }
    
    public Animal getAnimal() {
        Animal a = new Cat();
        return a;
    }
}
​
public class AniamlDemo {
    public static void main(String[] args) {
        //创建操作对象,并调用方法
        AnimalOPrator ao = new AnimalOperator();
        Animal a = new Cat();
        ao.useAnimal(a);
        
        Animal a2 = ao.getAnimal();
        a2.eat();
    }
}

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

1 )接口作为类型和返回值

  1. 方法的形参是接口名,其实需要的是给接口的实现对象
  2. 方法的返回值是接口名,其实返回的是该接口的实现类对象

2 )代码实例

interface Jumpping {
    void jump();
}
​
class JumppingOperator {
    public void useJumpping (Jumpping  j) {
        j.jump();
    }
    
    public Jumpping getJumpping () {
        Jumpping j = new Cat();
        return j;
    }
}
class Cat implements Jumpping {
    @Override
    public void jump() {
        System.out.println("猫可以跳高了");
    }
}
​
public class JumppingDemo {
    public static void main(String[] args[]) {
        // 创建操作类对象,并调用方法
        JumppingOperator jo = new JumppingOperator();
        Jumpping j = new Cat();
        jo.useJumppig(j);
        
        Jumpping j2 = jo.getJumpping();
        j2.jump();
    }
}

2. 内部类

2.1 内部类的基本使用

1 )内部类概念

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

2 )内部类定义格式

  1. 格式:

    • class 外部类名 {
          修饰符 class 内部类名{
              
          }
      }
      
  2. 举例

    • class Outer {
          public class Inner{
              
          }
      }
      

3 )内部类的访问特点

  1. 内部类可以直接访问外部类的成员,包括私有
  2. 外部类要访问内部类的成员,必须创建对象

4 )代码实例

public class Outer {
    private int num = 10;
    public class Inner {
        public void show() {
            System.out.println(num);
        }
    }
    public void method() {
        Inter i = new Inner();
        i.show();
    }
}

2.2 成员内部类

1 )成员内部类的定义位置

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

2 )外界创建成员内部类格式

  1. 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
  2. 举例:Outer.Inner oi = new Outer.new Inner();

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

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

4 )实例代码

class Outer {
    private int num =10;
    private class Inner {
        public void show() {
             System.out.println(num);
        }
    }
    
    public void InnerDemo {
        public static void main(String[] args) {
            Outer>Inner oi = new Outer.new Inner(); 
            oi.show();
            
            Outer 0 = new Outer();
            o.method();
        }
    }
}

2.3 局部内部类

1 )局部内部类定义位置

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

2 )局部内部类方式

  1. 局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用
  2. 该类可以直接访问外部类的成员,也可以访问方法内的局部变量(即,在方法内定义类)

3 )代码实例

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 OutderDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}

2.4 匿名内部类

1 )匿名内部类的前提

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

2 )匿名内部类的格式

  1. 格式:new 类名() {重写方法} new 接口名() {重写方法}
  2. 举例:
new Inter() {
    @Override
    public void method() {}
}

3 )匿名内部类的本质

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

4 )匿名内部类的细节

  1. 匿名内部类可以通过多态的形式接受
Inter i = new Inter() {
    @Override
    public void method() {
        
    }
}
  1. 匿名内部类直接调用方法
interface Inter{
    void method();
}

class Test{
    public static void main(String[] args) {
        new Inter() {
            @Override
            public void method() {
                System.out.println("我是匿名内部类");
            }
        }
    }.method();
}

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

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

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

2 )实例代码

interface Jumpping{
    void jump();
}

class Cat implements Jumpping {
    @Override
    public void jump() {
        System.out.println("猫可以跳高了");
    }
}
class Dog implements Jumpping {
    @Override
    public void jump() {
        System.out.println("狗可以跳高了");
    }
}

class JumppingOperator {
    public void main(String[] args) {
        // 创建接口操作类的对象,调用method方法
        JumppingOperator jo = new JumppingOperator();
        Jumpping j = new Cat();
        jo.method(j);
        
        Jumpping j2 = new DOg();
        jo.method(j2);
        System.out.println("-------------");
        
        //匿名内部类的简化
        jo.method(new Jumpping() {
            @Override
            public void jump() {
                System.out.println("猫可以跳高了")
            }
        });
          
         //匿名内部类的简化
        jo.method(new Jumpping() {
            @Override
            public void jump() {
                System.out.println("狗可以跳高了")
            }
        })
            
    }
}

3. 常用的API

3.1 Math

1 )Math类概括

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

2 )Math中方法的调用方式

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

3 )Math类的常用方法

方法名说明
public static int abs(int a)返回参数的绝对值
public static double cell(double a)返回大于等于参数的最小double值,等于一个整数
public static double floor(double a)返回小于等于参数的最大double值,等于一个整数
public static int round(float 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 a,double b)返回a的b次幂的值
public static double random()返回值为double的正值,[0.0,1.0)

3.2 System

1 )System类的常用方法

方法名说明
public static void exit(int status)终止当前运行的 Java 虚拟机 ,非零表示异常终止
public static long currentTimeMillis()返回当前时间(以毫秒为单位)

2 )代码实例

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

public class SystemDemo {
	public static void main(String[] args) {
        //获取开始的时间节点
        long start = System.out.currentTimeMillis();
        for(int i =1;i <= 10000;i++) {
            System.out.println(i);
        }
        //获取结束的时间节点
        long end = System.out.currentTimeMillis();
        System.out.println("共耗时:" + (end-start) + "毫秒");
    }
}

3.3 Object 类的toString方法

1 )Object类概述

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

2 )查看方法源码的方式

  1. 选中方法,按下Ctrl + B

3 )重写toString方法的方式

  1. Alt + Insert 选toString
  2. 在空白区域,右键 ->Generate->选择toStirng

4 )toString方法的作用

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

3 )代码实例

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 Strig getName() {
        return name;
    }
    public void setName() {
        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 + "}";
    }
}

public class ObjectDemo {
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("林青霞");
        s.setAge(30);
        System.out.println(s);
        System.out.println(s.toString());
    }
}

3.4 Object 类的equals方法

1 )equals 方法的作用

  1. 用于对象之间的比较,返回tue和flase的结果
  2. 举例:s1.equals(s2); s1 和 s2 是两个对象

2 )重写equals方法的场景

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

3 )重写equals 方法的方式

  1. alt + Insert 选择equals() and hashCode(). IntelliJ Default,一路next,finish即可
  2. 在类的空白区域,右键->Generate->选择equals hashCode(),后面的同上

4 )代码实例

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) {
        if(this == 0) return true;
        if(this == null || getClass() != o.getClass()) return false;
        Student student = (student) 0;
        
        if(age != student.age) return false;
        return name != null ? name.euqls(student.name) : student.name == null;
    }
}

public class ObjectDemo{
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("林青霞");
        s1.setAge(30);
        
        Student s2 = new Student();
        s2.setName("林青霞");
        s2.setAge(30);
        
        //需求:比较两个对象的内容是否相同
        System.out.println(s1.equals(s2));
    }
}

3.5 冒泡排序原理

1 )冒泡排序概述

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

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

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

3.6 冒泡排序代码实现

public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = {24,69,80,57,13};
         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("排序后" + arrayToString(arr));
    }
}

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

1 )Arrays的常用方法

方法名说明
public static String toString(int[] a)返回指定数组的内容字符串表示形式
public static void sort(int[] a)按照数字顺序指定数组

2 )工具类设计思想

  1. 构造方法用private修饰
  2. 成员用public static修饰

🎈看完了不妨给我点个赞吧,👉你的支持,是我每天更新的动力...