概念:
类:用来描述具有共同性质的一组事物的自定义复合数据类型
类:class关键字创建
public class Hello{} ---> 类
抽象类: 通过abstract 修饰的java类就是。
public abstract class Hello{} --> 抽象类
1)为什么要有抽象类?
例如:
坐车收费,出租车有收费功能【1元/公里】,
公交车有收费功能【全程1元】。
出租车/公交车----->汽车--->收费功能
出租车 extends 汽车 ---->重写收费功能 = 【1元/公里】
公交车 extends 汽车 --->重写收费功能 =【全程1元】
我们可以理解为汽车就是一个抽象类,出租车/公交车都是汽车的子类,出租车/公交车就会从汽车中继承来收费功能然后在根据自身的实际情况,重写收费功能就可以得到属于自己的收费功能实现。
抽象类的子类往往都是同一种类型。
抽象类实际上就是提供同一种类型事物的公共内容,由抽象类的子类根据自身的实际情况,来实现这个抽象类提供的公共内容。这样子类就不需要创建这个公共内容,只需要继承来重写一下就好。
抽象的部分 子类如果不是抽象类,那么这个重写就是强制性的,必须重写
2)抽象类中可以有哪些元素?
局部变量不能在其他的方法中访问(不需要考虑)
类 : 实例变量,静态成员变量,构造方法,实例方法,静态方法
抽象类: 实例变量,静态成员变量,构造函数,实例方法,静态方法,[抽象类](可有可无)。
误区 : 判断一个类是不是抽象类不是看有没有抽象方法。而是看 当前类有没有abstract 修饰
方法基本格式:
修饰符 返回值 名称([参数]){方法体}
实例方法:
修饰符 返回值 名称([参数]){方法体}
静态方法:
修饰符 static 返回值 名称([参数]){方法体}
构造方法:
修饰符 类名([参数]){方法体}
抽象方法:
修饰符 abstract 返回值 名称([参数])
抽象方法: 使用abstract修饰的没有方法体的方法
例子:
public abstract class AbstractTest {
public static String name = "张三";
public int age = 16;
public AbstractTest(){
System.out.println("抽象类的构造方法");
}
public void methods(){
System.out.println("抽象类的实例方法");
}
public static void staticMethods(){
System.out.println("抽象类的静态方法");
}
//抽象方法
public abstract void fn();
}
3)抽象类的具体用法
(1).抽象类不能new,借助子类访问抽象类中的实例元素。
(2).普通的java类继承了抽象类,就需要重写抽象类中的所有抽象方法,否则将这个普通的java类改成抽象类。
(3).抽象类可以继承其他的抽象类,可以不用重写抽象方法。
(4).利用上转型对象创建出抽象类对象
(5).抽象类对象可以访问抽象类中的实例变量、类变量、构造方法、实例方法、类方法、【抽象方法实际上是子类重写以后的方法】。
(6).当某一个普通的java类中的方法参数是抽象类类型的时候,可以传递上转型对象,也可以是抽象类的子类对象。
例子(2)(3):
① 普通类继承抽象类
class Fdr extends AbstractTest1{
@Override
public void fn() {
// 必须实现这个方法
}
}
② 抽象类继承抽象类
Class abstract Fdr extends AbstractTest1{
// 可以不实现这个方法
}
//抽象类
abstract class AbstractTest1 {
public static String name = "张三";
public int age = 16;
public AbstractTest1(){
System.out.println("抽象类的构造方法");
}
public void methods(){
System.out.println("抽象类的实例方法");
}
public static void staticMethods(){
System.out.println("抽象类的静态方法");
}
//抽象方法
public abstract void fn();
}
例子(4)
利用上面的例子:
AbstractTest1 abt = new Fdr();
抽象类 变量 = new 子类();
这个子类必须继承声明的抽象类,并且子类不能是new 的子类不能是抽象类
例子(5)(6)
public class MainTest1 {
public static void main(String[] args) {
AbstractClass b = new B();
b.sayHi();
((B) b).methods(); //强制转换成子类不然报错
}
}
//抽象类
abstract class AbstractClass {
public String name = "李四";
//抽象说方法
public abstract void sayHi();
}
//B类继承抽象类
class B extends AbstractClass{
@Override
// 重写AbstractClass类中得抽象方法
public void sayHi() {
System.out.println("你好呀" + super.name);
}
public void methods(){
System.out.println("我是实例方法");
}
}
4)上转型对象
1.上转型对象:子类的对象赋值给父类的变量,此时子类对象就向上转型成父类对象
格式:
父类 父类变量名 = new 子类();
2.上转型对象不能方法子类本身的变量和方法,如果我们需要访问子类本身的变量和方法,需要通过强制类型转
格式 :
子类 子类变量名 = (子类)父类变量名;
格式 :
子类 子类变量名 = (子类)父类变量名;
抽象类例子解析:
卖水果实例↓
1.需要有一个容纳水果得水果地类
2.需要可以购买水果得方法
3.有各种不同的水果
4.水果有不同的名字
5.水果有颜色
抽象类应该 :
水果的名,颜色,(是否可以卖),抽象方法:生产方法
苹果类:实现父类的方法
香蕉类:实现父类的方法
店铺类:
属性:店铺名字
方法:进水果:店铺到对应的水果地里进相应水果
public class BuyFruits {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 进了10斤红的苹果
// 进了10斤白的苹果
// 进了20斤黄香蕉
Fruites f1 = new Ipone("苹果", '红', true);
Fruites f2 = new Ipone("苹果", '白', true);
Fruites f3 = new Banana("香蕉", '黄', true);
ShopFruites xiaohong = new ShopFruites(); //创建一个多多水果店
//卖水果进行售卖
xiaohong.buyFruits(f1);
xiaohong.buyFruits(f2);
xiaohong.buyFruits(f3);
}
}
/*
*
* 店铺类
* */
class ShopFruites{
public String name ="多多水果店";
public void buyFruits(Fruites fruites){
//是否可以买
if (fruites.isBuy) {
switch (fruites.name) {
case "苹果":
if (fruites.isBuy) {
//默认 苹果只有10斤
int f = fruites.productNmubs(10);
System.out.println("一共有"+f+"斤");
}
break;
case "香蕉":
if (fruites.isBuy) {
//默认 香蕉只有20斤
int f = fruites.productNmubs(20);
System.out.println("一共有"+f+"斤");
}
default:
break;
}
}
}
}
/**
* 水果类
* */
abstract class Fruites{
public String name;
public char color;
public boolean isBuy;
public Fruites(String name,char color,boolean isBuy) {
// TODO Auto-generated constructor stub
this.name = name;
this.color = color;
this.isBuy = isBuy;
}
public abstract int productNmubs(int i);
}
//生产苹果地
class Ipone extends Fruites{
public Ipone(String name, char color, Boolean isBuy) {
super(name, color, isBuy);
// TODO Auto-generated constructor stub
}
@Override
public int productNmubs(int nums){
if (isBuy) {
return nums;
}
return 0;
}
}
//生产香蕉地
class Banana extends Fruites{
public Banana(String name, char color, Boolean isBuy) {
super(name, color, isBuy);
// TODO Auto-generated constructor stub
}
@Override
public int productNmubs(int nums){
if (isBuy) {
return nums;
}
return 0;
}
}
无奈源于不够强大