抽象类

抽象类

可以使用java中的抽象类来实现,用abstract来修饰Pet类。

抽象类不能通过new实例化

抽象类和抽象方法的特点
  1. 抽象类和抽象方法都通过abstract关键字来修饰
  2. 抽象类不能实例化。抽象类中可以没有、有一个或多个抽象方法,甚至全部方法都可以是抽象方法
  3. 抽象方法之一方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重写所有的抽象方法才能实例化,否则子类还是一个抽象类。

抽象类可以有构造方法,其构造方法可以被本类的其他构造方法调用,若此构造方法不是有private修饰,也可以被本类的子类中的构造方法调用。

抽象类的使用原则

所有抽象类必须有子类 :(abstract与final不能同时出现,编译出错)

//抽象类的定义与使用
abstract final class Person{//此处报错  abstract与final关键字不能同时出现
    static int num=10;
    public abstract void print();
} 
public class Test16{
    public static void main(String[] args){
        System.out.println(Person.num);
    }
}

如果子类不是抽象类 ,子类必须覆写抽象类(父类)的所有抽象方法。(子类是抽象类则可以不要求全部覆写)

abstract class Person{
    abstract void print();
    abstract void fun();
}
class Student extends Person{
    static int num=10;
    public void print(){}
    //public void fun(){}//报错
}
public class Test17{
    public static void main(String[] args){
       // Person per = new Student();
       //Student stu = new Student(); 
    System.out.println(Student.num);
    }
}

抽象类可以使用子类向上转型对其实现实例化,抽象类一定不能直接实例化对象(无论是否有抽象方法)

abstract class Person{
   public abstract void print();
  
}
class Student extends Person{
    public void print(){
        System.out.println("hello i am student");
    }
}
public class Test19{
    public static void main(String[] args){
        //Person per = new Student();
        Person per = new Person();//此处报错
        per.print(); 
    }
}

//正确写法:
public class Test19{
    public static void main(String[] args){
        Person per = new Student();//正确写法  由子类向上转型实现实例化
        per.print(); 
    }
}

由于抽象类强制要求子类覆写父类方法,所以private 与 abstract 不能同时使用。(private 修饰私有属性,被private修饰的属性和方法不能被外部使用)

abstract class Person{
   private abstract  void print();//此时报错  private 与 abstract不能同时使用
}
class Student extends Person{
     public void print(){
     System.out.println("hello world");
   }
}
public class Test18{
    public static void main(String[] args){
        Person per = new Student();
    }
} 

final 修饰符

用来修饰类,标示该类不能被继承,类里的方法都是默认final方法,不能被重写。

用来修饰变量。这个变量就是常量,不能被修改,只能被赋值一次。当final修饰基本数据类型时一旦在初始化后便不能发生变化。如果修饰一个引用类型,则在初始化后便不能再让其指向其他对象了。但该引用所指向的对象的内容是可以变化的。本质上是一回事,final要求值不能变。即地址值不能改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值