Java——设计辅助概念(final关键字、对象多态性基本概念)
目录
1、final关键字
final别名 终结器,意思是用final定义的类不能有子类,用final定义的方法不能被覆写,用final定义的变量就成为了常量,其无法修改。
【举例】:利用final定义类
实际开发中,无需太多关注此类模式,因为这种定义与实际的类的结构设计有关,比如结构系统框架等。
【举例】:利用final定义的方法
以上的定义形式也是很少出现的。
【举例】:利用final定义常量
可以将固定的常量数值利用变量名称 表示出来,该值不能被修改。
如果开发中使用了public static final 定义,就是全局常量,该定义在实际开发中使用的非常频繁,我们开发时只要是常量的定义都使用大写字母描述,养成一个好习惯,以和变量进行区分。
2、对象多态性
多态是在继承性的基础上才可操作的,本次将使用类继承的关系来描述多态的性质,实际开发中不会出现普通类的继承关系,即一个已经完善的类不应该再被继承。开发中都要求继承抽象类和接口,本节主要讲的也只是概念。
多态性要想实现有前提:继承、覆写。
【举例】:覆写调用的前提是,看new的是哪个类的对象,再看方法是否被子类覆写。
-
public class MainActivity extends AppCompatActivity {
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
B b = new B();
-
b.print();
-
}
-
}
-
class A{
-
public void print(){
-
System.out.println("hello");
-
}
-
}
-
class B extends A{
-
public void print(){
-
System.out.println("world");
-
}
-
}
Java中多态性主要由两个方面组成:
- 方法的多态性:
--方法重载:方法调用时根据有不同的参数个数及类型实现不同的功能;
--方法覆写:不同的子类对同样的方法可有不同的实现。
- 对象的多态性:父类与子类对象间的转换操作
--对象的向上转型: 父类 父类对象 = 子类实例,自动完成的;
--对象的向下转型:子类 子类对象 = (子类)父类实例,强制转换;
【举例】:观察对象的向上、向下转型转型
依然用以上代码:
-
A a = new B();//向上转型
-
a.print();
-
B b = (B) a; //向下转型
-
b.print();
输出都是
【分析1】向上转型的意义是什么?有什么用呢?
要求定义一个fun()方法,这个方法要求可以接收A以及A类所有子类的实例化对象,根据这个要求,有两种实现方案:
方案一:使用方法重载的概念完成:如果有1W个子类,那么这方重载方法要写到吐。。。。显然不是最佳方案。
-
public class MainActivity extends AppCompatActivity {
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
fun(new A());
-
fun(new B());
-
}
-
public static void fun(A a){
-
a.print();
-
}
-
public static void fun(B b){
-
b.print();
-
}
-
}
方案二:各个子类调用的方法都是print(),此时就可以利用对象自动向上转型概念,直接只有A类接收即可。
-
public class MainActivity extends AppCompatActivity {
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
fun(new A());
-
fun(new B());
-
}
-
public static void fun(A a){
-
a.print();
-
}
-
}
所以,对象的向上转型,在开发中最大的优势在于数据操作的统一上。
【分析2】向下转型的意义是什么?有什么用呢?
一旦发生向上转型后,父类对象不能调用子类中新建的方法,即向上转型后牺牲的是子类的个性化特征。但是现在要想调用子类中的特殊方法,只能进行向下转型操作:
-
public class MainActivity extends AppCompatActivity {
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
A a = new B();
-
a.print();
-
B b = (B)a;//只能向下转型,才能调用子类的新方法
-
b.fun();
-
}
-
}
-
class A{
-
public void print(){
-
System.out.println("hello");
-
}
-
}
-
class B extends A{
-
public void print(){
-
System.out.println("world");
-
}
-
-
public static void fun(){
-
System.out.println("B类扩充的方法");
-
}
-
}
若使用向下转型,之前建立的参数统一风格就被打破了,所以,向下转型的意义就是,要调用子类中的自己的特殊支持。
但是向下转型有个注意点:
-
public class MainActivity extends AppCompatActivity {
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
A a = new A();
-
B b = (B)a;
-
b.fun();
-
}
-
}
以上程序编译出现java.lang.ClassCastException 错误,表示类的异常转换,两个没有关系的类对象发生了强制转换所导致的。
所以要进行向下转换之前,首先保证已经发生了向上转型,这样才有了父子对象的关系,这样的转型本身是有安全隐患的,所以,可以使用instanceof关键字,判断某一个对象是否是指定类的实例。
【举例】:观察instanceof关键字的使用
-
public class MainActivity extends AppCompatActivity {
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
A a = new A();
-
System.out.println(a instanceof A);//true
-
System.out.println(a instanceof B);//false
-
A x = new B();
-
System.out.println(x instanceof A);//true
-
System.out.println(x instanceof B);//true
-
}
-
}
所以,可以利用instanceof关键字进行代码的优化,避免以上异常的发生:
-
public class MainActivity extends AppCompatActivity {
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
A a = new B();
-
if(a instanceof B){ //优化,判断是B的子类对象,才可以进行强制向下转型
-
B b = (B)a;
-
b.print();
-
}
-
}
-
}
3、总结
- 向上转型(90%):为了实现参数类型的统一,向上转型一定与方法覆写产生关联,没有覆写,就没什么意义;
- 向下转型(1%):为了调用子类特殊的方法,但是向下转型必须实现了向上转型,其存在安全隐患,向下转型前可以使用instanceof进行判断;
- 不转型(9%):为了方便操作直接使用系统类或一些功能类,如:String、简单Java类等。
作于202004202145,已归档
———————————————————————————————————
本文为博主原创文章,转载请注明出处!
若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!
祝君升职加薪,鹏程万里!
文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。
原文链接:winter.blog.csdn.net/article/details/105627040
- 点赞
- 收藏
- 关注作者
评论(0)