【Java基础】十二课:抽象

一:访问控制符

用来控制一个类,或者类中的成员的访问范围。

二:抽象类

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:优化父类,抽象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值