一:访问控制符
用来控制一个类,或者类中的成员的访问范围。
二:抽象类
Java中可以定义没有方法体的方法,该方法由其子类来实现,这样的方法我们称为抽象方法,包含抽象方法的类称为抽象类。抽象方法可以理解为只有方法声明,没有方法体的特殊方法。
特点:
1、通过关键字abstract定义,可以修饰方法或者类
2、抽象类中可以没有抽象方法,但是如果类中有抽象方法,该类必须定义成抽象类
3、子类继承抽象类以后,要么还是一个抽象类,要么重写所有的抽象方法
4、多用于多态中
5、抽象类不可以被实例化
练习一:特点测试
//如果类里有了抽象方法,那这个类必须是抽象类
//1、通过关键字abstract定义。
//2、可以修饰方法或者类
//3、抽象类中可以没有抽象方法
//4、如果类中有抽象方法,该类必须定义成抽象类
//5、子类继承抽象类以后,要么还是一个抽象类,要么重写所有的抽象方法
//6、多用于多态中
//7、抽象类不可以被实例化
public class Test1_Abstract {
public static void main(String[] args) {
//创建多态对象测试 抽象多用于多态中
Animal animal=new Dog();//父类引用指向子类
animal.eat();//编译向左看齐-》父类 运行看右边-》子类
animal.sleep();
// Animal animal=new Cat();不能创建对象,抽象类不能实例化
}
}
//如果类里包含抽象方法,那么这个类就必须是抽象类
abstract class Animal{
/*
* 经过分析之后,发现写了父类的方法体,也不会被使用,所以干脆父类不提供了
* 通过abstract声明,只有声明,没有方法体。
* */
public abstract void eat();
/*
* 这个方法体不会被修改,所以继续提供
*/
public void sleep() {
System.out.println("animail sleep()....");
}
}
/*
* 子类继承抽象类以后,有两个选择
* 1是一个抽象类
* 2把所有的抽象方法都重写
* */
//1 定义成抽象类
abstract class Cat extends Animal{
}
//2 把所有抽象方法都重写
class Dog extends Animal{
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("Dog()....");
}
}
结果:
三:抽象类中的构造方法
虽然抽象类不能实例化,但是它也是有抽象方法的,这个抽象方法是给子类用。在子类中默认隐藏着一个super()使得子类可以使用父类的成员。
练习一:
//抽象类构造方法的使用
public class Test2_UseAbstract {
public static void main(String[] args) {
AbstractDemo ab=new AbstractSub();
}
}
abstract class AbstractDemo{
//抽象类也是有构造方法的,虽然自己不能实例化,但是可以给子类用。
public AbstractDemo() {
System.out.println("抽象类的构造方法!");
}
}
class AbstractSub extends AbstractDemo{
//子类有父类的构造方法super();
//子类有自己的构造public AbstractSub(){}
}
结果:
四:抽象类中的成员变量
抽象类里,可以由变量也可以有你常量,在抽象类中定义的成员变量可以被调用也可以被获取,但是再其中定义的常量(final)可以获取,不能被修改。
练习一:抽象类的成员变量
//抽象类成员变量的使用
public class Test_UseAbstract {
public static void main(String[] args) {
Animal3 an3=new Dog3();
an3.name="小红";//可以修改
System.out.println(an3.name);//可以获取
// Animal3.MAX_VALUE=18;//常量不能修改
System.out.println(Animal3.MAX_VALUE);
}
}
abstract class Animal3{
//抽象类中可以提供变量
String name="大黄";
public static final byte MAX_VALUE=18;
}
class Dog3 extends Animal3{
}
结果:
五:抽象类中的成员方法
抽象类的子类,对于普通方法,可以重写也可以不重写,如果重写,子类实例化之后调用的是重写后的方法,如果不重写,调用的是父类抽象类的方法。对于抽象方法,有两条路,要么子类是抽象类(不能实例化),要么重写全部的抽象方法。实例化后调用的是子类重写后的方法。
练习一:成员方法的用法
//测试抽象类中的成员方法
//抽象类很灵活,灵活在其中既有普通方法,又有抽象方法
public class Test3_UseAbstract {
public static void main(String[] args) {
Animal4 an4=new Dog4();
an4.eat();
an4.sleep();
}
}
//如果不想类被实例化,可以将类设置成抽象方法,里面没有抽象方法也没关系。
abstract class Animal4{
//普通方法
public void eat() {
System.out.println("普通方法eat()...");
}
//抽象方法
public abstract void sleep();
public abstract void game();
}
class Dog4 extends Animal4{
@Override
public void sleep() {
// TODO Auto-generated method stub
System.out.println("抽象方法sleep().....");
}
@Override
public void game() {
// TODO Auto-generated method stub
System.out.println("抽象方法game().....");
}
}
结果:
抽象类的使用:
1:看有几个事物,设计几个类
2:将共性的功能,属性提取出来,作为父类
3:优化父类,抽象