Java小记——内部类、匿名内部类

目录

内部类

成员内部类

局部内部类

匿名内部类


内部类

内部类概念

定义在其他类中的类,称为内部类

内部类访问特点

1.直接访问外部类的成员,包括私有

2.外部类访问内部类成员,必须创建对象

在外部类创建内部类对象     Nei nei = new Nei()

在测试类创建内部类对象    Wai.Nei nei = new Wai().new Nei()

成员内部类

定义在成员位置的类,称为成员内部类

class B {
    //成员内部类
    class A {

    }

    public void show() {
        //局部内部类
        class C {

        }
    }

}

若成员内部类被private修饰(内部类可以被私有,普通类则不行),则不能在测试类中创建内部类对象,只能在外部类中创建内部类对象,再在测试类中创建外部类对象。

public class MyTest {
    public static void main(String[] args) {
        //Wai.Nei nei = new Wai().new Nei();
        //nei.neiShow();     //内部类被私有,不能在测试类创建内部类对象
                            
        Outer outer = new Outer();
        outer.waiShow();    //内部类被私有,只能通过创建外部类对象调用方法来创建内部类对象
    }
}

class Wai {
    //内部类可以私有修饰
    private class Nei {
        public void neiShow() {
            System.out.println("nei show");
        }
    }

    public void waiShow() {
        Inner inner = new Inner();
        inner.neiShow();
    }
}

被static修饰的成员内部类

1.只能访问外部类的静态成员

public class Wai {
    static int num = 100;

    public static class Nei {
        public void neiShow() {
            System.out.println(num);
        }
    }

2.静态的成员内部类,在测试类中创建对象

Wai.Nei nei = new Wai.Nei();

public class MyTest {
    public static void main(String[] args) {
        
        Wai.Nei nei = new Wai.Nei();
    }
}

*****     :      Outer.this 表示外部类对象

局部内部类

不能直接在测试类创建对象,在方法内创建局部内部类对象,在测试类创建外部类对象调用外部类的方法

public class MyTest {
    public static void main(String[] args) {
        //局部内部类,在外界没有直接创建其对象的语法。
        Wai wai = new Wai();
        wai.waiShow();
    }
}

class Wai {
    int num = 20;
    private double a = 3.5;
    
    public void waiShow() {
        final int num=20;  //默认有final,可不写。

        //局部内部类
        class Nei {
            int t = 50;

            public void neiShow() {
                System.out.println(num);
                System.out.println(a);
            }
        }
        //创建局部内部类对象
        Nei nei = new Nei();
        nei.neiShow();
    }

    public void hehe() {
    }
}

局部变量用final修饰。因为局部变量会随着方法的调用完毕而消失,但是局部对象并没有立马从堆内存中消失,还要继续使用那个局部变量,就要用final修饰,在堆内存中储存为一个常量。

匿名内部类

匿名内部类是局部内部类的简写形式

实质上为一个对象

继承了抽象类的一个子类对象  或   实现接口类的一个对象

抽象类:

      new Father() {       //父类的子类对象,重写了父类的方法
            @Override
            public void hehe() {
                System.out.println("呵呵呵呵呵呵");
            }
        };


        new Father() {
            @Override
            public void hehe() {
                System.out.println("44444444444444");
            }
        }.hehe();     //子类对象调用了父类方法
    }
}

abstract class Father {     //抽象父类
    public abstract void hehe();
}

接口:

public class MyTest {
    public static void main(String[] args) {
        //我想要得到接口的实现类对象
        new SS() {
            @Override
            public void ss() {
                System.out.println("sssssssssssssssssss");
            }
        };

        new SS() {
            @Override
            public void ss() {
                System.out.println("sssssssssssssssssss888888");
            }
        }.ss();

        //多态
        SS ss = new SS() {
            @Override
            public void ss() {
                System.out.println("sssssssssssssssssss888888");
            }
        };

    }
}


interface SS {
    void ss();
}

若想对对象取名

AA aa = new AA() {
            @Override
            public void aa() {
                System.out.println("aaaaaaaaaaaaaa744444aa");
            }

            @Override
            public void hehe() {
                System.out.println("hehehehehe888877777hhehehhe");
            }
        };
aa.aa();
aa.hehe();

匿名内部类,常作为参数传递或返回值

抽象类 作为参数:

public class MyTest {
    public static void main(String[] args) {
        //匿名内部类,经常作为参数,或返回值,使用比较方便。
        WW ww = new WW() {
            @Override
            public void hehe() {
                System.out.println("aaa");
            }
        };

        test(ww);

        test(new WW() {
            @Override
            public void hehe() {
                System.out.println("bbb");
            }
        });
    }

 
    public static void test(WW ww) {
        ww.hehe();
    }
}


abstract class WW {
    public abstract void hehe();
}

接口 作为参数:

public class MyTest2 {
    public static void main(String[] args) {
        HH hh = new HH() {
            @Override
            public void hh() {
                System.out.println("hhhhhhhhhhhhhhhhh");
            }
        };
        test(hh); //取名传递
        test(hh);


        test(new HH() {
            @Override
            public void hh() {
                System.out.println("hhhhhhhhhhhhhhhhh");
            }
        });  //直接作为参数传递

    }

    //当你以后看到一个方法的形参,要一个接口,类型,你就传递一个该接口的,实现类对象,多态。
    public static void test(HH hh) {
        hh.hh();
    }
}

interface HH {
    void hh();
}

抽象类 作为返回值

public class MyTest {

    public static void main(String[] args) {
        BB bb = getBB();
        bb.bb();

        BB bb2 = getBB2();
        bb2.bb();

        //匿名内部类,作为返回值,返回方便
    }

    //当你以后看到一个方法的返回值,类型是一个抽象类 类型,你就返回一个该抽象类的子类对象。
    public static BB getBB() {

        BB cc = new CC();
        return cc;
    }

    public static BB getBB2() {
        return new BB() {

            @Override
            public void bb() {
                System.out.println("bbbbbbbbbbbbbbbbb222222222");
            }
        };
    }
}

abstract class BB {
    public abstract void bb();
}

class CC extends BB {
    @Override
    public void bb() {
        System.out.println("bbbbbbbbbbbbbbbbbb");
    }
}

接口 作为返回值

public class MyTest {

    public static void main(String[] args) {
        BB bb = getBB();
        bb.hehe();

        BB bb2 = getBB2();
        bb2.hehe();

        //匿名内部类,作为返回值,返回方便
    }

    //当你以后看到一个方法的返回值,类型是一个抽象类 类型,你就返回一个该抽象类的子类对象。
    public static BB getBB() {

        BB cc = new CC();
        return cc;
    }

    public static BB getBB2() {
        return new BB() {

            @Override
            public void hehe() {
                System.out.println("bbbbb66666");
            }
        };
    }
}

interface BB {
    void hehe();
}

class CC implements BB {
    @Override
    public void hehe() {
        System.out.println("666666");
    }
}

在类中定义接口,称为内部接口

public class MyTest {
    public static void main(String[] args) {
        //创建内部接口的子类对象
        Wai.MyInterface myInterface = new Wai.MyInterface() {

            @Override
            public void hehe() {
                System.out.println("呵呵呵呵呵");
            }
        };
        myInterface.hehe();

        Wai wai = new Wai();
        wai.test();

    }
}


class Wai {
    //内部接口
    interface MyInterface {
        void hehe();
    }

    //私有内部接口
    private interface MyInterface2 {
        void hehe2();
    }

    public void test() {
        MyInterface2 myInterface2 = new MyInterface2() {
            @Override
            public void hehe2() {
                System.out.println("2222222222222222");
            }
        };
        myInterface2.hehe2();
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
接入第三方登录是让用户方便快捷地使用已有账号登录你的网站或应用程序,提高用户体验的一种方式。本文将介绍如何使用 PHP 实现微信公众号第三方登录。 1. 获取微信授权 首先,需要获取微信用户的授权。具体步骤如下: 1)引导用户打开微信授权页面: ```php $appid = 'your_appid'; $redirect_uri = urlencode('http://yourdomain.com/callback.php'); $scope = 'snsapi_userinfo'; $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=$scope&state=STATE#wechat_redirect"; header("Location: $url"); ``` 其中,`$appid` 是你的微信公众号的 AppID,`$redirect_uri` 是授权后回调的 URL,`$scope` 是授权作用域,可以是 `snsapi_base` 或 `snsapi_userinfo`,`$state` 是自定义参数,用于防止 CSRF 攻击。 2)获取授权码: 用户同意授权后,会重定向到 `$redirect_uri` 指定的 URL,带上授权码 `code` 和 `state` 参数。 ```php $code = $_GET['code']; $state = $_GET['state']; ``` 3)获取 access_token 和 openid: 使用授权码 `code` 获取 `access_token` 和 `openid`。 ```php $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$secret&code=$code&grant_type=authorization_code"; $response = file_get_contents($access_token_url); $result = json_decode($response, true); $access_token = $result['access_token']; $openid = $result['openid']; ``` 其中,`$secret` 是你的微信公众号的 AppSecret。 2. 获取用户信息 获取到 `access_token` 和 `openid` 后,可以使用以下代码获取用户信息: ```php $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN"; $response = file_get_contents($userinfo_url); $userinfo = json_decode($response, true); ``` 其中,`$userinfo` 包含用户的昵称、头像等信息。 3. 将用户信息保存到数据库 最后,将获取到的用户信息保存到数据库中,以便下次使用时快速登录。 ```php // 连接数据库 $con = mysqli_connect('localhost', 'username', 'password', 'database'); mysqli_set_charset($con, "utf8"); // 查询用户是否已存在 $sql = "SELECT * FROM users WHERE openid='$openid'"; $result = mysqli_query($con, $sql); if (mysqli_num_rows($result) == 0) { // 用户不存在,插入新用户信息 $nickname = mysqli_real_escape_string($con, $userinfo['nickname']); $headimgurl = mysqli_real_escape_string($con, $userinfo['headimgurl']); $sql = "INSERT INTO users (openid, nickname, headimgurl) VALUES ('$openid', '$nickname', '$headimgurl')"; mysqli_query($con, $sql); } // 保存用户登录状态 $_SESSION['openid'] = $openid; ``` 以上就是使用 PHP 实现微信公众号第三方登录的步骤。需要注意的是,为了确保安全性,应该对用户输入的数据进行过滤和验证,防止 SQL 注入和 XSS 攻击等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jmh-Ethereal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值