抽象类:Abstract
定义:用abstract 关键字来修饰一个类时,这个类叫做抽象类,用abstract来修饰一个方法是,该方法叫做抽象方法。
----含有抽象方法的类,必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写;
----抽象类不能被实例化,一般是用来重写;
----抽象方法只需声明,而不需实现。如:public abstract void enjoy(){ };
----当一个类中有抽象方法的时候,这个类是抽象类,如:abstract class Animal{}
Final 关键字:
-final的变量的值不能被改变(包括final的成员变量,局部变量,形参)
-final的方法不能被重写
-final的类不能够被继承
public class TestFinal {
();
t.i = 9;
}
}
class T {
final int i = 8; //不允许改变
}
结果:错误;即使写t.i = 8,也会报错;
final 指向特定,只能读而不能改变;
class T {
final int i = 8; //不允许改变
public final void m(){
}
}
class TT extends T{
public void m(){
}
}
报错:m不能被覆盖(重写);
final class T {
final int i = 8; //不允许改变
public final void m(){
}
}
class TT extends T{
public void m(){
}
}
报错:不能继承;
Interface (接口):
定义:抽象方法和常量值的定义的集合。
本质上,接口是一种特殊的抽象类,这种抽象类中只包含定义常量和方法的定义,而没有变量和方法的实现。
举例:
public interface Runner {
public static final
public void start(); //不用写abstract
public void run ();
public void stop();
}
-多个无关的类可以实现同一个接口
-一个类可以实现多个无关的接口
-与继承关系类似,接口与实现之间存在多态性
-定义Java类的语法格式:
<modifier> class <name> [extends <superclass>]
[implements <interface>] [, <interface> *]
{ <declarations>*}
Interface的特性:
-接口可以多重实现,一个类可以有多个接口;
-接口中只能声明的属性为public static final;
-接口中只能定义抽象方法,方法只能是public;
-接口可以继承其他的接口,并添加新的属性和抽象方法。
实例1:
interface Singer {
public void sing();
public void sleep();
}
class Student implements Singer{ //实现接口,相当于实现接口所定义的抽象方法
private String name;
Student(String name){
this.name = name;
}
public void study(){
System.out.println("studying");
}
public String getName() {return name;}
public void sing() {
System.out.println ("student is singing");
}
public void sleep() {
System.out.println ("student is sleeping");
}
}
实例2:
interface Singer {
public void sing();
public void sleep();
}
interface Painter {
public void paint();
public void eat();
}
class Student implements Singer,Painter { // 一个类实现多个无关接口 ,Student 该成teacher,就是多个无关的类,实现同一个接口
private String name;
Student(String name){
this.name = name;
}
public void study(){
System.out.println("studying");
}
public String getName() {return name;}
public void sing() {
System.out.println ("student is singing");
}
public void sleep() {
System.out.println ("student is sleeping");
}
public void paint() {System.out.println("Student is painting");}
public void eat() {System.out.println("Student is eating");
}
所有方法必须全部实现。
实例3:
public class Test {
public static void main (String args[]){
Singer s1 = new Student ("le");
s1.sing();
s1.sleep();
Singer s2 = new Teacher ("seven");
s2.sing():
s2.sleep();
Painter p1 = (Painter) s2;
s2.paint(); s2.eat();
}
}
虽然每个new出来的对象不属于本身的类,但是,本身的对象属于哪个类就能调用本身所属类的方法,不管它是被本身的类new出来的;
这种就是呈现出了多态性,接口与实现之间存在多态性。
public interface Valuable{
public double getMoney();
}
public interface Protectable {
public void beProtected();
}
interface A extends Protectable { //接口与接口之间可以继承
void m();
}
abstract class Animal {
private String name;
abstract void enjoy();
}
class GoldenMonkey extends Animal implements Valuable , Protectable {
public double getMoney () {
return 1000;
}
public void beProtected() {
System.out.println ("live in the room");
}
public void enjoy (); {}
public void test() {
Valuable v = new GoldenMonkey() ;
v.getMoney();
Protectable p = (Protectable) v;
p.beProtected();
}
}
Add:
补充下前一篇小记的多态实例:
实例:
分析游戏物体的多态包装。
游戏:雷电
1.子弹类:各个位置的子弹是对象,飞机类:飞机1,飞机2·····;
2.如果丰富游戏,需要添加其他的类,如各种boss的出现;这种情况对编码造成了麻烦。
3.解决方法:添加一个总的父类,GameObject类,定义一个Create()方法,然后在每一个子类中,自己重写Create方法,得到需要的Object,无需修改任何。