写在前面:本文章来自于在学习过程中的总结,供大家参考。因水平有限,博客中难免会有不足,恳请大佬们不吝赐教!
内部类
Java支持在一个类中定义另一个类,这样的类称为内部类,而包含内部类的类称为内部类的外嵌类。
内部类与外嵌类的关系:
- 外嵌类的成员变量在内部类中仍然有效,内部类的方法可以调用外嵌类中的方法。
- 内部类中不能声明类变量或类方法,外嵌类中可以使用内部类声明的成员,作为外嵌类的成员。
- 内部类仅限它的外嵌类使用,其他类不可以使用某个类的内部类声明对象。
class OuterClass{
String name;
InnerClass innerClass;//内部类声明对象
OuterClass(){
innerClass=new InnerClass();
name="外部类";
}
void show(){//内部调用内部类的方法
innerClass.speak();
}
class InnerClass{//内部类的声明
void speak(){
System.out.println("我是内部类( ̄▽ ̄)");
}
}
}
public class test{
public static void main(String[] args) {
OuterClass outerClass=new OuterClass();
outerClass.show();
outerClass.innerClass.speak();
}
}
结果:
我是内部类( ̄▽ ̄)
我是内部类( ̄▽ ̄)
匿名类
和子类有关的匿名类
Java允许我们使用一个类的子类的类体船舰一个子类对象,也就是说,创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为时一个子类去掉类声明后的类体,称作匿名类。
假设Bank是类,那么下列代码就是用Bank的一个子类(匿名类)创建对象。
new Bank(){
//匿名类的类体
}
匿名类的特点:
- 匿名类可以继承父类的方法也可以重写父类的方法。
- 使用匿名类,必然是某个类中创建对象,所以匿名类一定是内部类。
- 匿名类可以访问外嵌类的成员变量和方法,匿名类中不能声明类变量和类方法。
- 由于匿名类是一个子类,但没有类名,所以匿名对象的引用可以传递给一个匹配的参数。
abstract class A{
public abstract void speak();
}
class B extends A{
@Override
public void speak() {
System.out.println("我是子类");
}
}
class Show{
void show(A a){
a.speak();
}
}
public class test{
public static void main(String[] args) {
B b=new B();
Show show=new Show();
show.show(b);
show.show(new A()
{
@Override
public void speak() {
System.out.println("我是匿名类");
}
});
}
}
结果:
我是子类
我是匿名类
和接口有关的匿名类
假设Computable是一个接口,那么Java允许直接用接口名和一个类体创建一个匿名对象。
new Computable(){
//实现接口的匿名类的类体
}
interface SpeakHello{
void speak();
}
class Show{
public void show(SpeakHello hello){
hello.speak();
}
}
public class test{
public static void main(String[] args) {
Show show=new Show();
show.show(new SpeakHello() {
@Override
public void speak() {
System.out.println("第一个匿名类说:你好");
}
});
show.show(new SpeakHello() {
@Override
public void speak() {
System.out.println("第二个匿名类说:你好");
}
});
}
}
结果:
第一个匿名类说:你好
第二个匿名类说:你好
异常类
try-catch语句
Java使用try-catch语句来处理异常,将可能发生异常操作放在tey部分,一旦try部分抛出异常对象,或调用某个可能抛出异常对象的方法,并且该方法抛出了异常对象,那么try部分将停止,转而执行相应的catch部分。
try{
包含可能发生异常的语句
}
catch(ExceptionSubClass1 e){
}
catch(ExceptionSubClass1 e){
}
public class test {
public static void main(String[] args) {
try{
int a[]=new int [2];
System.out.println("NUM = "+a[3]);
}
catch (ArrayIndexOutOfBoundsException e){
System.out.println(e);
}
}
}
结果:
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 2
自定义异常类
可以扩展Exception类定义自己的异常类,然后根据程序的需要来规定那些方法产生的异常。一个方法在声明式可以使用throws关键字声明要产生的若干个异常。
//自定义异常类
class BankException extends Exception{
String message;
BankException(){
message="发生银行异常";
}
public String warnMess(){
return message;
}
}
class Bank{
private int money;
public void income(int change)throws BankException{
money+=change;
if(money<0){
throw new BankException();
}
System.out.println("余额:"+money);
}
public int getMoney() {
return money;
}
}
public class test{
public static void main(String[] args) {
Bank bank=new Bank();
try{
bank.income(100);
bank.income(-200);
bank.income(300);
}
catch(BankException e){
System.out.println(e.message);
}
}
}
结果:
余额:100
发生银行异常
断言
当发生某个错误时,要求程序必须立即停止执行。
IDEA中开启断言的方法:
//断言
public class test{
public static void main(String[] args) {
int []score={-120,10,60,20,80};
int sum=0;
for(int num:score){
assert num>=0:"负数不能是成绩";
sum+=num;
}
System.out.println("总成绩:"+sum);
}
}
结果:
Exception in thread "main" java.lang.AssertionError: 负数不能是成绩
at abnormal.test.main(test.java:62)
由于水平有限,博客难免会有不足,恳请大佬们不吝赐教!