final关键字:
final是一个修饰符,可以修饰类,方法,变量
为什么要用final修饰变量?
在程序中如果一个数据是固定的,就给该数据起个名称,而且这个变量名称的值不能变化,所以加上final固定。
final关键字的特点:
1 / final修饰类:final修饰类是最终类,该类不能被继承。
2 / final修饰方法:final修饰的方法,不能被重写。
3 / final修饰变量:final修饰的变量是一个常量,只能赋值一次,不能被重新赋值。
final修饰局部变量的问题:
基本类型:是基本类型的值不能发生改变。
引用类型:是引用类型的地址值不能发生改变,但是该对象堆内存的值是可以改变的。
final修饰变量的初始化时机:
1 / 被final修饰的变量只能赋值一次。
2 / 在构造方法完毕前赋值(非静态的常量)
**常量名所有字母用大写,两个单词间用下横线:MY_PI
**变量名第一个单词首字母小写,后继单词首字母大写:myPi
**函数名第一个单词首字母小写,后继单词首字母大写+(): myPi( )
——————————————————————————————————————————————————
抽象类
关键字:abstract
格式:
abstract class 类名 { }
public abstract void 方法名();(抽象方法不能有{ }花括号)
一个没有方法体的方法应该定义为抽象方法,
类中如果有抽象方法,该类必须定义为抽象类。
范例:
abstract class 犬科//抽象功能所在的类也必须用abstract修饰成抽象类
{
abstract void 吼叫();//抽象功能用abstract关键字修饰 ,只有声明,没有方法体(没有{}花括号)
}
class 狗 extends 犬科//继承了父类
{
void 吼叫()//一样的功能声明
{
System.out.println("汪汪");//不一样的功能
}
}
class 狼 extends 犬科//继承了父类
{
void 吼叫()//一样的功能声明
{
System.out.println("嗷嗷");//不一样的功能
}
}
抽象类的特点:
1/方法只有声明,没有实现时,该方法就是抽象方法,需要被abstract修饰。
抽象方法必须定义在抽象类中,该类必须也被abstract修饰
2/抽象类不可以被实例化(不能被new创建对象)。
3/抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则,这个子类还是抽象类。
4/抽象类的子类是一个抽象类。
抽象类的实例化是靠具体的子类实现的,是多态的方式。
抽象类的成员特点:
1 / 成员变量: 既可以是变量,也可以是常量。
2 / 构造方法:有,用于子类访问父类数据的初始化。
3 / 成员方法:即可以是抽象的,也可以是非抽象的方法。
抽象类的成员方法特性:
1/ 抽象方法 :强制要求子类做的事情。
2/ 非抽象方法:子类继承的事情,提高代码复用性。
抽象类可以不定义抽象方法么?
可以。但是很少见,目的就是不让该类创建对象。AWT的适配器对象就是这种类。
抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类。
一个类如果没有抽象方法,可以定义为抽象类,意义在于不让创建对象。只能通过子类去访问。
抽象关键字不可以和哪些关键字共存?
private 不行。抽象方法要被覆盖,私有后无法覆盖。
static 不行,无意义。抽象是没有方法体的,静态可使用类名直接调用,调用无方法体的方法无意义。
final 不行。final修饰的方法不能被覆盖,抽象类需要被子类覆盖。
抽象类和一般类的异同点:
相同点:抽象类和一般类都是用来描述事物的,都在内部定义了成员。
不同点:
1/一般类有足够的信息描述事物。
抽象类描述事物的信息有可能不足。
2/一般类中不能定义抽象方法。
抽象类中可定义抽象方法,同时也可以定义非抽象方法。
3/一般类可以被实例化。
抽象类不可以被实例化。
抽象类一定是个父类么?
是的。因为需要子类覆盖其方法后才可以对子类实例化。
练习01:猫狗案例
/*
猫狗案例
*/
//定义一个Animal的抽象类
abstract class Animal
{
public abstract void eat();//定义抽象方法。抽象方法没有方法体。
public abstract void sleep();
}
//定义一个Cat类,继承抽象类Animal
class Cat extends Animal
{
public void eat()//定义一个实例方法重写抽象类中的抽象方法
{
System.out.println("小猫抓老鼠吃");
}
public void sleep()//定义一个实例方法重写抽象类中的抽象方法
{
System.out.println("小猫躺着睡觉");
}
public void playGame()//定义一个cat类特有方法
{
System.out.println("小猫玩耍");
}
}
//定义一个Dog类,继承抽象类Animal
class Dog extends Animal
{
public void eat()
{
System.out.println("小狗吃骨头");
}
public void sleep()
{
System.out.println("小狗站着睡觉");
}
public void lookHome()
{
System.out.println("小狗看家");
}
}
class AnimalTest_01
{
public static void main(String[] args)
{
Animal c = new Cat();//多态。定义一个cat对象
c.eat();
c.sleep();
Cat c1 = (Cat)c;//向下强转,用来调用Cat类中的特有方法
c1.playGame();
System.out.println("------------------------");
Animal d = new Dog();
d.eat();
d.sleep();
Dog d1 = (Dog)d;
d1.lookHome();
}
}