个人笔记记录
内部类
内部类:在一个类中定义另一个类;
外嵌类:包含内部类的类。
内部类和外嵌类之间的重要关系:
内部类 | 外嵌类 |
---|---|
类中的方法可以调用外嵌类中方法 | 在内部类中仍然奏效 |
不可以声明类变量和类方法 | 可以用内部类声明对象作为外嵌类的成员 |
仅供外嵌类使用,其他类不可用 |
public class InterExam {
public static void main(String[] args){
RedCow form=new RedCow("红牛农场");
form.showCow();
form.cow.speak();
}
}
class RedCow{
static String formName;
Cow cow;//内部类声明对象
RedCow(){}//构造方法
RedCow(String name) {
cow=new Cow(150,11,5000);
formName=name;
}
public void showCow(){
cow.speak();
}
class Cow{
String cowName="红牛";
int height,weight,price;
Cow(int h,int w,int p){
height=h;
weight=w;
price=p;
}
void speak(){
System.out.println("偶是"+cowName+",身高"+height+"cm 体重"+weight+"kg,生活在"+formName);
}
}//内部类结束
}//外嵌类结束
偶是红牛,身高150cm 体重11kg,生活在红牛农场
偶是红牛,身高150cm 体重11kg,生活在红牛农场
内部类对应的字节码文件名字格式:
外嵌类名$内部类名.class
非内部类不可以是staic类
匿名类
和子类有关的匿名类
允许直接使用一个类的子类的类体创建一个子类对象。
匿名类:创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为时一个子类去掉类声明后的类体。
特点 | |
---|---|
1 | 可以继承父类的方法也可以重写父类的方法 |
2 | 使用时必然是某个类中直接用匿名类创建对象,因此匿名类一定是内部类 |
3 | 可以访问外嵌类中的成员变量和方法,类体中不可以声明static成员变量和static方 法 |
4 | 是一个子类,没有类名,在创建对象时,要直接使用父类的构造方法 |
public class Example06 {
public static void main(String[] args){
Show b=new Show();
b.showM(new OutputE());//像参数传递OutputA的子类OutputE的对象
b.showM(new OutputA() {//像参数传递OutputA的匿名子类E的对象
@Override
public void output() {
for(char c='1';c<='9';c++){
System.out.printf("%3c",c);
}
}
});//分号
}
}
abstract class OutputA{
public abstract void output();
}
class OutputE extends OutputA{
@Override
public void output() {
for(char c='a';c<='z';c++)
System.out.printf("%3c",c);
}
}
class Show{
void showM(OutputA show){//参数是接口
show.output();
}
}
a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9
和接口有关的匿名类
某方法的参数是接口类型,那么使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须要重写接口中的全部方法。
public class Example08 {
public static void main(String[] args){
HelloMa m=new HelloMa();
m.turnOn((new SpeakHello() {//和接口SpeakHello有关的匿名类
@Override
public void speak() {
System.out.println("hello,you are welcome");
}
}));
m.turnOn(new SpeakHello() {//和接口SpeakHello有关的匿名类
@Override
public void speak() {
System.out.println("你好,欢迎光临");
}
});
}
}
interface SHello{
void speak();
}
class HelloMa{
public void turnOn(SpeakHello hello){
hello.speak();
}
}
hello,you are welcome
你好,欢迎光临
异常类
使用throw抛出一个Exception子类的实例表示异常发生。
1、java.lang包中的Integer类调用类方法public static int parseInt(String s)
可以将数字格式的字符串转化为int型
int number=Integer.parseInt("ab89");
定义方法时声明该方法调用过程中可能出现的异常,即允许方法调用过程中抛出异常对象,终止当前方法的继续执行。
2、异常对象可以调用如下方法得到或输出有关异常的信息
public String getMessage();
public void printStackTrace();
public String toString();
3、try-catch语句
将可能出现的一场异常操作放在try部分,一旦try部分抛出异常对象,或调用某个可能异常对象的方法,并在该方法抛出异常对象,那么try部分将立即结束执行,转向执行相应的catch部分。所有程序可能将发生异常后的处理放在catch部分。
格式:
try{
包含可能发生异常的语句;
}catch(ExceptionSubClass1 e){....
}catch(ExceptionSubClass2 e){....
}
catch参数中的异常类都是Exception的某个子类,表明try部分可能发生的异常,这些子类之间不能有父子关系,否则保留一个含有父类参数的catch即可。
public class Example08 {
public static void main(String[] args){
int n=0,m=0,t=1000;
try{
m=Integer.parseInt("8888");
n=Integer.parseInt("ab89");//发生异常,转向catch
t=7777;//没有机会被赋值
}
catch (NumberFormatException e){
System.out.println("发生异常:"+e.getMessage());
}
System.out.println("n="+n+",m="+m+",t="+t);
try {
System.out.println("故意抛出异常I/O异常!");
throw new java.io.IOException("我是故意的");//故意抛出异常
//System.out.println("这个输出语句肯定没有机会执行,必须注释,否则编译出错");
}catch (java.io.IOException e){
System.out.println("发生异常:"+e.getMessage());
}
}
}
发生异常:For input string: "ab89"
n=0,m=8888,t=1000
故意抛出异常I/O异常!
发生异常:我是故意的