JAVASE基础(十一)

一、内部类

内部类: 在一个类的内部定义另外一个类,那么另外一个类则称作为内部类 。

内部类的class文件名: 外部类$内部类.class

成员内部类:

成员内部类的访问方式:
        方式一: 在外部类提供一个方法创建内部类的对象进行访问。

        方式二:在其他类中直接创建内部的对象进行访问。
                格式: 
                    外部类.内部类  变量名  = new 外部类().new 内部类();

        注意:静态成员内部类在其他类创建对象的格式:
                    外部类.内部类  变量名  =  new 外部类.内部类();

内部类的好处: 直接访问外部类的所有成员。

应用场景: 我们在描述A事物的时候,A事物内部还维护了另外一个B事物,
而且B事物还必须 要访问到A事物的成员,那么这时候我们就可以使用内部类描述B事物。

比如: 人– 心脏 . 图形化界面编程

 成员内部类要注意的细节:
     1. 内部类可以直接访问外部类的所有成员。
     2. 内部类与外部类存在同名的成员时, 在内部类中默认是访问内部类的成员, 可以通过"外部类.this.成员"进行指定访问外部类的成员。
     3. 私有的成员内部类只能通过在外部类提供一个公共的方法进行访问。 在其他类无法访问。
     4.  如果一个成员内部类定义了静态的成员,那么该类也必须使用static修饰。

    疑问:为什么如果一个成员内部类定义了静态的成员,那么该类也必须使用static修饰 ???
        静态的成员变量是不依赖对象而存在的
class Outer{
    //
     String name = "外部类";

    //成员内部类
    static  class Inner{

        static  int x = 10;

        String name = "内部类";

        public void print(){
            System.out.println("这个是内部类的print方法:"+name); //默认访问时内部类,
        }
    }


    //外部类
    public void newInstance(){
        Inner inner = new Inner();
        inner.print();
    }

}


//其他类
class Demo7 
{

    public static void main(String[] args) 
    {
        /*
        Outer outer = new Outer();
        outer.newInstance();


        System.out.println("x:"+Outer.Inner.x);

        */

        //创建内部类对象
        Outer.Inner inner = new Outer.Inner();
        inner.print();
    }
}

局部内部类:在一个方法内部定义的类称作为局部内部类。

局部内部类要注意的细节:
1. 如果局部内部类要访问局部变量,那么局部变量必须使用final去修饰。

class Outer{

    public void print(){  

        final int y = 100;    // y的生命周期:执行到该语句的时候存在内存中, 方法执行完毕之后消失。

        //局部内部类
        class Inner{

            int x = 10;

            public void show(){
                System.out.println("这个是一个局部内部类的show方法.."+y); //问题:给人感觉y的生命周期被延长了。
                /*
                    解决办法:   
                        让局部内部类访问局部变量的复制品。
                */
            }
        }

        //创建一个局部内部类对象
        Inner inner = new Inner(); // Inner对象的生命周期比y的生命周期要长 
        inner.show();
    }

}

class Demo8 
{
    public static void main(String[] args) 
    {
        //System.out.println("Hello World!");
        Outer outer = new Outer();
        outer.print();
    }
}

匿名内部类:没有类名的内部类就称作为匿名内部类。

匿名内部类的好处: 简化书写。

匿名内部类的使用前提: 必须存在继承或者实现的关系。

注意的事项:
1. 匿名内部类只是没有类名而已,其他的一切成员都是具备的。

需求: 定义一个局部内部类继承Animal,创建对象调用run方法。

abstract class  Animal{

    public abstract void run();


    public abstract void sleep();

}


class Outer{

    public void print(){
        /*
        class Fish extends Animal{

            public void run(){
                System.out.println("鱼在游...");
            }

            public void sleep(){
                System.out.println("鱼睁开眼睛睡觉...");
            }


        }
        //创建局部内部类的对象
        Fish f = new Fish();
        f.run();
        f.sleep();
        */

        //匿名内部类只是没有类名而已,其他的一切成员都是具备的。

    //多态
    Animal f = new Animal(){   //  这里创建的并不是Animal的对象,创建的是Animal的子类对象,只不过其子类目前没有类名借用了ANimal名字而已。
            //匿名内部类 的成员         

            String name;

            public  void run(){
                System.out.println("鱼在游...");
            }


            public void sleep(){
                System.out.println("鱼睁开眼睛睡觉...");
            }

        };

        f.run();
        f.sleep();

    }

}

class Demo9 {

    public static void main(String[] args) 
    {
        Outer outer = new Outer();
        outer.print();
    }
}
class Person{

    public void eat(){
        System.out.println("在吃饭..");
    }
}

interface Dao{

    public void add();
}



class Outer{

    public void print(){

        //匿名内部类的对象??
        new Person(){  
            //匿名内部类的成员

            public void sleep(){
                System.out.println("在睡觉..");

            }

        }.eat();
    }


    //实现关系下的匿名内部类
    public void show(){
        //这里创建的不是Dao接口的对象,创建的是Dao接口实现类的对象。
        new Dao(){

            public void add(){
                System.out.println("添加成功..");
            }
        }.add();

    }
}

class  Demo10
{
    public static void main(String[] args) 
    {
        new Outer().show();
    }
}

二、异常体系Throwable

Throwable常用的方法:
1. toString() 返回的是用于描述该异常情况的类的完整类名。 包名+ 类名 = 完整类名。
2. getMessage() 返回创建Throwable对象的时候传入的消息字符串的,
3. printStackTrace() 打印异常的栈信息。

class Demo11 
{
    public static void main(String[] args) 
    {
        /*
        //创建一个Throwable对象
        Throwable a = new Throwable("偶尔打喷嚏");
        System.out.println("toString:"+a.toString());  // java.lang.Throwable  返回的是用于描述该异常情况的类的完整类名。   包名+ 类名 = 完整类名。
        System.out.println("meessage:"+ a.getMessage());
        test();
        */
    }

    public static void test(){
        Throwable a = new Throwable("偶尔打喷嚏");
        a.printStackTrace();
    }
}

—-| Throwable
———| Error 错误一般都是由于jvm或者是硬件引发的问题,所有一般都不会通过代码去处理。
———| Exception 异常 如果程序出现了异常,那么一般就需要通过代码去处理了。

疑问:程序出现了不正常情况,我怎么能区分到底是错误还是异常呢?
如果不正常情况的消息是以Error结尾的,那么则代表了这是一个错误,
如果不正常情况的消息是以Exception结尾的,那么则代表是一个异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值