1 抽象类
序言:
我们知道四边形,是有四条边,其中的平行四边形是对边平行且相等的四条形,但我们对于“图形”这一个概念,就不知道用几条边来描述比较合适,这个没有人能讲的清楚。同理,我们把仅用来描述特征且极具抽象性的类称为抽象类。
1.1 抽象类的介绍
★在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承和多态处理。在继承树中,越是在上方的类越抽象,如鸽子类继承鸟类,鸟类继承动物类等。在多态机制中,并不需要将父类初始化为对象,我们需要的只是子类对象,所以在Java语言中设置抽象类不可以实例化为对象。
★使用abstract关键字定义的类称为抽象类,而使用这个关键字定义的方法称为抽象方法。抽象方法没有方法体,这个方法本身没有任何意义,除非它被重写,而继承这个抽象方法的抽象类必须被继承。实际上抽象类除了被继承没有任何意义。
★如果声明一个抽象方法,就必须将承载这个抽象方法的类定义为抽象类,不能在非抽象类中获取抽象方法,换句话说,只要类中有一个抽象方法,此类就被标记为抽象类。
1.2 抽象类的特点
(1)定义抽象类:
//抽象类的定义
public abstract class 类名 { }
//抽象方法的定义
public abstract void eat ( );
(2) 注意事项
★抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
★抽象类不能实例化。
★抽象类可以有构造方法。
★抽象类的子类:要么重写抽象类的所有方法,要么是抽象类。
(3) 案例
案例需求:
定义猫类(cat)和狗类(dog)
猫类成员方法:eat(猫吃鱼) drink(喝水)
狗类成员方法:eat(狗吃肉) drink(喝水)
实现步骤:
1:猫类和狗类中存在共性内容,应向上抽取出一个动物类(Animal)。
2:父类(Animal)中,无法将eat方法具体实现描述清楚,所以定义为抽象方法。
3:抽象方法需要存活在抽象类中,将Animal定义为抽象类。
4:让cat和dog分别继承Animal,重写Eat方法。
5:测试类中创建Eat和Dog对象,调用方法测试。
动物类
public abstract class Animal {
public void drink(){
System.out.println("喝水");
}
public Animal(){
}
public abstract void eat();
}
猫类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
狗类
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃肉");
}
}
测试类
public static void main(String[] args) {
Dog d = new Dog();
d.eat();
d.drink();
Cat c = new Cat();
c.drink();
c.eat();
}
1.3 final 关键字
☆final关键字的作用:
final代表最终的意思,可以修饰成员方法,成员变量,类。
☆final修饰成员方法,成员变量,类的效果
★修饰类:该类不能被继承(不能有子类,可以有父类)。
★修饰方法:该方法不能被重写。
★修饰变量:表示该变量是一个常量,不能再次赋值。
ps:修饰变量的时候,若变量是基本类型,不能改变的是值,若变量是引用类型,不能改变的是地址值,但地址里面的内容是可以改变的。
ps:如果将某个类设置为final类,则该类中的所有方法都被隐式设置为final方法,但是final类中的成员变量可以被定义为final或非final形式。
public static void main(String[] args){
final student s=new student(24);
s=new student(25);//错误
s.setAge(25);//正确
}
2 代码块
在Java中,使用{ }括起来的代码被称为代码块
2.1 局部代码块
-
位置: 方法中定义
-
作用: 限定变量的生命周期,及早释放,提高内存利用率
-
示例代码
public class Test {
public static void main(String[] args) {
{
int a = 10;
System.out.println(a);
}
// System.out.println(a);
}
}
2.2 构造代码块
-
位置: 类中方法外定义
-
特点: 每次构造方法执行的时,都会执行该代码块中的代码,并且在构造方法执行前执行
-
作用: 将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性
public class Test {
public static void main(String[] args) {
Student stu1 = new Student();
Student stu2 = new Student(10);
}
}
class Student {
{
System.out.println("好好学习");
}
public Student(){
System.out.println("空参数构造方法");
}
public Student(int a){
System.out.println("带参数构造方法...........");
}
}
2.3 静态代码块
-
位置: 类中方法外定义
-
特点: 需要通过static关键字修饰,随着类的加载而加载,并且只执行一次
-
作用: 在类加载的时候做一些数据初始化的操作
public class Test {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person(10);
}
}
class Person {
static {
System.out.println("我是静态代码块, 我执行了");
}
public Person(){
System.out.println("我是Person类的空参数构造方法");
}
public Person(int a){
System.out.println("我是Person类的带...........参数构造方法");
}
}