【Java从入门到大牛】面向对象进阶上篇 分手后的思念是犯贱 2024-04-26 02:44 96阅读 0赞 > ? 本文由 [程序喵正在路上][Link 1] 原创,CSDN首发! > ? 系列专栏:[Java从入门到大牛][Java] > ? 首发时间:2023年7月16日 > ? 欢迎关注?点赞?收藏?留言? > ? 一以贯之的努力 不得懈怠的人生 #### 目录 #### * static * * static修饰成员变量 * static修饰成员变量的应用场景 * static修饰成员方法 * static修饰成员方法的应用场景 * static的注意事项 * static的应用知识:代码块 * static的应用知识:单例设计模式 * 面向对象三大特征之二:继承 * * 继承快速入门 * 权限修饰符 * 单继承、Object类 * 方法重写 * 子类中访问其他成员的特点 * 子类构造器的特点 ## static ## ### static修饰成员变量 ### **什么是static?** 叫静态,可以修饰成员变量或成员方法 **成员变量按照有无 static 修饰,分为两种:** * **类变量**:有 static 修饰,属于类,在计算机里只有一份,会被类的全部对象共享 * **实例变量(对象的变量)**:无 static 修饰,属于每个对象 **例子** public class Student { // 类变量 static String name; // 实例变量 int age; } **用法** * 类变量:推荐使用 `类名.类变量` 这种格式,不推荐 `对象.类变量` 格式 * 实例变量:`对象.实例变量` **成员变量的执行原理** public class Test { public static void main(String[] args) { // 1、类变量的用法 // 类名.类变量(推荐) Student.name = "小明"; // 对象.类变量(不推荐) Student s1 = new Student(); s1.name = "小红"; Student s2 = new Student(); s2.name = "小刚"; System.out.println(s1.name); // 小刚 System.out.println(Student.name); // 小刚 // 2、实例变量的用法:属于每个对象的变量 // 对象.实例变量 s1.age = 23; s2.age = 18; System.out.println(s1.age); // 23 // System.out.println(Student.age); // 报错 } } ![在这里插入图片描述][e04e23b8d7b148f1990f4d4e1a1c3d83.png] * 类变量:属于类,与类一起加载一次,在内存中只有一份,可以被类和类的所有对象共享 * 实例变量:属于对象,每个对象中都有一份,只能用对象访问 ### static修饰成员变量的应用场景 ### **类变量的应用场景** 在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住 **案例导学** 系统启动后,要求用户类可以记住自己创建了多少个用户对象了 public class User { // 类变量 public static int number; // 构造器 public User() { User.number++; } } **注意事项** * 访问自己类中的类变量,可以省略类名不写 * 访问其他类里的类变量,必须带类名访问 ### static修饰成员方法 ### **成员方法的分类** * 类方法:有 static 修饰的成员方法,属于类 * 实例方法:无 static 修饰的成员方法,属于对象 **用法** * 类方法:推荐 `类名.类方法`,不推荐 `对象名.类方法` * 实例方法:`对象.实例方法` **成员方法的执行原理** ![在这里插入图片描述][c971b18cc9c240018ff54f2ec7b20e1e.png] ### static修饰成员方法的应用场景 ### **类方法的常见应用场景** 类方法最常见的应用场景是做工具类 **工具类是什么?** 工具类中的方法都是一些类方法,每个方法都是用来完成一个功能的,工具类是给开发人员共同使用的 public class XxxxUtil { public static void xxx() { ... } public static boolean xxx(String email) { ... } public static String xxx(int n) { ... } ... } **为什么工具类中的方法要用类方法,而不用实例方法?** * 实例方法需要创建对象来调用,此时对象只是为了调用方法,对象占内存,这样会浪费内存 * 类方法,直接用类名调用即可,调用方便,也能节省内存 **多学一招** * 工具类没有创建对象的需求,建议将工具类的构造器进行私有化 ### static的注意事项 ### **使用类方法、实例方法时的几点注意事项** * 类方法中可以直接访问类的成员,不可以直接访问实例成员 * 实例方法中既可以直接访问类成员,也可以直接访问实例成员 * 实例方法中可以出现 this 关键字,类方法中不可以出现 this 关键字 ### static的应用知识:代码块 ### **代码块概述** 代码块是类的 5 大成分之一(成员变量、构造器、方法、代码块、内部类) **代码块分为两种:** * 静态代码块 * 格式:`static {}` * 特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次 * 作用:完成类的初始化,例如:对类变量的初始化赋值 * 实例代码块 * 格式:`{}` * 特点:每次创建对象时,执行实例代码块,并在构造器前执行 * 作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值 ### static的应用知识:单例设计模式 ### **什么是设计模式(Design pattern)?** * 一个问题通常有 n 中解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式 * 设计模式有 20 多种,对应 20 多种软件开发中会遇到的问题 **设计模式主要学什么 ?** 1. 解决什么问题 ? 2. 怎么写 ? **示例:单例设计模式** 确保一个类只有一个对象 **单例设计模式写法** * 把类的构造器私有 * 定义一个类变量记住类的一个对象 * 定义一个类方法,返回对象 // 单例类(饿汉式单例) public class A { // 2、定义一个类变量记住类的一个对象 private static A a = new A(); // 1、私有构造器 private A() { } // 3、定义一个类方法返回对象 public static A getObject() { return a; } } **单例模式的应用场景和好处** * 任务管理器对象、获取运行时对象 * 在这些业务场景下,使用单例模式,可以避免浪费内存 **单例设计模式的实现方式** * 饿汉式单例:拿对象时,对象早就创建好了 * 懒汉式单例:拿对象时,才开始创建对象 * … **懒汉式单例设计模式** 拿对象时,才开始创建对象 **懒汉式单例模式写法** * 把类的构造器私有 // 懒汉式单例 public class B { // 2、定义一个类变量记住类的一个对象 private static B; // 1、私有构造器 private B() { } // 3、定义一个类方法返回对象 public static B getObject() { if (b == null) { b = new B(); } return b; } } ## 面向对象三大特征之二:继承 ## ### 继承快速入门 ### **什么是继承 ?** Java 中提供了一个关键字 `extends`,用这个关键字,可以让一个类和另一个建立起父子关系 **继承的特点** 子类能继承父类的非私有成员,包括成员变量和成员方法 **继承后对象的创建** 子类的对象是由子类和父类共同完成的 **继承的执行原理** ![在这里插入图片描述][7051da1614a74a0a95cf38b6ba5c94d2.png] 子类对象实际上是由子父类这两张设计图共同创建的 **继承的好处** 减少重复代码的编写,提高了代码的复用性 ### 权限修饰符 ### **什么是权限修饰符 ?** 就是用来限制类中的成员(成员变量、成员方法、构造器、代码块…)能够被访问的范围 **权限修饰符有几种 ?各自的作用是什么 ?** * **private**:只能本类 * **缺省**:本类、同一个包中的类 * **protected**:本类,同一个包中的类、子孙类中 * **public**:任意位置 * private < 缺省 < protected < public ### 单继承、Object类 ### Java 是单继承的,一个类只能继承一个直接父类;Java 中的类不支持多继承,但是支持多层继承 多继承是指同时继承多个直接父类 Object 类是 Java 所有类的祖宗类,我们写的任何一个类,其实都是 Object 的子类或子孙类 ### 方法重写 ### **什么是方法重写 ?** * 当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写 * 注意:重写后,方法的访问,Java 会遵循就近原则 **方法重写的注意事项** * 重写小技巧:使用 `Override` 注解,它可以指定 Java 编译器,检查我们方法重写的格式是否正确,代码可读性也会更好 * 子类重写父类方法时,访问权限必须大于或等于父类该方法的权限 * 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小 * 私有方法、静态方法不能被重写,如果重写会报错 **方法重写在开发中的常见应用场景** 子类重写 Object 类的 toString() 方法,以便返回对象的内容 ### 子类中访问其他成员的特点 ### **在子类方法中访问其他成员(成员变量、成员方法),是按照就近原则的** * 先在子类局部范围找 * 然后在子类成员范围找 * 最后在父类成员范围找,如果在父类范围还没有找到则报错 **如果子父类中,出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类的怎么办 ?** 可以通过 super 关键字,执行访问父类的成员:`super.父类成员变量/父类成员方法` ### 子类构造器的特点 ### **子类构造器的特点:** 子类的全部构造器,都会先调用父类的构造器,再执行自己 **子类构造器是如何实现调用父类构造器的:** * 默认情况下,子类全部构造器的第一行代码都是 `super()`(写不写都有),它会调用父类的无参数构造器 * 如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写 `super(...)`,指定去调用父类的有参数构造器 **this(…) 调用兄弟构造器** 任意类的构造器中,是可以通过 this(…) 去调用该类的其他构造器的 **this(…) 和 super(…) 使用时的注意事项** * this(…)、super(…) 都只能放在构造器的第一行,因此,有了 this(…) 就不能写 super(…) 了,反之亦然 [Link 1]: https://blog.csdn.net/weixin_62511863?spm=1011.2421.3001.5343 [Java]: https://blog.csdn.net/weixin_62511863/category_12365679.html?spm=1001.2014.3001.5482 [e04e23b8d7b148f1990f4d4e1a1c3d83.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/2439ef4274ee429b8927e893c3ee4d1f.png [c971b18cc9c240018ff54f2ec7b20e1e.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/a791f6d374f64f67834d6beb072837c3.png [7051da1614a74a0a95cf38b6ba5c94d2.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/9130cf17947d401699fb01e53ef179c4.png
相关 python 面向对象(进阶篇) [http://www.cnblogs.com/wupeiqi/p/4766801.html][http_www.cnblogs.com_wupeiqi_p_4766801.h 冷不防/ 2022年04月06日 18:10/ 0 赞/ 324 阅读
相关 Java进阶篇-面向对象编程 D1: 面向对象编程的概念 类、对象以及引用 成员方法 D2: 构造方法、方法重载、this关键字、方法的传参和递归调用 D3: 封装、static关键字、单例设计模式 ゞ 浴缸里的玫瑰/ 2021年06月26日 16:06/ 0 赞/ 549 阅读
还没有评论,来说两句吧...