Java SE学习总结 Day (11)


Day 11开篇:
      
        "
今天java基础主要学习了面向对象的继承,多态的概念,优点,缺点,单例设计模式,Final关键字等。 "




知识点反馈:

今天的知识点总结的思维导图


 

一. 继承
1. 注意事项:
(1)子类在初始化数据之前一定会先访问父类的无参构造(默认的),父类如果没有提供无参,就会报错。
(如何解决?)
a.手动给父类提供一个无参构造
b.通过super关键字手动去调用父类的其他构造
(2)this()和super()必须是在构造方法第一句,如果不是放在第一句,就有可能对自己或者父类的数据进行多次初始化。
 
2.问题:
我定义了一个手机的类,这个类包含了手机打电话、发短信、打游戏、陌陌聊天等常见的手机功能再定义了一个iphonexsMax手机,同样具备了如上功能,所以我们考虑使用继承。现在有一种情况是这样的,手机一般都具备function()这个方法里面的所有功能,这个可以理解但是,IphoneXSMax是不是还有面容解锁的功能?这是所有手机都具备的吗?不是,所以这个问题怎么解决?
(1) 在子类定义一个子类特有的方法(没问题,不是特别好,因为面容解锁也属于功能,那么命名是不应该叫function)
(2) 继承父类的某一个方法,却又发现父类的方法无法满足的时候,可以考虑使用方法重写(覆盖)
 
3. 方法重写:
(1)定义:当父类数据无法满足子类需求的时候,声明了和父类方法一模一样的时候,被称之为方法重写(覆盖)
(2)方法重写的注意事项:
<1>父类的私有方法不能被重写
<2>子类的重写方法必须保持和父类方法一模一样的返回值、命名、参数列表
<3>子类的重写方法的访问权限不能小于父类(一般保持一致即可,不用刻意写成不一样)
<4>如果存在static的修饰,则不存在重写的概念,重写的前提是子类继承了父类的方法,而两个方法的加载时候都应该属于对象调用;而static属于类加载,两个static完全是两个不同的空间,所以根本不存在重写的概念。只是两个static的方法名字一致,而地址值不一致。
 
4. 例子:
class Fu{
    int num = 10;
    Fu(){
        System.out.println("Fu");
    }
}
class Zi extends Fu{
    int num = 20;
    Zi(){
        System.out.println("Zi");
    }
    public void show(){
        int num = 30;
        System.out.println(num);
        System.out.println(this.num);
        System.out.println(super.num);
    }
}
public class ExtendsTest01 {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.show();
    }
}
 
5. 方法重载与方法重写的区别:
(1)概念上:
方法重载:同一个类当中,方法名相同,参数列表不同,与返回值无关。
方法重写:当父类数据无法满足子类需求的时候,声明了和父类方法一模一样的时候,被称之为方法重写(覆盖)
(2)范围上:
方法重载:一个类中
方法重写:有继承关系的类中
(3)权限要求:
方法重载:无
方法重写:被覆盖的方法不能拥有比父类更严格的权限
 
二. 多态
1. 定义:就是某一个对象在不同时刻体现出来的状态。
2. 如何写好多态?
a.具备继承的前提
b.存在方法的重写
  class 动物{
             void show(){
             sout("动物吃东西");
                }
            }
   class 猫 extends 动物{
              void show(){
              sout("猫吃猫粮");
                }
            }
    动物 d = new 猫();
          d.show();
  c.要有父类的引用指向子类的对象
           Fu f = new Zi();
 
3. 多态当成成员访问特点:
  a.成员变量: 当父类和子类具有相同的成员变量的时候,那么在多态的情况访问的是父类的成员变量
  b.成员方法:当父类和子类存在相同的成员方法的时候,在多态的情况下默认方法的是父类的成员(但是因为方法重写的问题,所有最后输出的是子类的方法)
  c.静态方法:当父类和子类存在相同的成员方法的时候,在多态的情况下,因为静态不存在重写的问题,所以访问的是父类的
(不管什么样的方式进行方法,除了考虑子类重写成员方法的问题,全部都是以父类为主。)
 
4. 多态的优点:
(1)提高了代码的可维护性(继承提供)
(2)提高了代码的扩展性(多态提供)
(3)多态可以作为形参提供,接收更广的赋值范围,避免方法的形参过度重载
(4)多态还可以作为返回值提供,返回更广的数据类型,避免因为不确定的返回数据而不能明确返回值的问题
 
5.多态的弊端:
无法使用子类的特有属性和功能(这不算弊端,因为本身就有解决方案)
如何解决?
a.直接创建子类对象使用(可以实现使用子类的方法的问题,但是不合理 因为丧失了多态的所有功能,而且浪费空间)
             Zi zi = new Zi();
        向上转型://子 - > 父 使用的是父类空间
            Fu f = new Zi();
        向下转型://父 -> 子 使用的是子类空间
            Zi z = (Zi)f;
5. ClassCastException:类型转换失败异常(多态的向下转型当中出现的比较多的)
6. 多态的内存走向图:
 
 
三. 单例设计模式
1. 定义:
某一个类比较特殊,他并不需要被反复创建,所有人都共享这个堆区的数据即可,如果这个类被反复的实例化,将会对空间内存造成极大的浪费;个类只能被实例化一次,且所有人共享即可,这种方式就被称之为单例设计模式。
 
2. 单例设计模式的特点:
(1)我不能让别人创建对象(构造私有化)
(2)既然别人不能创建对象了,那这么保证一次实例
(3)写一个方法,返回当前类对象即可,这个方法必须是静态的 否则人家无法调用
(4)为了保证人家访问的是同一个对象,所以在成员位置创建了一个类对象,且是私有和静态的
(5)在写好的方法里面,将成员位置的类对象进行返回即可
 
 
四. Final关键字
1. 定义:final是一个用于修饰变量、方法、类的修饰符
2. 问题解决方法:
(1)父类的某一个数据不想让子类进行继承的话,怎么办?
父类进行私有化
(2)父类某一个数据,可以让子类继承,但是不能修改?
使用final关键字
3. final关键字的特点:
(1)final如果修饰的是变量,则该变量转变成为常量,程序不能进行重新(二次)赋值
(2)final如果修饰的是方法,则该方法无法被子类进行重写,但是可以被子类继承
(3)final如果修饰的是类,则该类无法被继承
(4)final如果修饰的是对象,则该对象无法改变其堆空间的地址值
发布了29 篇原创文章 · 获赞 7 · 访问量 3171

猜你喜欢

转载自blog.csdn.net/weixin_45406656/article/details/104217680