一、内部类
- Java支持在一个类中声明另一个类,这样的类叫内部类
- 外嵌类的成员变量在内部类仍然有效
- 内部类的方法也可以调用外嵌类中的方法
- 内部类的类体中不可以声明类变量和类方法
- 外嵌类的类体可以用内部类来声明对象,作为外嵌类成员
- 内部类的只能有外嵌类使用,其他类不可以用某个内部类声明对象
RedCowForm.java
public class RedCowForm{
String formName;
RedCow cow; //声明内部类对象
RedCowForm()
{}
RedCowForm(String s){
cow= new RedCow(150,112,5000);
formName=s;
public void showComMess(){
cow.speak();
}
class RedCow{
String cowName="红牛";
int height,weight,price;
RedCow(int h,int w,int p){
height=h;
weight=w;
price=p;
}
void speak()
{System.out,println("偶是"+cowName+",身高:"+height+
"cm 体重"+weight+"kg, 生活在"+formName);
}
}
}
main.java
public class Example{
public static main(String arg[])
{RedCowForm form =new RedCowForm("红牛农场");}
form.showCowMess();
}
二、匿名类
- Java允许直接用一个类的子类的类体创建子类对象,也就是说创建子类对象的时候,除了使用父类的构造方法外还有类体,此类体叫匿名类;
- 匿名类是一个子类,当没有显示声明,所以不能用匿名类声明对象,但却可以直接用匿名类创建一个对象;
- 匿名类可以继承父类的方法,也可以重写父类的方法;
- 匿名类一定是内部类,匿名类类体不能声明static成员变量或方法
- 匿名类的创建需要用父类的构造方法,且类体写在后面
- 匿名类创建对象没有经过类声明步骤,但匿名类对象的引用可以传递给一个匹配的参数,匿名类的常用方式是向方法的参数传值
abstract class A{
public abstract void put();
}
class B extends A
{
public void put()
{System.out.println("这是电视");}
}
class C
{
void showMess(A show)
{show.put();}
}
public class Example{
public static void main(String arg[]){
C board=new C();
board.showMess(new B());//这里用了接口回调
board.showMess(new A()//这是匿名类
public void put()
{System.out.println("这是冰箱");}
);
}
这里没有一个A 的子类专门输出“这是冰箱”,所以可以用匿名类对象引用传递参数
与接口有关的匿名类
- Java允许直接用接口名和一个类体创建一个匿名对象,该类被认为实现了该接口且去掉类声明的只有类体的类
已知 Computable 是接口
void show(Computable a) 该函数要求接口类型对象作为参数
{}
那么可以创建匿名类
void show(new Computacle(){ 实现接口方法 + 自身扩展});
{}
三、异常类
- Java 异常出现在方法调用过程中,即运行过程中出现异常抛出异常对象,终止当前方法执行;
- 异常对象可以调用以下方法输出异常的信息:
public String getMessage();
public void printStackTrace();
public String toString();
- try-catch 语句允许多个catch语句
- 各个catch中的参数的异常类都是Exception的某个子类
- 这些类不能有父子关系,否则保留一个含有父类的参数的catch就行
- java.lang 包中的Integer类调用其类方法:
public static int parsenInt(String s) 可以将字符串s 中的数字转化为真正的数字;
public class Example{
public static void main(String arg[]){
int n=0,m=0,t=1000;
try{m=Integer.parseInt("8888");
n=Integer.parseInt("ab89");
t=777;
}
catch(NumberFormatException e){
System,out,println("发生异常:"+e.getMessage());
}
System.out.println("n="+n+",m="+m+",t"+t);
}
finally 语句
- 无论在try部分是否发生异常,finally语句都会被执行
- 当 try-catch 语句中执行了return 语句,那么finally 子语句仍然会被执行
- try-catch语句执行了程序退出代码,即执行System.exit(0);则不执行finally语句
断言
- 断言是当该程序加入断言语句時,那么程序出现错误时,在断言语句出程序立即体质执行
- assert booleanExpression
- assert booleanExpression
- assert booleanExpression : messageExpression
- booleanExpression 取值为ture 时,程序出现异常,当不会停止执行,当false 时立即停止执行;当出现异常时输出messageExpression 表达式的值;
import java.util.Scanner;
public static void main(String args[]){
int p[] score={-120,98,89,120,99};
int sum=0;
for(int number:score){
assert number>0:"负数不能是成绩";
sum=sum+number;
}
System.out.println("总成绩:"+sum);
}
}