您的位置:首页 > 职场人生

抽象类和接口的基本概念 推荐

2008-08-05 17:19 302 查看

3.1、抽象类

抽象类实际上也是一个类,只是与之前的普通类相比,在抽象类中多了抽象方法。
抽象方法是只声明而未实现的方法,所有的抽象方法必须使用abstract关键字声明,包含抽象方法的类也必须使用abstract class声明。
一个抽象类的定义
abstract class A{
private String name = "WWW" ;
public void fun(){
// 此处定义了一个普通方法
System.out.println("Hello World!!!") ;
}
public abstract void print() ;[/b]
};
可以发现抽象方法后面没有“{}”,则表示方法没有实现。
如果对抽象方法直接实例化,则会出现无法实例化的错误。
abstract class A{
private String name = "WWW" ;
public void fun(){
// 此处定义了一个普通方法
System.out.println("Hello World!!!") ;
}
public abstract void print() ;
};
public class Demo01{
public static void main(String args[]){
A a = new A() ;[/b]
}
};
抽象类的使用原则:[/b]
1、 抽象类必须有子类,抽象类必须被继承
2、 抽象类的子类如果不是抽象类的话,则必须覆写里面的全部抽象方法。
3、 抽象类不能直接实例化,必须依靠子类完成。
进一步完善之前的程序:
abstract class A{
private String name = "WWW" ;
public void fun(){
// 此处定义了一个普通方法
System.out.println("Hello World!!!") ;
}
public abstract void print() ;
};
class B extends A{
// 覆写抽象方法
public void print(){
System.out.println("**********************") ;
}
};
public class Demo02{
public static void main(String args[]){
B b = new B() ;
b.print() ;
b.fun() ;
}
};
讨论问题:[/b]
1、 能否用final修饰一个抽象类呢?
· 因为抽象类必须被子类继承,而被final修饰的类不能有子类。所以不能
2、 抽象类中能否有构造方法呢?可以有
abstract class Person{
private String name ;
private int age ;
// 单独按一个类来说,应该可以直接在构造方法中初始化
public Person(String name,int age){[/b]
this.name = name ;[/b]
this.age = age ;[/b]
}[/b]
public abstract String getInfo() ;
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
};
class Student extends Person{
private String school ;
public Student(String name,int age,String school){
super(name,age) ;[/b]
this.school = school ;
}
public String getInfo(){
return "姓名:"+super.getName()+",年龄:"+super.getAge()+",学校:"+this.school ;
}
};
public class Demo03{
public static void main(String args[]){
Student stu = new Student("张三",30,"北京大学") ;
System.out.println(stu.getInfo()) ;
}
};
抽象类中可以有构造方法,但是要求在没有无参构造方法的时候,子类必须明确的调用父类中的构造方法。
回顾:[/b]子类对象的实例化过程
· 子类对象实例化的时候默认会先去调用父类中的无参构造方法,如果父类中没有无参构造,则可以通过super指定调用父类中的其他构造方法。
注意:[/b]
一个类只可以继承一个抽象类,属于单继承。

3.2、接口

[/b]接口定义:[/b]
· 只包含抽象方法和全局常量的类称为接口。
· 接口使用interface进行定义。
interface A{
public static final String INFO = "HELLO" ;
public abstract void print() ;
}
接口定义完之后,一个接口也必须依靠其子类使用,子类继承接口的概念称为实现。格式如下:
class 子类 implements 接口名称{}
接口的子类如果不是抽象类的话,则也必须覆写里面的全部抽象方法。
interface A{
public static final String INFO = "HELLO" ;
public abstract void print() ;
}
class B implements A{
public void print(){
System.out.println(INFO) ;
}
};
public class Demo04{
public static void main(String args[]){
B b = new B() ;
b.print() ;
}
};
接口与抽象类相比,有一个优点:说一个子类只能继承一个父类,但是可以同时实现多个接口,也就说是通过接口完成多继承。
class 子类 implements 接口A,接口B
interface A{
public static final String INFO = "HELLO" ;
public abstract void print() ;
}
interface C{
public static final String PARAM = "WWW" ;
public abstract void fun() ;
}
class B implements A,C{
public void print(){
System.out.println(INFO) ;
}
public void fun(){
System.out.println(PARAM) ;
}
};
public class Demo05{
public static void main(String args[]){
B b = new B() ;
b.print() ;
b.fun() ;
}
};
问题:[/b]
既然,接口中的一切方法都是抽象方法,接口中的一切变量都是全局常量,那么实际上接口就可以简化成如下的形式定义。
interface A{
// public static final String INFO = "HELLO" ;
String INFO = "HELLO" ;
// public abstract void print() ;
void print() ; //à 此处虽然没有明确的写出权限,但实际上权限是public[/b]
}
一定要明确:接口中的一切方法都是public访问权限,所以在子类实现方法的时候访问权限必须是public。写与不写是一样的。所以有时候为了避免此种情况,还是建议写上:public
public void print() ;[/b]

那么如果一个类继承继承一个抽象类又要实现一个接口,则必须按照以下格式完成:
class 子类 extends 父类(一般都是抽象类) implements 接口A,接口B

interface A{
// public static final String INFO = "HELLO" ;
String INFO = "HELLO" ;
// public abstract void print() ;
void print() ;
}
abstract class X{
public String param = "hello" ;
abstract void fun() ;
};
class B extends X implements A{
public void print(){
System.out.println(INFO) ;
}
void fun(){
System.out.println(INFO) ;
System.out.println(param) ;
}
};
public class Demo07{
public static void main(String args[]){
B b = new B() ;
b.print() ;
}
};
[/b]
开发原则:[/b]
在开发中一定要记住,一个类往往很少去继承一个已经实现好的类,即:普通类之间不能互相继承。

注意点:[/b]
1、 一个抽象类可以实现多个接口,但是一个接口不能继承一个抽象类。
interface A{
// public static final String INFO = "HELLO" ;
String INFO = "HELLO" ;
// public abstract void print() ;
void print() ;
}
abstract class X implements A[/b]{
public String param = "hello" ;
abstract void fun() ;
};
2、 一个接口可以同时继承多个接口,即:实现多继承关系
interface 子接口 extends 父接口A,父接口B,父接口C
interface A{
public void printA() ;
}
interface B{
public void printB() ;
}
interface C{
public void printC() ;
}
interface X extends A,B,C{
public void printX() ;
};
class Y implements X{
public void printA(){}
public void printB(){}
public void printC(){}
public void printX() ;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息