内部类与外部类
一个类的内部定义另一个类(嵌套类nested class)
- 内部类inner class:没有使用static修饰的嵌套类
- 外部类:包含嵌套类定义代码的类
- 顶层类top-level- class:类定义不嵌套在其他类定义中的类
注意
- 顶层类不能被其他类包含
- 内部类是定义在另一个类体中的类,可以有属性和方法
- 只有类A用到类B,其他类不会用到类B,也不允许其他类使用类B
- 外部类不能直接访问内部类的成员,必须创建内部类的实例,然后使用对象名作前缀来访问内部类的成员
class Outer{ //外部类
private String outStr;
Outer(String s){
outStr = s;
}
public void outMethod() { //外部类中访问内部类成员的方法
Inner in = new Inner(); //创建内部类实例
System.out.println("outMethod访问:"+in.inStr);
in.inMethod();
}
class Inner{
public String inStr="内部类变量";
public void inMethod() {
System.out.println("inMethod访问:"+outStr);
}
}
}
public class welcome{
public static void main(String[] args) {
Outer o = new Outer("外部类变量");
o.outMethod();
Outer.Inner i = o.new Inner();
System.out.println("其他类访问:"+i.inStr);
System.out.print("其他类访问:");
i.inMethod();
}
}
输出
outMethod访问:内部类变量
inMethod访问:外部类变量
其他类访问:内部类变量
其他类访问:inMethod访问:外部类变量
抽象类
抽象类:类中没有包含足够的信息来描绘一个具体的对象
抽象方法声明
[权限修饰符] abstract 方法返回值类型 方法名(参数列表);
- 抽象方法声明只需要给出方法头,不需要方法体,直接分号;结束
- 构造方法不能声明为抽象方法
抽象类声明
[权限修饰符] abstract class 类名
{
类体
}
- 抽象类不能实例化
- 在抽象类体中,可以包含抽象方法,也可以不包含。但是抽象方法的类必须声明为抽象类
- 抽象类的子类只有给出每个抽象方法的方法体,即覆盖父类的抽象方法后,才能创建子类。如果有一个抽象方法未在子类中被覆盖,该子类也必须被声明为抽象类。
abstract class Person{
private int id;
private String name;
abstract void processingScore();
public int getId() {
return id;
}
public void setId(int id) {
this.id=id;
}
public String name() {
return name;
}
public void setName() {
this.name=name;
}
}
class Teacher extends Person{
void processingScore() {
System.out.println("input&print score");
}
}
class Student extends Person{
void processingScore() {
System.out.println("check score");
}
}
public class welcome{
public static void main(String[] args) {
Teacher t=new Teacher();
Student s=new Student();
t.processingScore();
s.processingScore();
}
}
如果在子类Student中没有覆盖抽象方法
把Student改成
class Student extends Person{
}
会报错:
Exception in thread “main” java.lang.Error: Unresolved compilation problem:
The type Student must implement the inherited abstract method Person.processingScore()