【1】final修饰变量:
![a9b38776f31895f7bd7571cdea9a06d8.png](https://img-blog.csdnimg.cn/img_convert/a9b38776f31895f7bd7571cdea9a06d8.png)
public class Test {
public static void main(String[] args) {
//1......
final int A=10;//基本数据类型被final修饰,它的数值不可以被修改。
// A=20;
System.out.println(A);
//当一个变量被final修饰,它就变成了一个常量,它的值不可以再被修改。
//建议名字全部大写
//2......
final Dog d=new Dog();//引用数据类型被final修饰,它的地址值不可以被修改。
d.age=10;
d.age=20;
//d=new Dog();--->不可以
//3.......
final Dog d2=new Dog();
a(d2);//可以
//4.....
final Dog d3=new Dog();
b(d3);
Dog d4=new Dog();
b(d4);
}
public static void a(Dog d){
d=new Dog();//可以
}
public static void b(final Dog d){
// d=new Dog(); 不可以
}
}
【2】final修饰类:如果一个类被final修饰,那么这个类就不可以被继承。
![166b28188367baeb906690402980bb86.png](https://img-blog.csdnimg.cn/img_convert/166b28188367baeb906690402980bb86.png)
【3】final修饰方法:
(1)如果一个方法被final修饰,那么子类不可以重写这个方法
(2)虽然子类不能重写了,但是调用都是可以的!
【4】查看源码:Math类:
(1)final修饰属性:这个值不让其他人更改
(2)final修饰方法:不能被重写
(3)final修饰类:不能被继承
(4)发现Math中的构造器被private修饰了:
![14c376d7752f8a22255f39178715ebbc.png](https://img-blog.csdnimg.cn/img_convert/14c376d7752f8a22255f39178715ebbc.png)
所以Math m=new Math();这个话 出错!
那么我们想要调用里面的属性和方法怎么调用:
发现所有的属性和方法前都加了static修饰:我可以通过类名。属性名或者类名。方法名去调用。
【1】为什么需要抽象类? 如何定义抽象类?
是一种模版模式。
抽象类为所有子类提供了一个通用模版,子类可以在这个模版基础上进行扩展。
通过抽象类,可以避免子类设计的随意性。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。
package com.bjsxt.test03;
//3.只要类中有抽象方法,这个类就变成一个抽象类。
//4.那么抽象类中可以有0,1,2,,,,,n个抽象方法,
public abstract class Person {
//1.在一个类中,有一部分方法,子类对他永远满意,直接用,不用重写
public void eat(){
System.out.println("吃食物");
}
//2.在一个类中,还有一部分方法,无论怎么写子类都不满意,都要对它进行重写。
//2.对于这样的方法,方法体就没有必要再写了
//2.假如一个方法没有方法体,只有方法的声明,那么这个方法就变成了一个抽象方法
public abstract void say();
public abstract void sleep();
}
//5.抽象类可以被继承吗?可以的,必须重写全部的抽象方法。
//6.假如子类没有重写全部的抽象方法,那么这个类也可以变为一个抽象类。
class Student extends Person{
@Override
public void say() {
System.out.println("说普通话。。");
}
@Override
public void sleep() {
}
}
class Test{
public static void main(String[] args) {
//7.可否创建抽象类的对象:抽象类不可以创建对象。
//Person p=new Person();
Student s=new Student();
s.eat();
s.say();
s.sleep();
//8.就想创建抽象类的对象:
Person p=new Student();//多态
}
}
【2】面试题:
(1)抽象类不能创建对象,那么抽象类中是否有构造器?
必须有构造器,因为这个构造器不是给抽象类用的,而是给子类创建对象的时候调用的。
(2)抽象类可否被final修饰?
不可以的
final修饰不能被子类继承,但是抽象类就是给子类定义模板的。