ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java学习-第一部分-第二阶段-第一节:面向对象编程(高级) [打印本页]

作者: 光之使者    时间: 2022-9-16 17:17
标题: Java学习-第一部分-第二阶段-第一节:面向对象编程(高级)
面向对象编程(高级)

笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)
类变量和类方法(static)

类变量

类变量-提出问题
提出问题的主要目的就是让大家思考解决之道,从而引出我要讲的知识点.说:有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?,编写程序解决。
传统的方法来解决
使用我们现有的技术来解决这个问题,大家看看如何?
✔思路
✔问题分析:
类变量快速入门
思考:如果,设计一个int count表示总人数,我们在创建一个小孩时,就把count加1,并且 count是所有对象共享的就ok了!,我们使用类变量来解决
  1. public class ChildGame {
  2.     public static void main(String[] args) {
  3.         Child child1 = new Child("白精");
  4.         child1.join();
  5.         child1.count++;
  6.         Child child2 = new Child("老白");
  7.         child2.join();
  8.         child2.count++;
  9.         
  10.         Child child3 = new Child("老白");
  11.         child3.join();
  12.         child3.count++;
  13.         
  14.         //......
  15.         System.out.println("共有" + child1.count + "小孩加入了游戏...");
  16.         System.out.println(child1.count);//3
  17.         System.out.println(child2.count);//3
  18.         System.out.println(child3.count);//3
  19.         System.out.println(Child.count);//3
  20.     }
  21. }
  22. class Child {//类
  23.     private String name;
  24.     //定义一个变量 count,是一个类变量(静态变量)static静态
  25.     //该变量最大的特点就是会被Child类的所有的对象实例共享
  26.     public static int count = 0;
  27.     public Child(String name) {
  28.         this.name = name;
  29.     }
  30.     public void join() {
  31.         System.out.println(name + "加入了游戏..");
  32.     }
  33. }
复制代码
其中child1,child2以及child3中的count指向相同空间,被共享,为同一值
jdk8以及之前,count(也就是静态域)在方法区中。jdk8之后,jdk存放在堆中
有些书说在方法区... jdk版本有关系,记住一点: static变量是对象共享
不管static变量在哪里,共识:
什么是类变量
类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。这个从前面的图也可看出来。
如何定义类变量
定义语法:
访问修饰符 static 数据类型 变量名;[推荐]
static 访问修饰符 数据类型 变量名;
  1. class A{
  2.     public static string name = "abc";
  3.     static public int totalNum = 100;
  4. }
复制代码
如何访问类变量
类名.类变量名
或者对象名.类变量名【静态变量的访问健饰符的访问权限和范围和普通属性是一样的。】
推荐使用:类名.类变量名;
  1. public class Test {
  2.     public static void main(String[] args) {
  3.         //类名.类变量名
  4.         // 说明:类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问
  5.         System.out.println(A.name);
  6.         A a = new A();
  7.         System.out.println("a.name=" +a.name);
  8.     }
  9. }
  10. class A {
  11.     //类变量
  12.     public static String name = "韩顺平";
  13. }
复制代码
类变量使用注意事项和细节讨论
类方法

类方法基本介绍
类方法也叫静态方法。
形式如下:
访问修饰符 static 数据返回类型 方法名(){ }【推荐】
static 访问修饰符 数据返回类型 方法名(){ }
类方法的调用:
使用方式:类名.类方法名 或者 对象名.类方法名【前提是满足访问修饰符的访问权限和范围】
类方法应用案例
请大家看一个静态方式小案例。(统计学费总和)
  1. public class Test {
  2.     public static void main(String[] args) {
  3.         //创建2个学生对象,叫学费
  4.         Stu tom = new Stu("tom");
  5.         tom.payFee(100);
  6.         Stu mary = new Stu("mary");
  7.         mary.payFee(200);
  8.         
  9.         //输出当前收到的总学费
  10.         Stu.showFee();//300
  11.     }
  12. }
  13. class Stu {
  14.     private String name;//普通成员
  15.     // 定义一个静态变量,来累积学生的学费
  16.     private static double fee = 0;
  17.     public Stu(String name) {
  18.         this.name = name;
  19.     }
  20.     //说明
  21.     //1.当方法使用了static修饰后,该方法就是静态方法
  22.     //2.静态方法就可以访问静态属性/变量
  23.     public static void payFee(double fee) {
  24.         Stu.fee += fee;//累积到
  25.         
  26.     }
  27.     public static void showFee() {
  28.         System.out.println("总学费有:" + Stu.fee);
  29.     }
  30. }
复制代码
类方法经典的使用场景
当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。(不需要额外创建对象)
比如:工具类中的方法utils
Math类、Arrays类、Collections集合类看下源码:
小结
在程序员实际开发,往往会将一些通用的方法,设计成静态方法,这样我们不需要创建对象就可以使用了,比如打印一维数组,冒泡排序,完成某个计算任务等..
举例
  1. public class Test {
  2.     public static void main(String[] args) {
  3.         System.out.println(MyTools.calSum(10,30));
  4.     }
  5. }
  6. class MyTools {
  7.     //开发自己的工具类时,可以将方法做成静态的,方便调用class MyTools {
  8. //求出两个数的和
  9.     public static double calSum(double n1, double n2) {
  10.         return n1 + n2;
  11.     }
  12. }
复制代码
类方法使用注意事项和细节讨论
小结:静态方法,只能访问静态的成员,非静态的方法,可以访问静态成员和非静态成员(必须遵守访问权限)
理解main方法语法

●深入理解main方法
解释main方法的形式:public static void main(String[] args){}
特别提示:
代码块

●基本介绍
代码化块又称为初始化块,属于类中的成员[即 是类的一部分],类似于方法,将逻辑语句封装在方法体中,通过{}包围起来。
但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时,或创建对象时隐式调用。
●基本语法
[修饰符]{
​    代码
};
注意:
实例
  1. package com.hspedu.p386;
  2. public class codeBlock01 {
  3.     public static void main(String[] args) {
  4.         Movie movie = new Movie("你好,李焕英");
  5.     }
  6. }
  7. class Movie {
  8.     private String name;
  9.     private double price;
  10.     private String director;
  11.     //3个构造器-》重载
  12.     //老韩解读
  13.     //(1)下面的三个构造器都有相同的语句
  14.     //(2)这样代码看起来比较冗余
  15.     //(3)这时我们可以把相同的语句,放入到一个代码块中,即可
  16.     //(4)这样当我们不管调用哪个构造器,创建对象,都会先调用代码块的内容
  17.     //(5)代码块调用的顺序优先于构造器。。
  18.     {
  19.         System.out.println("电影屏幕打开...");
  20.         System.out.println("广告开始...");
  21.         System.out.println("电影正是开始...");
  22.     }
  23.     public Movie(String name) {
  24.         System.out.println("Hovie(Strihg name)被调用。.。");
  25.         this.name = name;
  26.     }
  27.     public Movie(String name, double price) {
  28.         this.name = name;
  29.         this.price = price;
  30.     }
  31.     public Movie(String name, double price, String director) {
  32.         this.name = name;
  33.         this.price = price;
  34.         this.director = director;
  35.     }
  36. }
复制代码
代码块使用注意事项和细节讨论
小结:
  1. public class Test {
  2.     public static void main(String[] args) {
  3.         //老师说明
  4.         //(1)进行类的加载
  5.         //1.1 先加载父类A02 1.2 再加载Bo2//(2)创建对象
  6.         new B02();//对象
  7.     }
  8. }
  9. class A02 {//父类
  10.     private static int n1 = getVal01();
  11.     static {
  12.         System.out.println("A02的一个静态代码块..");//2
  13.     }
  14.     {
  15.         System.out.println("A02的第一个普通代码块..");//5
  16.     }
  17.     public int n3 = getVal02();
  18.     public static int getVal01() {
  19.         System.out.println("getVal01");//1
  20.         return 10;
  21.     }
  22.     public int getVal02() {
  23.         System.out.println("getVal02");//6
  24.         return 10;
  25.     }
  26.     public A02() {
  27.         System.out.println("A02的构造器");//7
  28.     }
  29. }
  30. class B02 extends A02 { //
  31.     private static int n3 = getVal03();
  32.     static {
  33.         System.out.println("BO2的一个静态代码块..");//4
  34.     }
  35.     public int n5 = getVal04();
  36.     {
  37.         System.out.println("B02的第一个普通代码块..");//9
  38.     }
  39.     public static int getVal03() {
  40.         System.out.println("getVal03");//3
  41.         return 10;
  42.     }
  43.     public int getVal04() {
  44.         System.out.println("getVal04");//8
  45.         return 10;
  46.     }
  47.     public B02() {
  48.         System.out.println("BO2的构造器");//10
  49.     }
  50. }
复制代码
单例设计模式

什么是单例模式
单例模式应用实例
演示饿汉式和懒汉式单例模式的实现。步骤如下:
饿汉式
  1. public class Test {
  2.     public static void main(String[] args) {
  3.         GirlFriend instance = GirlFriend.getInstance();
  4.         System.out.println(instance);
  5.         GirlFriend instance2 = GirlFriend.getInstance();
  6.         System.out.println(instance2);
  7.         System.out.println(instance == instance2);//T
  8.     }
  9. }
  10. class GirlFriend {
  11.     private String name;
  12.     //为了能够在静态方法中,返回gf对象,需要将其修饰为static
  13.     private static GirlFriend gf = new GirlFriend("小红红");
  14.     //如何保障我们只能创建一个 GirlFriend对象
  15.     //步骤
  16.     //步骤[单例模式-饿汉式]
  17.     //1。将构造器私有化
  18.     // 2.在类的内部直接创建
  19.     //3.提供一个公共的static方法,返回 gf对象
  20.     private GirlFriend(String name) {
  21.         this.name = name;
  22.     }
  23.     public static GirlFriend getInstance() {
  24.         return gf;
  25.     }
  26. }
复制代码
懒汉式
  1. package com.hspedu.test;
  2. public class Test {
  3.     public static void main(String[] args) {
  4.         //new Cat("大黄");
  5.         Cat instance = Cat.getInstance();
  6.         System.out.println(instance);
  7.     }
  8. }
  9. class Cat {
  10.     private String name;
  11.     private static Cat cat;//步骤
  12.     //1.仍然构造器私有化
  13.     //2.定义一个static属性对象
  14.     //3.提供一个public的static方法,可以返回一个Cat对象
  15.     private Cat(String name) {
  16.         this.name = name;
  17.     }
  18.     public static Cat getInstance() {
  19.         if (cat == null) {//如果没有创建cat封象
  20.             cat = new Cat("小可爱");
  21.         }
  22.         return cat;
  23.     }
  24. }
复制代码
饿汉式VS懒汉式
final关键字

●基本介绍
final中文意思:最后的,最终的.
final 可以修饰类、属性、方法和局部变量.
在某些情况下,程序员可能有以下需求,就会使用到final:
final使用注意事项和细节讨论
抽象类

当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类
  1. abstract class Animal {
  2.     private String name;
  3.     public Animal(String name) {
  4.         this.name = name;
  5.     }
  6.     //思考:这里eat这里你实现了,其实没有什么意义//即:父类方法不确定性的问题
  7.     //===>考虑将该方法设计为抽象(abstract)方法//===>所谓抽象方法就是没有实现的方法
  8.     //===>所谓没有实现就是指,没有方法体
  9.     //===>当一个类中存在抽象方法时,需要将该类声明为abstract类
  10.    
  11. //    public void eat() {
  12. //        System.out.println("这是一个动物,但是不知道吃什么..");
  13. //    }
  14.     public abstract void eat() ;
  15. }
复制代码
抽象类的介绍
抽象类使用的注意事项和细节讨论
抽象类最佳实践-模板设计模式

最佳实践
需求
感情的自然流露
[code]public class Test {        public static void main(String[] args) {                new A().job();                new B().job();        }}//如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类class A {        public void job() {        //得到开始的时间        long start = System.currentTimeMillis();        long num = 0;        for (long i = 1; i




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4