首页 > 编程语言 >Java学习笔记——第十天

Java学习笔记——第十天

时间:2024-03-09 13:33:30浏览次数:38  
标签:Java 第十天 子类 成员 笔记 访问 父类 方法 变量

面向对象高级(一)

static

static是一个关键字,义为静态,可以修饰成员变量和成员方法。

static修饰成员变量

成员变量的分类

  • 类变量(静态成员变量):有static修饰的成员变量,它们属于类,在计算机里只有一份,会被类的全部对象共享。
  • 实例变量(对象成员变量):无static修饰的成员变量,属于每个对象,每个对象都有自己的实例变量,只能用对象访问。
static String name; //类变量
int age; //实例变量

成员变量的访问

//类变量的访问
类名.类变量 //推荐
对象名.类变量 //不推荐

//实例变量的访问
对名.实例变量

类变量的应用场景

在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量。

static修饰成员方法

  • 类方法(静态方法):有static修饰的成员方法,属于类。类方法直接用类名调用即可,调用方便,也能节省内存。
  • 实例方法(对象的方法):无static修饰的成员方法,属于对象,只能用对象访问。

成员方法的访问

//类方法
类名.类方法 //推荐
对象名.类方法 //不推荐

//成员方法
对象名.实例变量

类方法的应用场景

类方法最常见的应用场景是做工具类。

工具类

  • 工具类中的方法都是类方法,如java.lang.Math,每个方法都是用来完成一个功能的,工具类是给开发人员共同使用的。
  • 工具类中的方法都是类方法,而不用实例方法。因为实例方法需要创建对象来调用,但此时对象只是为了调用方法,不需要实例化出对象,这样会浪费内存。
  • 工具类提高了代码的复用性,调用方便,提高了开发效率。
  • 工具类不需要创建对象, 建议将工具类的构造器私有化。

补充:main方法

main方法是一种类方法,当程序Test启动时,虚拟机会运行Test.main()方法。而main方法的形参则是用来接收命令行输入的。

static的注意事项

  • 类方法中可以直接访问类的成员,不可以直接访问实例成员。
  • 实例方法中既可以直接访问类成员,也可以直接访问实例成员。
  • 实例方法中可以出现this关键字,类方法中不可以出现this关键字的。

代码块

代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。

代码块的分类

  • 静态代码块:
    • 格式:static
    • 特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。
    • 作用:完成类的初始化,例如:对类变量的初始化赋值。
  • 实例代码块:
    • 格式:
    • 特点:每次创建对象时,执行实例代码块,并在构造器前执行。
    • 作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值、记录对象创建的日志、减少多个构造器中重复代码的编写。

单例设计模式

设计模式

  • 一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。
  • 设计模式有20多种,对应20多种软件开发中会遇到的问题。

单例设计模式的作用

确保一个类只有一个对象。

单例设计模式的实现方式

  • 饿汉式单例:在获取类的对象时,对象已经创建好了。
  • 懒汉式单例:要用类的对象时才创建对象(延迟加载对象)。
  • ...

饿汉式单例设计模式的写法

  • 把类的构造器私有。
  • 定义一个类变量并赋值为自己的对象。
  • 定义一个类方法,返回对象。

懒汉式单例设计模式的写法

  • 把类的构造器私有。
  • 定义一个类变量用于存储自己的对象。
  • 提供一个类方法,保证返回的是同一个对象。

单例设计模式的应用场景

  • 任务管理器对象、获取运行时对象。
  • 在这些业务场景下,使用单例模式,可以避免浪费内存。

继承

Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系。这个过程就叫继承,继承的类叫做子类(派生类),被继承的类叫做父类(基类,超类)。

继承的特点

  • 子类能继承父类的非私有成员(成员变量、成员方法)。

  • 子类的对象是由子类和父类共同完成的。

继承的执行原理

当一个子类对象被创建时,该子类的代码及其父类的代码会同时被加载到方法区。之后,被创建的子类对象中会存储子类及其父类的成员变量。

继承有什么用

减少重复代码的编写,提高代码的复用性。

继承的应用场景

两个类中存在大量的重复代码时,可以使这两个类继承同一个父类,并将重复代码放进父类里。

权限修饰符

权限修饰符就是是用来限制类中的成员(成员变量、成员方法、构造器、代码块…)能够被访问的范围的关键字。

权限修饰符的分类及作用

修饰符 本类里 同一个包里的类 子孙类 任意类
private 可以访问 不能访问 不能访问 不能访问
缺省 可以访问 可以访问 不能访问 不能访问
protected 可以访问 可以访问 可以访问 不能访问
public 可以访问 可以访问 可以访问 可以访问

注意:权限只看类和包,与是否是其对象无关。protected修饰的成员只能在其他包下的子类中访问,不能由其他包下的子类的对象访问

单继承

Java是单继承的,Java中的类不支持多继承,但是支持多层继承。

Object类

object类是java所有类的祖宗类。我们写的任何一个类,其实都是object的子类或子孙类。

方法重写

  • 当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。
  • 注意:重写后,方法的访问会遵循就近原则 。

方法重写的注意事项

  • 重写小技巧:使用@Override注解,它可以指定java编译器检查我们方法重写的格式是否正确,代码可读性也会更好。

  • 子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限( public > protected > 缺省 >private)。

  • 重写方法的返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。

  • 私有方法、静态方法不能被重写。

  • 方法重写的原则:声明不变,重新实现

方法重写在开发中的常见应用场景

  • 当子类觉得父类的方法不好用,或者不满足自己的需求时,就可以用方法重写。如toString()方法。

  • IDEA可生成重写toString()方法的骨架。

子类中访问其他成员的特点

  • 在子类方法中访问其他成员(成员变量、成员方法)是依照就近原则的:
    • 先子类局部范围找。
    • 然后子类成员范围找。
    • 然后父类成员范围找,如果父类范围还没有找到则报错。
  • 如果子父类中,出现了重名的成员,会优先使用子类的成员。如果此时一定要在子类中使用父类成员,则可以通过super关键字,指定访问父类的成员,格式为:super.父类成员变量/父类成员方法。

子类构造器的特点

  • 子类的全部构造器,都会先调用父类的构造器,再执行自己。

  • 默认情况下,子类全部构造器的第一行代码都是 super()(写不写都有),它会调用父类的无参数构造器。

  • 如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写super(…),指定去调用父类的有参数构造器。

常见的应用场景

为父类这部分成员变量进行初始化赋值。

补充:this(...)调用兄弟构造器

任意类的构造器中,是可以通过this(…) 去调用该类的其他构造器

this(...)和super(…)使用时的注意事项:

this(…) 、super(…) 都必须放在构造器的第一行,因此,有了this(…)就不能写super(…)了,反之亦然。

this和super详情

  • this:代表本类对象的引用

  • super:代表父类存储空间的标识。

this和super的作用

关键字 访问成员变量 访问成员方法 访问构造方法
this this.成员变量访问本类成员变量 this.成员方法(…)访问本类成员方法 this(…)访问本类构器
super super.成员变量访问父类成员变量 super.成员方法(…)访问父类成员方法 super(…)访问父类构造器

标签:Java,第十天,子类,成员,笔记,访问,父类,方法,变量
From: https://www.cnblogs.com/zgg1h/p/18062589

相关文章

  • Living-Dream 系列笔记 第2期
    本期主要讲解vector、map两个STL容器。知识点:首先,引入两种数组的区别:静态数组,指提前声明需要多少内存的数组,是连续的;而动态数组则是在插入元素时临时指定存储空间,不要求连续。STLvector是一个动态数组,下标默认从\(0\)开始。它支持的操作如下:定义:一维vector......
  • Living-Dream 系列笔记 第3期
    本期主要讲解二分查找。知识点二分查找:思想:分治。使用场景:在一个有序序列中,反复查找不同目标。时间复杂度:\(O(n\logn)\)。实现:对数列排序;确定二分边界(通常为L=最小下标-1,R=最大下标+1);伪代码:intL=左边界-1,R=右边界+1;while(L+1<R){intmid=(L+R)......
  • Living-Dream 系列笔记 第1期
    本期主要讲解模拟、枚举算法。例题T1简单模拟题。利用scanf/cin以int形式读入分和秒,并令秒循环累加,逢\(60\)归\(0\)并向分进\(1\),分则是逢\(24\)归\(0\)。在循环的过程中若分秒合起来是回文数字,则退出循环,按照题目格式输出当前时间。注意开始时间不算。#includ......
  • Living-Dream 系列笔记 第17期
    ProblemT1/*思路:分类讨论:若k=0,则输出x+1;若k>tot(x的位数),则输出1+k-tot个0+x;否则输出10^k+x。*/#include<bits/stdc++.h>usingnamespacestd;longlongk,x,tot,ans=1;//开longlongintmain(){ cin>>k>>x; if(k==0){cout<<x+1;return0;}//情况1......
  • Living-Dream 系列笔记 第14期
    本期主要讲解差分技巧。知识点我们令原数组为\(a_i\),则当且仅当\(d_i=a_i-a_{i-1}\)时,我们称\(d_i\)是\(a_i\)的差分数组。特别的,\(d_1=0\),\(d_{n+1}=-n\)。差分数组\(d_i\)有以下三个性质:\(d_i\)的前缀和数组为\(a_i\)。将\(a_{L\simR}\)这个区间统一加......
  • Living-Dream 系列笔记 第15期
    模拟赛爆炸祭。T1把所有连通块依次求出,若某个连通块的数量已经出现过,则说明它与以前的连通块属于同一星系,直接将星系大小加上连通块大小并取\(\max\);否则将星系数量\(+1\)。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m;intans=-1e9,num,......
  • Living-Dream 系列笔记 第11期
    本期主要讲解与上期相同内容(雾。例题T1在整个矩阵外加一圈\(0\),使得包围圈外的\(0\)形成一整个连通块。求出这个连通块并标记为\(1\),然后输出即可。#include<bits/stdc++.h>usingnamespacestd;intn;intdx[]={-1,0,1,0},dy[]={0,1,0,-1};inta[31][31],g[31][31];......
  • Living-Dream 系列笔记 第12期
    本期主要讲解一维前缀和技巧。知识点我们令\(a_i\)表示原数组的第\(i\)个元素,则\(sum_i\)表示\(a_i\)前\(i\)个元素之和,即:\[sum_i=\sum^{i}_{j=1}a_j\]我们知道,\(a\)数组前\(i\)个元素的和\(=\)前\(i-1\)个元素的和\(+a_i\)。于是便可得到\(sum\)数组的......
  • Living-Dream 系列笔记 第13期
    本期主要讲解二维前缀和。知识点我们令\(a_{i,j}\)表示原数组,则\(sum_{i,j}\)为\(a\)的二维前缀和数组。根据容斥原理,得到递推式:\[sum_{i,j}=sum_{i-1,j}+sum_{i,j-1}-sum_{i-1,j-1}+a_{i,j}\]二维前缀和适用于求静态矩阵的子矩阵元素和。若我需要求一个左上角坐标为......
  • Living-Dream 系列笔记 第10期
    本期主要讲解进阶\(\text{DFS}\)。知识点\(\text{DFS}\)求解连通块问题:定义:若一个点集中的所有点都能互达,且与集合外的点无法互达,则称此点集为一个连通块。考查方式:求连通块数量/大小/周长。例题T1在\(\text{DFS}\)函数中传入参数\(x\)和\(str\),分别表示......