Java -- abstract 和 interface 的理解

2017-10-18  本文已影响0人  徘徊0_
一、Abstract

1,abstract class 抽象类

public abstract class Person {
    public Person() {
        System.out.println("Person抽象类,也有构造方法");
    }

    /**
     * 抽象方法(没有具体方法体),修饰符只能为protected or public 
     * 因为需要子类实现它,故不能为private...
     */
    protected abstract void eat();
    
    /**
     * 定义一个 private 非抽象方法
     * 
     */
    private void normalMedthod() {
        System.out.println("Person抽象类中的,非抽象方法");
    }
}

-------------------------------------------------------------------------

public class Student extends Person{
    public Student() {
        super();
    }
    /**
     * 子类继承抽象类
     * 需要实现该类中的抽象方法
     */
    @Override
    protected void eat() {
        System.out.println("Student中的 eat() 方法");
        
    }

}

-------------------------------------------------------------------------------
public class TestClass {

    public static void main(String[] args) {
        // 此时 抽象类引用指向子类实例
        Person person=new Student();
        person.eat();//调用的是Student中的eat();
    }
}
二、Interface

1,Interface 关键字

2,接口可以用匿名内部类来实现

public interface IPerson {

    /**
     * 默认会加上 public static final ,全局静态常量(一般不在这里定义)
     * 且 在实现类中 不可以重新赋age的值
     */
     int age = 9;
     
     void eat(); // 接口中的方法默认就是 abstract方法
     
     void play();
    
}
---------------------------------------------------------------------
    //使用 匿名内部类,实现(具体解释见下面)
    testDemo.setIPerson(new IPerson() {
            
        @Override
        public void play() {
            // TODO Auto-generated method stub
                
        }
            
        @Override
        public void eat() {
                // TODO Auto-generated method stub
                
        }
    });
------------------------------------------------------------------
    public void setIPerson(IPerson iperson) {
        //伪代码
    }

/**
 * 匿名内部类实现接口,等同使用一个类,实现该接口
 * 创建该接口的对象,并传入 到setIPerson(IPerson iperson);中
 * 涉及到向上转型。
 * 下面的这种方式,等同于上面的匿名内部类
 */
class Students implements IPerson{

    @Override
    public void eat() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void play() {
        // TODO Auto-generated method stub
        
    }
}
//setIPerson(IPerson iperson); 本来需要一个IPerson  也可以给它Student的实例,因为该类实现了 IPerson 接口
Students students=new Students();
testDemo.setIPerson(students);

3,匿名内部类的理解

new IPerson() { 
        @Override
        public void play() {
            // TODO Auto-generated method stub
                
        }

        @Override
        public void eat() {
            // TODO Auto-generated method stub
                
        }
    };
IPerson p=new IPerson() {//将其赋值给 p 对象变量。 也可以直接使用
            
            @Override
            public void play() {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void eat() {
                // TODO Auto-generated method stub
                
            }
        };
        p.eat();
        p.play();
三、抽象类 和 接口的区别

1,抽象层次不同

2,使用范围不同

3,使用对象不同

上一篇 下一篇

猜你喜欢

热点阅读