内部类、异常、包

 

内部类

匿名内部类

异常

Throwabale中的方法

自定义异常

Jar

1、内部类

概念:将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)

通俗说:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类

 

访问特点:

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

而外部类要访问内部类中的成员,必须要建立内部类的对象。

 

内部类的访问规则:

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

    之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式外部类名.this

2,外部类要访问内部类,必须建立内部类对象。

3,内部类可以被私有修饰,当内部类在外部类的成员变量上时。

访问格式:

1,当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。

可以直接建立内部类对象。

格式

    外部类名.内部类名 变量名 = 外部类对象.内部类对象;

    Outer.Inner in = new Outer().new Inner();//这种形式很少用。

 

2,当内部类在成员位置上,就可以被成员修饰符所修饰。

    比如,private:将内部类在外部类中进行封装。

       static:内部类就具备static的特性。

       当内部类被static修饰后,相当于外部类。只能直接访问外部类中的static成员。出现了访问局限。

 

       在外部其他类中,如何直接访问static内部类的非静态成员呢?

       new Outer.Inner().function();

 

       在外部其他类中,如何直接访问static内部类的静态成员呢?

       uter.Inner.function();

    注意:当内部类中定义了静态成员,该内部类必须是static的。

         当外部类中的静态方法访问内部类时,内部类也必须是static的。

3,内部类定义在局部时

a)      不可以被成员修饰符修饰

b)      可以直接访问外部类中的成员,因为还持有外部类中的引用。

    但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。

内部类编译后的文件名为:“外部类名$内部类名.java”;

 

为什么内部类可以直接访问外部类中的成员呢?

那是因为内部中都持有一个外部类的引用。这个是引用是 外部类名.this

内部类可以定义在外部类中的成员位置上,也可以定义在外部类中的局部位置上。

当内部类被定义在局部位置上,只能访问局部中被final修饰的局部变量。

静态内部类:

class Outer
{
	private static  int x = 3;
	static class Inner//静态内部类
	{
		static void function()
		{
			System.out.println("innner :"+x);
		}
	}
	public static void method()
	{
		Inner.function();
		new Inner2().show();
	}
}
class  InnerClassDemo2
{
	public static void main(String[] args) 
	{
		Outer.method();
		Outer.Inner.function();
		new Outer.Inner().function();
		//直接访问内部类中的成员。
		Outer.Inner in = new Outer().new Inner();
		in.function();
	}
}

当描述事物时,事物的内部还有事物,该事物用内部类来描述。

因为内部事务在使用外部事物的内容。

《《《《————————————————》》》》

class Outer
{
	private int x = 3;
	class Inner//内部类
	{
		//int x = 4;
		void function()
		{
			//int x = 6;
			System.out.println("innner :"+Outer.this.x);
		}
	}
	void method()
	{
		Inner in = new Inner();//创建内部类的对象。
		in.function();//调用内部类的方法
	}
}

如果打印6,直接是x;如果想打印4 this.x;如果想打印3 Outer.this.x

《《《《————————————————》》》》

class Outer
{
	int x = 3;
	void method(final int a)
	{
		final int y = 4;
		class Inner
		{
			void function()
			{
				System.out.println(y);
			}
		}
		new Inner().function();
	}
}

局部的,不能被静态私有修饰。局部内部类不能定义静态方法的。

内部类定义在局部时1不可以被成员修饰符修饰2可以直接访问外部类中的成员,为还持有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。

《《《《————————————————》》》》

2、匿名内部类

1,匿名内部类是没有名字的内部类,其实就是内部类的简写格式。

2,定义匿名内部类的前提:

      内部类必须是继承一个类或者实现接口。

3,匿名内部类的格式:  new 父类或者接口(){定义子类的内容}

4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。 可以理解为带内容的对象。

5,匿名内部类中定义的方法最好不要超过3个。匿名对象只能调用一次。

简单理解:就是建立一个带内容的外部类或者接口的子类匿名对象。

匿名内部类的使用场景:

当函数的参数是接口类型引用时,如果接口中的方法不超过3个。可以通过匿名内部类来完成参数的传递。

其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。

《《《《——————————————》》》》

//面试

        //1

        new Object(){

            void show(){

                System.out.println("show run");            

            }

        }.show();

        //2

        Object obj = new Object(){

            void show(){

                System.out.println("show run");

            }

        };

        obj.show();

 1和2的写法正确吗?有区别吗?说出原因。

 写法是正确,1和2都是在通过匿名内部类建立一个Object类的子类对象。

 区别

第一个可是编译通过,并运行。

第二个编译失败,因为匿名内部类是一个子类对象,当用Object的obj引用指向时,就被提升为了

Object类型,而编译时检查Object类中是否有show方法,所以编译失败。

注意:

1new object()  {

public void function(){}

}.function();

//object子类对象。没有接口没有父类。还可以写匿名类吗?可以,

2new object();object对象,

《《《《——————————》》》》

匿名内部类的练习:

interface Inter
{
	void method();
}
class Test 
{
	//补足代码。通过匿名内部类。
	/*
	static class Inner implements Inter
	{
		public void method()
		{
			System.out.println("method run");
		}
	}
	*/
	static Inter function()
	{
		return new Inter()
		{
			public void method()
			{
				System.out.println("method run");
			}
		};
	}
}
class InnerClassTest 
{
	public static void main(String[] args) 
	{
		//Test.function():Test类中有一个静态的方法function。
		//.method():function这个方法运算后的结果是一个对象。而且是一个Inter类型的对象。
		//因为只有是Inter类型的对象,才可以调用method方法。
		Test.function().method();
//		Inter in = Test.function();
//		in.method();
		show(new Inter()
		{
			public void method()
			{
				System.out.println("method show run");
			}
		});
	}
	public static void show(Inter in)
	{
		in.method();
	}
}
class InnerTest
{
	public static void main(String[] args)
	{
		new Object()//object子类对象。没有接口没有父类。还可以写匿名类吗?可以,
		{
			public void function()
			{
				
			}
			
		}.function();
	}
}

《《《《——————————————》》》》

class  Inner   ClassDemo6 {

    +(static)class Inner{

        void show(){}

    }

    public  void  method(){

        this.new  Inner().show();//可以

    }

    public static void main(String[] args) {//static不允许this

        This.new Inner().show();//错误,Inner类需要定义成static

    }

}

------------------------------------------------------

interface Inter{

    void show();

}

class Outer{//通过匿名内部类补足Outer类中的代码。

    public static Inter method(){

        return new Inter(){

            public void show(){}

        };

    }

}

class InnerClassDemo7 {

    public static void main(String[] args) {

        Outer.method().show();

    /*

        Outer.method():意思是:Outer中有一个名称为method的方法,而且这个方法是静态的。

        Outer.method().show():当Outer类调用静态的method方法运算结束后的结果又调用了show方法,意味着:method()方法运算完一个是对象,而且这个对象是Inter类型的。

    */

        function (new Inter(){

            public void show(){}

        }); //匿名内部类作为方法的参数进行传递。

    }

    public static void function(Inter in){

        in.show();

    }

}

《《《《——————————》》》》

3、异常

异常:就是不正常。程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。

 

出现的问题有很多种,比如角标越界,空指针等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系

异常:就是程序在运行时出现不正常情况。

异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。其实就是java对不正常情况进行描述后的对象体现。

对于问题的划分:两种:一种是严重的问题,一种非严重的问题

对于严重的,java通过Error类进行描述。对于Error一般不编写针对性的代码对其进行处理。

对于非严重的,java通过Exception类进行描述。

 对于Exception可以使用针对性的处理方式进行处理。

--------java.lang.Throwable

Throwable可抛出的。

    |--Error错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。

    |--Exception异常,可以有针对性的处理方式

无论Error或者Exception都具有它们都有具体的子类体现每一个问题,它们的子类都有一个共性,就是都以父类名才作为子类的后缀名

比如:不正常情况的信息,引发原因等。

这个体系中的所有类和对象都具备一个独有的特点;就是可抛性

可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字所操作。

《《《《————————————》》》》

class  ExceptionDemo{

    public static void main(String[] args) {

//      byte[] buf = new byte[1024*1024*700];//java.lang.OutOfMemoryError内存溢出错误

    }

}

《《《《——————————》》》》

异常的处理

在开发时,如果定义功能时,发现该功能会出现一些问题,应该将问题在定义功能时标示出来,这样调用者就可以在使用这个功能的时候,预先给出处理方式。

如何标示呢?通过throws关键字完成,格式:throws异常类名,异常类名...

这样标示后,调用者,在使用该功能时,就必须要处理,否则编译失败。

处理方式有两种:1、捕捉;2、抛出。

对于捕捉:java有针对性的语句块进行处理。

try

{

    需要被检测的代码;

}

catch(异常类 变量)

{

    处理异常的代码;(处理方式)

}

finally

{

    一定会执行的语句;

}

finally代码块只有一种情况不会被执行,就是在之前执行了System.exit(0);

3,对捕获到的异常对象进行常见方法操作(Throwable中的方法)。

    String getMessage():获取异常信息,返回字符串

  toString();获取异常类名和异常信息,返回字符串。

    printStackTrace();获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void.

    printStackTrace(PrintStream s);通常用该方法将异常内容保存在日志文件中,以便查阅。

在函数上声明异常,便于提高安全性,让调用出进行处理。不处理编译失败。

class Demo
{
	int div(int a,int b)throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。
	{
		return a/b;
	}
}
class  ExceptionDemo
{
	public static void main(String[] args) 
	{
		Demo d = new Demo();
		try
		{
			int x = d.div(4,1);
			System.out.println("x="+x);
		}
		catch (Exception e)//Exception e = new ArithmeticException();
		{
			System.out.println("除零啦");
			System.out.println(e.getMessage());//  / by zero;
			System.out.println(e.toString());// 异常名称 : 异常信息。
			e.printStackTrace();//异常名称,异常信息,异常出现的位置。
							//其实jvm默认的异常处理机制,就是在调用printStackTrace方法。
							//打印异常的堆栈的跟踪信息。
		}		
		System.out.println("over");
	}
}

《《《《——————————》》》》

对多异常的处理。

异常处理原则:功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。

特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。

1,声明异常时,建议声明更为具体的异常。这样处理的可以更具体。

2,对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。

    如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

建议:在进行catch处理时,catch中一定要定义具体处理方式。不要简单定义一句 e.printStackTrace(),也不要简单的就书写一条输出语句。

class Demo
{
	int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通过throws的关键字声明了该功能有可能会出现问题。
	{
		int[] arr = new int[a];
		System.out.println(arr[4]);
		return a/b;
	}
}
class  ExceptionDemo2
{
	public static void main(String[] args) //throws Exception
	{
		Demo d = new Demo();
		try
		{
			int x = d.div(5,0);
			System.out.println("x="+x);
		}
		catch(Exception e)
		{
			System.out.println("hahah:"+e.toString());
		}
		catch (ArithmeticException e)
		{
			System.out.println(e.toString());
			System.out.println("被零除了!!");
		}
		catch (ArrayIndexOutOfBoundsException e)
		{
			System.out.println(e.toString());
			System.out.println("角标越界啦!!");
		}
		System.out.println("over");
	}
}

《《《《——————————》》》》

throw 和throws关键字的区别:

throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。

throws用于抛出异常类,即用于标识函数暴露出的异常。后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。

 

通常情况:函数内容如果有throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况。

异常分两种:

1:编译时被检查的异常,只要是Exception及其子类都是编译时被检测的异常。

2:运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。

 

编译时被检查的异常和运行时异常的区别:

编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。

声明的原因:是需要调用者对该异常进行处理。

运行时异常如果在函数内被抛出,在函数上不需要声明。

不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。

 

定义异常处理时,什么时候定义try,什么时候定义throws呢?

功能内部如果出现异常,如果内部可以处理,就用try;

如果功能内部处理不了,就必须声明出来,让调用者处理。

 

4、自定义异常

自定义异常:当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。

 

当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。要么在内部try catch处理。要么在函数上声明让调用者处理。一般情况在,函数内出现异常,函数上需要声明。

当发现打印的结果中只有异常的名称,却没有异常的信息。因为自定义的异常并未定义信息。

 

如何定义异常信息呢?

因为父类中已经把异常信息的操作都完成了。所以子类只要在构造时,将异常信息传递给父类通过super语句。那么就可以直接通过getMessage方法获取自定义的异常信息。

 

自定义异常的步骤:

1,自定义类继承Exception或者其子类。

继承Exception原因:异常体系有一个特点:因为异常类和异常对象都被抛出。他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。只有这个体系中的类和对象才可以被throws和throw操作。

2,通过构造函数定义异常信息

class FuShuExceptionextends Exception//getMessage();

{

    FuShuException()

    {

       super();

    }

}

3,通过throws或throw进行自定义异常抛出操作。

自定义异常举例:

需求:对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常。

class FuShuException extends Exception //getMessage();
{
	private int value;
	FuShuException()
	{
		super();
	}
	FuShuException(String msg,int value)
	{
		super(msg);
		this.value = value;
	}
	public int getValue()
	{
		return value;
	}
}
class Demo
{
	int div(int a,int b)throws FuShuException
	{
		if(b<0)
			throw new FuShuException("出现了除数是负数的情况------ / by fushu",b);//手动通过throw关键字抛出一个自定义异常对象。
		return a/b;
	}
}
class  ExceptionDemo3
{
	public static void main(String[] args) 
	{
		Demo d = new Demo();
		try
		{
			int x = d.div(4,-9);
			System.out.println("x="+x);		
		}
		catch (FuShuException e)
		{
			System.out.println(e.toString());
			//System.out.println("除数出现负数了");
			System.out.println("错误的负数是:"+e.getValue());
		}
		System.out.println("over");
	}
}

异常细节:

a)      RuntimeException 运行时异常或其子类是Exceptoin中一个特殊的子类异常,如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过;之所以不用在函数声明,是因为不需要让调用者处理。

b)      一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或者异常的子类。

c)      如果父类抛出多个异常,那么重写(覆盖)方法必须抛出那些异常的一个子类,不能抛出新的异常。

d)      介绍异常的分层设计时的层内封装。

e)      当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。

f)      自定义异常时:如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException。

 

异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用者可以处理的异常抛出。

如果出现异常,并不处理,但是资源一定关闭,所以try finally集合只为关闭资源

记住:finally很有用,主要用户关闭资源。无论是否发生异常,资源都必须进行关闭。

System.exit(0); //退出jvm,只有这种情况finally不执行。

 

当异常出现后,在子父类进行覆盖时,有了一些新的特点:

1:当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。

2:如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。

 

注意:

如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。

如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。

 

常见异常:

1、脚标越界异常(IndexOutOfBoundsException)包括数组、字符串;

空指针异常(NullPointerException)

2、类型转换异常:ClassCastException

3、没有这个元素异常:NullPointerException

4、不支持操作异常;

异常要尽量避免,如果避免不了,需要预先给出处理方式。比如家庭备药,比如灭火器。

举例:1、毕老师用电脑上课

开始思考上课中出现的问题

比如:电脑蓝屏,电脑冒烟

要对问题进行描述,封装成对象。可是当冒烟发生后,出现讲课进度无法继续,出现了讲师的问题,课时计划无法完成

class LanPingException extends Exception
{
	LanPingException(String message)
	{
		super(message);
	}
}
class MaoYanException extends Exception
{
	MaoYanException(String message)
	{
		super(message);
	}
}
class NoPlanException extends Exception
{
	NoPlanException(String msg)
	{
		super(msg);
	}
}
class Computer
{
	private int state = 3;
	public void run()throws LanPingException,MaoYanException
	{
		if(state==2)
			throw new LanPingException("蓝屏了");
		if(state==3)
			throw new MaoYanException("冒烟了");
		System.out.println("电脑运行");
	}
	public void reset()
	{
		state = 1;
		System.out.println("电脑重启");
	}
}
class Teacher
{
	private String name;
	private Computer cmpt;
	Teacher(String name)
	{
		this.name = name;
		cmpt = new Computer();
	}
	public void prelect()throws NoPlanException
	{
		try
		{
			cmpt.run();			
		}
		catch (LanPingException e)
		{
			cmpt.reset();
		}
		catch (MaoYanException e)
		{
			test();
			throw new NoPlanException("课时无法继续"+e.getMessage());
			
		}
		System.out.println("讲课");
	}
	public void test()
	{
		System.out.println("练习");
	}
}
class ExceptionTest 
{
	public static void main(String[] args) 
	{
		Teacher t = new Teacher("毕老师");
		try
		{
			t.prelect();
		}
		catch (NoPlanException e)
		{
			System.out.println(e.toString());
			System.out.println("换老师或者放假");
		}
		
	}
}

2有一个圆形和长方形。

都可以获取面积。对于面积如果出现非法的数值,视为是获取面积出现问题。

问题通过异常来表示。

现有对这个程序进行基本设计。

class NoValueException extends RuntimeException
{
	NoValueException(String message)
	{
		super(message);
	}
}
interface Shape
{
	void getArea();
}
class Rec implements Shape
{
	private int len,wid;
	Rec(int len ,int wid)//throws NoValueException
	{
		if(len<=0 || wid<=0)
			throw new NoValueException("出现非法值");
		this.len = len;
		this.wid = wid;
	}
	public void getArea()
	{
		System.out.println(len*wid);
	}
}
class Circle implements Shape
{
	private int radius;
	public static final double PI = 3.14;
	Circle(int radius)
	{
		if(radius<=0)
			throw new NoValueException("非法");
		this.radius = radius;
	}
	public void getArea()
	{
		System.out.println(radius*radius*PI);
	}
}
class  ExceptionTest1
{
	public static void main(String[] args) 
	{	
		Rec r = new Rec(3,4);
		r.getArea();
		Circle c = new Circle(-8);
		System.out.println("over");
	}
}

整体总结异常:

异常:是什么?是对问题的描述。将问题进行对象的封装。

------------

异常体系:

    Throwable

       |--Error

       |--Exception

           |--RuntimeException

 

异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。

              也就是说可以被throwthrows关键字所操作。

              只有异常体系具备这个特点。

--------------

throwthrows的用法:

throw定义在函数内,用于抛出异常对象。

throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。

当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,都在编译失败。

注意,RuntimeException除外。也就说,函数内如果抛出的RuntimeExcpetion异常,函数上可以不用声明。

--------------

如果函数声明了异常,调用者需要进行处理。处理方法可以throws可以try

异常有两种:

    编译时被检测异常

        该异常在编译时,如果没有处理(没有抛也没有try),编译失败。

       该异常被标识,代表这可以被处理。

    运行时异常(编译时不检测)

       在编译时,不需要处理,编译器不检查。

       该异常的发生,建议不处理,让程序停止。需要对代码进行修正。

--------------

异常处理语句:

try

{

    需要被检测的代码;

}

catch ()

{

    处理异常的代码;

}

finally

{

    一定会执行的代码;

}

 

有三个结合格式:

1.  try

    {  

    }

    catch ()

    {

    }

2.  try

    {

    }

    finally

    {

    }

3.  try

    {  

    }

    catch ()

    {

    }

    finally

    {

    }

注意:

1finally中定义的通常是关闭资源代码。因为资源必须释放。通常用于关闭资源。

2finally只有一种情况不会执行。当执行到System.exit(0);fianlly不会执行。

例如:数据库

publicvoid method()throws NoException

{

    连接数据库;

    数据操作;//throw new SQLException();

    关闭数据库;//该动作,无论数据操作是否成功,一定要关闭资源。

    try

    {

       连接数据库;

       数据操作;//throw new SQLException();

    }

    catch (SQLException e)

    {

       会对数据库进行异常处理;

       thrownew NoException();

    }

    finally

    {

       关闭数据库;

    }

}

异常在子父类覆盖中的体现

1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类

2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。

3,如果父类或接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常

如果子类方法发生了异常,就必须要进行try处理,绝对不能抛。

 

--------------

自定义异常:

    定义类继承Exception或者RuntimeException

    1,为了让该自定义类具备可抛性。

    2,让该类具备操作异常的共性方法。

    当要定义自定义异常的信息时,可以使用父类已经定义好的功能。

    异常异常信息传递给父类的构造函数。

    classMyExceptionextends Exception

    {

       MyException(String message)

       {

           super(message);

       }

    }

自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装。

--------------

异常的好处:

    1,将问题进行封装。

    2,将正常流程代码和问题处理代码相分离,方便于阅读。

异常的处理原则:

    1,处理方式有两种:try或者throws

    2,调用到抛出异常的功能时,抛出几个,就处理几个。

       一个try对应多个catch

    3,多个catch,父类的catch放到最下面。

    4catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。也不要不写。当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。

       try

       {

           thrownew AException();

       }

       catch (AExceptione)

       {

           throwe;

       }

       如果该异常处理不了,但并不属于该功能出现的异常。

       可以将异常转换后,在抛出和该功能相关的异常。

 

       或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,

       当调用者知道。并处理。也可以将捕获异常处理后,转换新的异常。

       try

       {

           thrownew AException();

       }

       catch (AException e)

       {

           //AException处理。

           thrownew BException();

       }

       比如,汇款的例子。

异常的注意事项:

    在子父类覆盖时:

    1,子类抛出的异常必须是父类的异常的子类或者子集。

    2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。

 

5、包(package

a)         对类文件进行分类管理。

b)        给类提供多层命名空间。

c)         写在程序文件的第一行。

d)        类名的全称的是包名.类名。

e)         包也是一种封装形式。

classpath

a)         JVM提供一个环境变量

b)        指定类或者包所在的路径

c)         classpath变量值的最后有分号与无分号的区别。

包之间的访问

a)       被访问的包中的类权限必须是public的。

b)        类中的成员权限:publicprotected

c)        protected是为其他包中的子类提供的一种权限只能是不同包中的子类可以使用的权限。

package pack;

/*

为了简化类名的书写,使用一个关键字,import.

import 导入的是包中的类。

建议,不要写通配符 *,需要用到包中的哪个类,就导入哪个类。

一个程序文件中只有一个package,可以有多个import。

用来导包中的类,不导入包中的包。

通常写import packb.haha;

而不写import packb.*;为何呢?

import packa.*;//这个仅仅是导入了packa当前目录下的所有的类。不包含子包。

import packa.abc.*;//导入了packa包中的子包abc下的当前的所有类。

c:\myclass

c:\myclass\packb\DemoA.class

c:\myclass\packb\haha\DemoZ.class

import packb.*;

import packb.haha.*;

建立定包名不要重复,可以使用url来完成定义,url是唯一的。

www.itcast.cn

package cn.itcast.demo

package cn.itcast.test

import packb.haha.hehe.heihei.*;
import packa.*;
import packb.*;
class  PackageDemo
{
	public static void main(String[] args) 
	{
		DemoC c = new DemoC();
//		packa.DemoA d = new packa.DemoA();
//		d.show();
//		packb.DemoB d = new packb.DemoB();
//		d.method();
	}
}

《《《《—————————————————》》》》

PackageDemo.java:8: 找不到符号

符号: 类 DemoA

位置: 类 pack.PackageDemo

                DemoA d = new DemoA();

                ^

PackageDemo.java:8: 找不到符号

符号: 类 DemoA

位置: 类 pack.PackageDemo

                DemoA d = new DemoA();

                              ^

2 错误

错误原因:类名写错。

因为类名的全名是:包名.类名

PackageDemo.java:8: 软件包 packa 不存在

                packa.DemoA d = new packa.DemoA();

                     ^

PackageDemo.java:8: 软件包 packa 不存在

                packa.DemoA d = new packa.DemoA();

                                         ^

2 错误

错误原因:packa包不在当前目录下

需要设置classpath,告诉jvm去哪里找指定的packa包。

PackageDemo.java:8: packa.DemoA 在 packa 中不是公共的;无法从外部软件包中对其进行访问

                packa.DemoA d = new packa.DemoA();

                     ^

PackageDemo.java:8: packa.DemoA 在 packa 中不是公共的;无法从外部软件包中对其进行访问

                packa.DemoA d = new packa.DemoA();

                                         ^

2 错误

错误原因:有了包,范围变大,一个包中的类要被访问,必须要有足够大的权限。

所以被访问的类要被public修饰。

PackageDemo.java:9: show() 在 packa.DemoA 中不是公共的;无法从外部软件包中对其进行访问

                d.show();

                 ^

1 错误

错误原因:类公有后,被访问的成员也要公有才可以被访问。

总结:

    包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰。

    不同包中的子类还可以直接访问父类中被protected权限修饰的成员。

包与包之间可以使用的权限只有两种,public  protected。

《《《《—————————————————》》》》

总结java中的四种权限:

             public   protected       default     private

同一个类中     ok         ok             ok          ok

同一个包中     ok         ok             ok

子类           ok         ok            

不同包中      ok

《《《《—————————————————》》》》

常见的软件包:

java.lang : java的核心包 jdk1.2版本以后,该包中的类自动导入。

java.awt: 用于制作图形界面。

java.io:input output  用于操作设备上的数据。

java.util : 这里定义是java的工具类。集合,日期。

java.net:用于网络通讯的。

java.applet:  application  let        server  let   servlet      java server page  jsp 

class haha implements Servlet

class hehe extends HttpServlet

《《《《—————————————————》》》》

Jar包

Java的压缩包

方便项目的携带。

方便于使用,只要在classpath设置jar路径即可。

数据库驱动,ssh框架等都是以jar包体现的。

Jar包的操作

通过jar.exe工具对jar的操作。

创建jar包

  jar –cvf mypack.jar packa packb

查看jar包

  jar –tvf mypack.jar [>定向文件]

解压缩

 jar –xvf mypack.jar

自定义jar包的清单文件

 jar –cvfm mypack.jar mf.txt  packa packb

———good good study,day day up!濛濛加油中。。。。———      濛濛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值