首页 > 编程语言 >Java基础-学习笔记06

Java基础-学习笔记06

时间:2024-07-22 21:28:45浏览次数:13  
标签:Java super 子类 笔记 类型 06 父类 方法 属性

**06 访问修饰符 封装 继承 多态 **

访问修饰符

  1. public 公开级别,对外公开
  2. protected 受保护级别,对子类和同一个包中的类公开
  3. default 默认级别,无修饰符,向同一个包的类公开
  4. private 私有级别,只有类本身可以访问,不对外公开

修饰符可以用来修饰类中的属性,成员方法以及类
只有默认和public才能修饰类

封装 encapsulation

好处:
1)隐藏实现细节
2)可以对数据进行验证,保证安全合理

封装的实现步骤

  1. 将属性进行私有化 private,使得外部不能直接修改属性
  2. 提供一个公共的(public)set方法,用于对属性判断并赋值
public void setXxx(类型 参数名)
{
  //加入数据验证的业务逻辑
  属性 = 参数名;
}
  1. 提供一个公共的(public)get方法,用于获取属性的值
public XX getXxx()
{
  //权限判断
   return Xx;
}

继承 extends

好处:
代码复用,提高扩展性和维护性

细节:

  1. 子类继承了所有的属性和方法,但是私有/默认属性和方法不能在子类直接访问,要通过公共的方法去访问;
    (很多情况子类和父类在同一个包内,默认权限也可以直接访问)

  2. 子类必须调用父类的构造器,完成父类的初始化
    (在创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器(默认执行super()),如果父类没有提供无参构造器,则必须在子类的构造器中用super去制定使用父类的哪个构造器完成对父类的初始化工作,否则编译不通过)

  3. 如果希望指定去调用父类的某个构造器,则显式的调用:super(参数列表)
    (super在使用时,需要放在构造器第一行)

  4. super() 和 this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器。(有this()时,系统不会默认执行super())

  5. Java的所有类都是Object类的子类,Object是所有类的基类

  6. 父类构造器的调用不限于直接父类。将一致网上追溯直到Object类

  7. 子类最多只能(直接集成)一个父类,即单继承机制

继承的本质分析

例:

public class Test
{
  public static void main(String[] args)
  {
    Son son = new Son(); //分析内存的布局
  } 
}

class GrandPa
{
  String name = "大头爷爷";
  String hobby = "旅游";
}

class Father extends(GrandPa)
{
  String name = "大头爸爸";
  int age = 39;
}

class Son extends Father
{
  String name = "大头儿子";
}
  • 首先在方法区加载父类信息:Object类、Grandpa类、Father类、Son类

  • 然后在堆中分配地址空间给son:
    * 首先给Grandpa类的属性(name和hobby)分配空间;
    * 再继续给Father类的属性(name和age)分配空间 [注:重名属性name不会冲突,是独立空间] ;
    * 最后还会给Son类的属性分配空间name

  • 最后把堆中的地址返回给栈中的对象名son

System.out.println(son.name);   //大头儿子
System.out.println(son.age);   //39
System.out.println(son.hobby);   //旅游

按照查找关系来返回信息

首先看子类是否有该属性
如果子类有这个属性并且可以访问:则返回信息;
(若是private,内存中也会有这个属性,不过无法直接通过子类访问,则会报错)

如果子类没有这个属性:
则看父类有没有这个属性,
如果父类有该属性并且可以访问:就返回信息;
否则继续向上查找直到Object类

super关键字

  • super代表父类的引用,用于访问父类的属性、方法、构造器(private属性和方法除外);
  • 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super;如果没有重名,使用super、this、直接访问是一样的效果;
  • super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷的成员;如果多个上级类中都有同名的成员,则遵循就近级原则(同上查找关系);

多态

方法重写/覆盖

  • 方法重写/覆盖就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说这个子类的这个方法覆盖了父类的那个方法
  • 子类的方法的参数、方法名,要和父类方法的参数、方法名一样
  • 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类
  • 子类方法不能缩小父类方法的访问权限

方法重写重载的比较

多态:方法或对象具有多种形态。多态是建立在封装和继承之上的。

具体体现:

  1. 方法的多态:重写和重载就体现多态
  2. 对象的多态
    (1)一个对象的编译类型和运行类型可以不一致
    (2)编译类型再定义对象时,就确定了,不能改变
    (3)运行类型是可以变化的
    (4)编译类型看定义时 =号 的左边,运行类型 =号 的右边
    例:
//父类的引用可以指向子类的对象
Animal animal = new Dog(); //animal编译类型是Animal,运行类型是Dog
animal.cry(); // 输出的是Dog里重写过的cry
animal = new Cat(); // animal的运行类型变成了Cat,编译类型仍是Animal
animal.cry(); // 输出的是Cat里重写过的cry
animal.catchMouse();//error!这是Cat的特有方法,无法调用!

细节:

  • 前提:两个对象(类)存在继承关系

  • 多态的向上转型

    • 本质:父类的引用指向了子类的对象
    • 语法:父类类型 引用名 = new 子类类型()
    • 特点:编译类型看左边,运行类型看右边
    • 调用规则:
      * 可以遵守访问权限调用父类中的所有属性和成员,但是不能调用子类的特有属性和方法,因为在编译阶段,能调用哪些成员是由编译类型来决定的。
      * 最终运行效果看子类的具体实现,与前面查找关系规则一致。
  • 多态的向下转型

    • 语法:子类类型 引用名 = (子类类型)父类引用
      Cat cat = (Cat) animal
      (相当于有cat、animal两个引用指向这个子类对象了)
    • 只能强转父类的引用,不能强转父类的对象
    • 求父类的引用必须指向的是当前目标类型的对象
    • 向下转型后,可以调用子类类型中所有的成员
  • 属性没有重写之说,属性的值看编译类型
    例:

public class Test
{
  public static void main(String[] args)
  {
    Base base = new Sub();
    System.out.println(base.cout); // 10
    Sub sub = new Sub();
    System.out.println(base.cout); // 20
  }
}

class Base // 父类
{
  int count = 10; // 属性
}
class Sub extends Base //子类
{
  int count = 20; // 属性
}
  • instanceOf 比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型

标签:Java,super,子类,笔记,类型,06,父类,方法,属性
From: https://www.cnblogs.com/97gogo/p/18315436

相关文章

  • Javase-11.多态
    1.什么是多态?多态的概念:通俗来说就是多种形态.具体点就是去完成某个行为时,不同的对象去完成会产生不同的状态.比如:同样是打印,彩色打印机打印出来的纸是彩色的,而黑白打印机打印出来的是黑白色的.多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。2.......
  • Java 经典排序算法代码 + 注释分析(冒泡、选择、插入、希尔、快排、计数、堆排、归并)
    Java经典排序算法代码+注释分析(冒泡、选择、插入、希尔、快排、计数、堆排、归并)以下是八种经典排序算法的代码,Java8亲测可用,可以直接运行importjava.util.Arrays;publicclassSort{privatestaticfinalint[]nums={3,44,38,5,47,15,36,26,27......
  • Pandas 和numpy 入门详细笔记
    1.安装和导入1.1安装pipinstallpandaspipinstallnumpy1.2导入importpandasaspdimportnumpyasnp2.数据结构2.1Series(系列)定义:一维标签化数组,可以保存任何数据类型(整数、浮点数、字符串等)。创建Series:#从列表创建s=pd.Series([10,20,30,40]......
  • MPLS-EVPN笔记详述
    目录EVPN简介:EVPN路由:基本四种EVPN路由扩展:EVPN工作流程:1.启动阶段:2.流量转发:路由次序整理:总结:EVPN基本术语:EVPN表项:EVPN支持的多种服务模式:简介:1.PortBased:简介:配置实现:2.VLANBased:简介:配置实现:3.VLANBundle:简介:配置实现:VLAN-AwareBundle:简介:M......
  • java毕业设计-基于springboot+vue的校园二手交易系统,基于java的校园二手交易系统,基于j
    文章目录前言演示视频项目背景项目架构和内容获取(文末获取)具体实现截图前台功能管理后台技术栈具体功能模块设计系统需求分析可行性分析系统测试为什么我?关于我我自己的网站前言博主介绍:✌️码农一枚,专注于大学生项目实战开发、讲解和毕业......
  • OI-Wiki 学习笔记
    算法基础\(\text{Update:2024-07-22}\)复杂度定义衡量一个算法的快慢,一定要考虑数据规模的大小。一般来说,数据规模越大,算法的用时就越长。而在算法竞赛中,我们衡量一个算法的效率时,最重要的不是看它在某个数据规模下的用时,而是看它的用时随数据规模而增长的趋势,即时间复......
  • 高速收发器:PHY层笔记(一)
    笔记:高速收发器的数据位宽通常有:2,4,8字节等;PCIE喜欢的位宽是1DW=4Byte;这里对高速收发器的设计为4Byte也就是32位宽;GT中PHY层的字对齐和掩码处理高速收发器的数据流以SOT开始(和MIPI一样),GT的SOT一般就是K码,标志了开始,其也具有EOT,标志了结束;但与MIPI有很大的不同,GT的K码可......
  • ##笔记day06-C语言基础:随机数、一维、二维数组、字符数组
    day07笔记1)rand生成随机数1)rand()随机函数头文件:#include<stdlib.h>函数原型:intrand(void);函数功能:生成大于等于0的随机整数参数:void返回值:生成的随机整数2)srand更新随机数种子(srand()函数用于给rand()函数设定种子)头文件:......
  • HTML笔记总结(Xmind格式):第一天
    Xmind鸟瞰图:简单文字总结:笔记总结:1.常用开发工具:VScode,Hbuilder,IDEA2.常见浏览器:IE,火狐(Firefox),谷歌(chrome),Safari3.Web标准:结构标准,表现标准,行为标准4.HTML的全称为超文本标记语言5.排版标签有:标题标签,段落标签,水平线标签,换行标签,div标签,span标签6.标题标签的特点: ......
  • Multithreading in Java
    Whatismultithread?multithread(多线程)可以让程序/系统同时做多件事情。用于提升效率。这里要着重介绍四个概念。process(进程),进程具有自包含的独立运行环境(self-containedexcesiveenvironment),并且有着自己的内存空间(ownmemoryspace)。thread(线程),线程和进程都......