作者:美好时光33_862 | 来源:互联网 | 2023-10-12 18:01
接java日常记录6final修饰符用final修饰的类不能被继承,没有子类。用final修饰的方法可以被继承,但是不能被子类的重写。publicclassPerson{publi
接java日常记录6
final修饰符 用final修饰的类不能被继承,没有子类。
用final修饰的方法可以被继承,但是不能被子类的重写。
public class Person { public final void print ( ) { } } public class Student extends Person { public void print ( ) { } }
用final修饰的变量表示常量,只能被赋一次值.其实使用final修饰的变量也就成了常量了,因为值不会再变了。 【修饰局部变量】
public class Person { public void print ( final int a) { a = 1 ; } } public class Person { public void print ( ) { final int a; a = 1 ; a = 2 ; } }
【修饰成员变量-非静态成员变量】
public class Person{ private final int a; }
只有一次机会,可以给此变量a赋值的位置: 声明的同时赋值 匿名代码块中赋值 【修饰成员变量-静态成员变量】
public class Person{ private static final int a; } 只有一次机会,可以给此变量a赋值的位置: 声明的同时赋值 静态代码块中赋值
【修饰引用变量】
main: final Student s = new Student(); //编译通过 s.setName(“tom”); s.setName(“zs”); //编译报错,不能修改引用s指向的内存地址 s = new Student();
abstract修饰符 abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。 1、抽象类和抽象方法的关系 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。 2、语法
public abstract class Action{ public abstract void doSomething(); } public void doSomething(){…}
"public void doSomething()"这部分是方法的声明 "{…}"这部分是方法的实现,如果大括号中什么都没写,就叫方法的空实现 声明类的同时,加上abstract修饰符就是抽象类 声明方法的时候,加上abstract修饰符,并且去掉方法的大口号,同时结尾加上分号,该方法就是抽象方法。 3、特点及作用 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。 注:子类继承抽象类后,需要实现抽象类中没有实现的抽象方法,否则这个子类也要声明为抽象类。
public abstract class Action{ public abstract void doSomething(); } main: //编译报错,抽象类不能new对象 Action a = new Action();
//子类继承抽象类 public class Eat extends Action{ //实现父类中没有实现的抽象方法 public void doSomething(){ //code } } main: Action a = new Eat(); a.doSomething();
注:子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
思考1 : 抽象类不能new对象,那么抽象类中有没有构造器?
抽象类是不能被实例化,抽象类的目的就是为实现多态中的共同点,抽象类的构造器会在子类实例化时调 用,因此它也是用来实现多态中的共同点构造,不建议这样使用!
思考2 : 抽象类和抽象方法意义(为什么要编写抽象类、抽象方法)
打个比方,要做一个游戏。如果要创建一个角色,如果反复创建类和方法会很繁琐和麻烦。建一个抽象类 后。若要创建角色可直接继承抽象类中的字段和方法,而抽象类中又有抽象方法。如果一个角色有很多种 职业,每个职业又有很多技能,要是依次实例这些技能方法会显得想当笨拙。定义抽象方法,在需要时继 承后重写调用,可以省去很多代码。 总之抽象类和抽象方法起到一个框架作用。很方便后期的调用和重写 抽象方法是为了程序的可扩展性。重写抽象方法时即可实现同名方法但又非同目的的要求。