一.抽象类和接口
1.抽象类的定义:
抽象类只是在普通类的基础上扩充了一些抽象方法而已,而抽象方法指的是只进行了声明,而没有实现的方法(即就是没有方法体)。抽象类和抽象方法使用关键字 abstract 来定义。
举个例子:
abstract class A{
public A(){ this.print(); } //定义抽象方法 public abstract void print();}
2.抽象类的使用规则:
(1)所有的抽象类必须有子类(因此abstract与final不能同时使用);
(2)抽象类的子类必须覆写抽象类的所有抽象方法,[此处在覆写的时候要考虑权限问题,权限尽量都是用public](abstract与private不能同时使用)
(3)抽象类的对象可以通过多态性,利用子类对其进行实例化,而不能直接产生实例化对象
(4)子类不能通过super关键字调用父类的抽象方法
举个栗子:
abstract class Person2{
private String name;
public String getName(){
return this.name;
}
public void setName(String name){
this.name=name;
}
public abstract void getPersonInfo();
}
class Student2 extends Person2{
public void getPersonInfo(){
System.out.println("I am a student");
}
}
public class TestAbstract {
public static void main(String[] args) {
Person2 per =new Student2();
per.getPersonInfo();
}
4.接口的定义:
接口就是抽象方法与全局常量的集合,在Java中使用关键字 interface 来定义接口
5.接口的使用规则:
(1)子类如果想要使用接口,那么就必须使用implements关键字来实现接口;
(2)打破了Java中单继承的局限性,接口是多实现;
(3)对于接口的子类(不是抽象类)必须覆写接口中的全部抽象方法,之后可以利用子类的向上转型通过实例化子类来得到接口的实例化对象;
举个例子:
interface IMessage{
public static final String MsG="I am a biter";
public abstract void print();
}
interface INews{
public abstract String getNews();
}
class MessageImpl implements IMessage,INews{
public String getNews() {
return IMessage.MsG;
}
public void print() {
System.out.println(IMessage.MsG);
}
}
public class TestInterface {
public static void main(String[] args) {
IMessage msg=new MessageImpl();
msg.print();
INews news=(INews)msg;
System.out.println(news.getNews());
}
}
二.关键字
1.abstract关键字
a.可以修饰类、方法
修饰类时:不能实例化对象;必须被子类继承;
修饰方法时:没有方法体;必须写在抽象类中;必须被子类重写,若子类不重写,也声明为抽象类;
b.一般现实中不存在的事物使用抽象类;父类方法,各子类实现方式各不相同时,则此方法在父类中声明为抽象方法;
c.不能与这些关键字一起使用:private、static、final;不能修饰构造方法;
2.static关键字
a.可以修饰成员变量、成员方法、代码块、内部类
修饰成员变量时 ==> 静态变量: 在类加载时,给静态变量在方法区中分配空间,并赋初始值属于类所有,类的所有对象共享一个静态变量.访问方式: 类名.静态变量名
修饰成员方法时 ==> 静态方法:访问方式:类名.静态方法();
修饰代码块时 ==>静态代码块: 在类加载时执行,仅执行一次.修饰内部类时 ==>静态内部类:相当与静态变量,可以用访问修饰符修饰,访问方式:外部类名.内部类 名 引用名 = new 外部类名.内部类名()
b.静态变量: 所有对象共享一个变量.静态方法: 当一个方法中不关联任何一个成员变量时,与对象无关时;静态代码块:当需要加载某些外部资源时使用;静态内部类 可以用来访问外部静态成员;
c.静态成员不能直接访问非静态成员;
3.final关键字
a.可以修饰类,成员方法,成员变量,静态变量,局部变量;
修饰类时: final类不能被继承;
修饰成员方法: final成员方法不能被子类重写;
修饰成员变量:给final成员变量赋值两种方式: A、 通过构造方法赋值。B 、在声明变量时直接赋值;
修饰静态变量: 在声明的同时赋值;不可改变;==》为常量 ;命名时所有的字母大写。
修饰局部变量:基本类型仅赋值一次,不可改变;引用类型引用的“地址”不能改变,不能引用其他的对象。但所引用对象的内容是可以改变;
b.当不想成员被修改时;
c.final成员变量仅赋值一次,不可改变,默认构造方法不能给他赋初始值。在显示的构造方法赋值要在所有构造方法都赋值;