多态
概述
同一个对象在不同时刻表现出的不同形态
前提和体现
1.有子类继承父类
2.子类有方法重写
3.父类引用指向子类对象 animal a=new cat()
编译看左边,运行看右边
a只能获得animal中的属性,也只能调用animal中的方法,但如果子类中重写过该方法,则依照重写的方法运行。
抽象类
概述
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
特点
1.抽象类中可以有非抽象方法、属性(和普通类一样)
2.抽象类不能直接创建对象,得用多态的形式创建对象
内部类
概述
在一个类中定义一个类
特点
1.内部类可以访问外部类中的所有属性(包括私有)
2.外部类不能直接访问内部类的属性和方法,需要先创建一个内部类对象
class Animal{
public int age=10;
private int weight =20;
public class Cat//内部类{
public int age =30;
public void show(){
System.out.println(Animal.this.age);//内部类能调用外部类的属性
System.out.println(age);
System.out.println("我是猫猫");
}
}
public void method(){
// show; 外部类不能直接调用内部类的方法和属性
Cat c=new Cat();
c.show();
}
}
public class Test{
public static void main(String[] args) {
Animal a=new Animal();
a.method();
}
}
成员内部类
概述
在类的成员位置的内部类
外界创建内部类对象
如果内部类是public的,那么创建格式为Outer.Inner oi=new Outer().new Inner()
EX:Animal.Cat c=new Animal().new Cat()
如果是private,那么在外界就不能创建
局部内部类
概述
局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用该类可以直接访问外部类的成员,也可以访问方法内的局部变量
匿名内部类
前提
存在一个类或者接口,可以是具体类也可以是抽象类
interface inner//一个接口{
void show();
}
class outer{
public void method(){
/*new inner(){
@Override
public void show() {
System.out.println("芜湖起飞!");
}
}.show();//new inner就相当于一个对象,如果不加后面这个.show就无法调用show方法
*/
inner i=new inner(){
@Override
public void show() {
System.out.println("芜湖起飞!");
}
};
i.show();
}
}
class test{
public static void main(String[] args) {
outer ot=new outer();
//ot.inner.show();//方法中的子类不能创建对象
ot.method();
}
}
本质
是一个继承了该类或者实现了该接口的子类匿名对象
作用
匿名内部类的使用,避免了要创建接口的实现类的麻烦事
interface fly //一个接口{
void show();
}
class airport implements fly//一般方法中实现接口的类 {
@Override
public void show() {
System.out.println("我的飞机要起飞啦!");
}
}
class air {
void method(fly i) {
i.show();
}
}
public class test {
public static void main(String[] args) {
/*
air a = new air();
fly f = new airport();
a.method(f);
太过繁琐,可替换成下面的匿名内部类
*/
air a=new air();
a.method(new fly() {
@Override
public void show() {
System.out.println("我们的飞机要起飞咯!");
}
});//匿名内部类的使用,避免了要创建接口的实现类的麻烦事
}
}