Java学习day06:面向对象基础,构造方法,成员/局部变量

news2024/11/20 20:41:39

声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)


Java学习day06:面向对象基础,构造方法,成员/局部变量

一、从生活角度理解面向过程和面向对象

1.面向过程:

程序自上而下执行,不牵涉到类和对象的操作。本质是代码自己完成自己的功能,冒泡排序是面向过程的,也就是说,亲力亲为 都是面向过程的。

2.面向对象:

程序是靠对象完成一定的功能,Arrays.sort(arr)  这个就是面向对象的,借助于对象来实现功能的

大家可以这么想,面向过程就是啥子事情都自己干,而面向对象则是专业的事情找专业的人干,比如做饭,有的人选择自己买菜自己做饭,有的人直接交给保姆完成,从生活上来说,我认为面向过程更重要,而从工作上来说,我认为面向对象更重要 

二、类和对象概念

1.类:

对一切相似事物的统称,是一个泛泛的概念。可以用来描述事物的特征和行为

特征:就是一类事物的属性,比如人的年龄  身高 体重  性别
在Java代码中使用变量来表示一个类的特征或者属性
int age;
double height;
是静的东西

行为:就是动作  吃饭 睡觉  敲代码
在Java中使用方法来描述一个类的行为
是动的东西 

只要把握好特征和行为就可以写好一个类了

2.对象: 

是一个具体的实体。是这是真实存在的。在类的基础之上孵化出来的。

举一个例子:狗是一个类,而我家养的哈士奇小峰就是一个对象。

三、声明类的方法

语法格式:
[public] class 类名 {
 对于当前类的属性的描述
 对于当前类的行为的描述
}

这里的public可以省略的 ,而且很多时候还不能用public,当写在一个文件夹里的时候,毕竟文件名要跟public后面跟的类名一致,就只能用一个public,所以建议就是直接记住声明类没有public。给一个示例:

 class Person {
  //人类:
   //属性: 姓名  年龄  性别  身高
   //行为: 吃饭  睡觉
 //类下面的属性:  Java使用变量来描述
  //在类中 变量最好不要赋值
  String name; //名字  null
  int age;//年龄  0
  char sex;//性别 
  double height;//身高0.0
  //在类中后书写行为  Java使用方法来描述行为
  //public static void eat() {}
  //今天学的内容,和之前方法的声明不一样,去掉static即可
  public void  eat () {
   
   System.out.println("中午吃酸菜鱼");
  }
  public void sleep () {
   System.out.println("中午不睡,下午崩溃");
  }

四、对象的创建 

一个类声明好以后,即使不使用它,它也是一直存在,咱们可以借助于对象衍生出一个实体,
类可以衍生出来一个对象。类相当于一个模子,可以造出来一个实体。

造出对象的目的是为了执行属性的复制和方法的调用的

综上:先有类,再有对象
对象的创建在main主函数中。目的是为了执行这个对象代码

Java类的语法格式:
类名  对象的名字 = new 类名();

示例:

//Demo1叫测试类  里面有main主函数
public class Demo1 {
 public static void main(String[] args) {
  //类名  对象的名字 = new  类名();
  //这个对象是由类衍生出来的,就意味着类下面的属性可以使用
  //类下面的方法我可以调用
  Person person = new Person();
  //对属性进行赋值
  //person的名字 为 狗蛋
  person.name = "狗蛋";
  person.age = 78;
  person.sex = '男';
  person.height = 98.7;
  //以上是对对象的属性进行赋值
  //将对象的属性值取出来
  System.out.println(person.name + person.age + person.sex + person.height);
  //方法的调用  对象.方法名字();
  person.eat();
  person.sleep();
   }
}

 五、实体类和测试类在同一个Java文件中

1.注意事项:

需要注意的两点:实体类和测试类写在同一个文件中的时候,实体类不能带public修饰符

第二点是实体类可以写在测试类前面,也可以写在测试类后面,是不影响的,但是区分好,不能写在测试类里面了

示例:

class Pig {
    String name;
    double weight;//体重
    char sex;//性别

    public void eat () {
        System.out.println("猪吃白菜!!!");
    }
    public void sleep () {
        System.out.println("猪睡觉打呼噜");
    }
}

public class Main {
    public static void main(String[] args) {
        Pig pig = new Pig();
        pig.name = "大黄";
        pig.weight = 100.1;
        pig.sex = '公';
        System.out.println(pig.name + pig.weight + pig.sex);
        pig.eat();
        pig.sleep();

    }
public class Main {
    public static void main(String[] args) {
        Pig pig = new Pig();
        pig.name = "大黄";
        pig.weight = 100.1;
        pig.sex = '公';
        System.out.println(pig.name + pig.weight + pig.sex);
        pig.eat();
        pig.sleep();

    }

}
class Pig {
    String name;
    double weight;//体重
    char sex;//性别
    public void eat () {
        System.out.println("猪吃白菜!!!");
    }
    public void sleep () {
        System.out.println("猪睡觉打呼噜");
    }
}

这两种写法都没有任何问题,但如果要把pig类写在main方法里面,那就需要注意了,由于Pig类是非静态的内部类,它与外部类的实例相关联。在静态方法main中,你无法直接引用非静态内部类的实例变量。此时可以将Pig类声明为静态内部类,或者将它提取到单独的文件中,而实际开发中都会是把实体类重新写道一个文件中的

 总结:当你将Pig类提取到Main类的外部时,它变成了一个独立的类,可以直接访问和修改其成员变量,不需要通过对象实例来引用非静态变量。而当你将Pig类声明为Main类的内部类时,它与外部类的实例相关联,需要通过对象实例来引用非静态变量。

可能这里很多朋友还不清楚静态和非静态,这个后面会讲的,先拓展了解就是。

2.内部类和外部类的区别:

区别内部类外部类详细解释
访问权限内部类可以访问外部类的私有成员外部类不能直接访问内部类的私有成员这是因为内部类被认为是外部类的一部分,所以可以访问外部类的所有成员,包括私有成员。然而,外部类无法直接访问内部类的私有成员,因为内部类的私有成员对于外部类来说是不可见的。
关联性内部类可以访问和修改外部类的成员变量和方法,包括私有成员。外部类无法直接访问内部类的成员变量和方法,需要通过内部类的实例来访问。内部类与外部类之间存在一种关联关系。
创建方式要创建内部类的实例,首先需要创建外部类的实例,然后使用外部类的实例来创建内部类的实例。外部类的实例可以直接创建,不需要依赖其他类的实例。内部类的实例必须依赖于外部类的实例。
静态性内部类可以是静态的或非静态的外部类只能是非静态的。静态内部类与外部类没有关联,可以直接创建静态内部类的实例。非静态内部类与外部类相关联,需要通过外部类的实例来创建非静态内部类的实例。

六、构造方法 

1.无参构造:

构造方法的目的是为了初始化对象的,换句话说,可以对对象的属性进行赋值。对象创建其实是依据构造方法创建的,因此可以在构造方法里对对象进行赋值等操作。

在不写构造方法的情况下,会默认生成一个无参构造的。

同时注意:构造方法必须写在实体类中

语法格式:
public 类名() {
}

示例:

class  Person{
    String name;
    int age;

    //无参构造
    public Person(){
        System.out.println("无参构造");
        //this指的是当前对象,你创建哪个对象,this指的就是那个
        //打印当前对象的内存地址,和main方法里打印的是一样的
        System.out.println(this);
        this.name="okk";
        this.age=20;
    }
}

public class Main {
    public static void main(String[] args) {
        //当new Person()的时候就会去自动调用无参构造方法去执行无参构造方法中的方法体
        Person person=new Person();
        //打印的就是person对象的内存地址
        System.out.println(person);
        person.name="kkk";
        //此时打印的age是初始化的20.但是名字却成了kkk。因为后面赋的值就会覆盖掉初始化的值
        System.out.println(person.age);
        System.out.println(person.name);
    }

 2.有参构造:

语法格式:
public 类名 (参数) {
 初始化条件;
}

 有参构造实际上就是提前给对象的属性赋值,不需要再在main函数依次赋值

参数可以声明一个/多个,但是要知道,参数只是形参,如果这样写就是错误的,因为两个是一样的,形参可以取任何名字,当然一般会取成跟属性名一样的。

这里注意一个初学者易犯的错误:两个是一样的

 //和下面的有参构造一模一样!!!
// public Cat (String kind) {
//  this.kind = kind; 
// }
 //声明一个有参构造方法
 public Cat (String name) {
  this.name = name;
 }

 同时还要注意一点,如果写了有参构造,默认的无参构造方法就没有了,如果想用,就需要再写一遍

示例:

class Cat {
 String name;
 String kind;
 int age;

 public Cat() {
  
 }
 //声明一个有参构造方法
 public Cat (String name) {
  this.name = name;
 }
 //带有三个参数 构造方法
 public Cat (String name, String kind, int age) {
  this.name = name;
  this.age = age;
  this.kind = kind;
 }
}
public class Demo3 {

 public static void main(String[] args) {
  Cat cat = new Cat("狗蛋");
  
  System.out.println(cat.name);
  //new对象的时候依据构造方法来创建对象
  Cat cat1 = new Cat("毛蛋", "波斯", 3);
  System.out.println(cat1.name);
  System.out.println(cat1.age);
  System.out.println(cat1.kind);
  //一旦写了有参构造方法以后,默认的无参构造方法就没有了
  Cat cat2 =  new Cat();
  cat2.name = "Tom";
  cat2.age = 4;
  cat2.kind = "蓝猫";
 }
}

 3.对象在内存中如何存储:

先复习:栈内存,存的是八大基本数据类型的数据:byte short int long float double char boolean
存的是对象的引用,等号左边的

而堆内存,存的是对象的全部数据

七、构造代码块(了解) 

注:开发中已经不用了,但是后面会讲静态代码块。所以这里提一下

构造代码块的目的也是对对象进行初始化的。功能和构造方法一样的

语法格式:
{
 语句体
}

注意事项:
1.构造代码块必须写在实体类中
2.先执行的是构造代码块,再执行构造方法,不管构造代码块的位置在前还是后,这是由Java虚拟机决定的,记住就行。

示例:

class Tiger {
 String name;
 int age;
 
 //再声明一个构造方法
 public Tiger () {
  this.name = "haha";
  System.out.println("我是无参构造方法");
 }
 //先写一个构造代码块
  {
   this.name = "嘻嘻";
   System.out.println("我是构造代码块");
  }
}
public class Demo5 {
 public static void main(String[] args) {
  //先执行实体类中构造代码块 然后再执行构造方法
  Tiger tiger = new Tiger();
  System.out.println(tiger.name);
 }

}

这里最终打印的name是haha,就是因为构造代码块先执行,所以后执行的构造方法把嘻嘻值给覆盖了。

八、成员变量和局部变量

1.局部变量:

抓住一点:大括号里面的那个变量只能在大括号里面来使用的

示例:

  for (int i = 0; i < 5; i++) {
   //上面的i就是for循环的局部变量,出了for循环还能用吗?不能
   //紧紧围绕着一个东西就是那个大括号
   System.out.println(i);
  }
  //System.out.println(i);
  //此时就会报错,因为i的作用域只在for循环里

此时的i对于for循环来说是成员变量(当然这种说法是有问题的),对整个类来说就是局部变量。

2.成员变量: 

定义在实体类中的大括号的后面,又叫属性

示例:

class Person {
 //name 和 age都是成员变量
 String name;
 int age;
 //作用域 是作用再整个类中 的,只要在类中都可以使用当前的成员变量
 
 public void eat () {
  double weigt;//局部的变量
  System.out.println(name + age);
 }
}

3.区别:


 今天没有习题,理解为主,特别是理解类和对象概念,以及如何创建类和对象,类的构造方法,成员变量和局部变量等,是现在必须要理解的,大家可以自己试着写几个类,把今天讲的知识点都用上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1031680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络爬虫相关概念

目录 1、什么是爬虫&#xff1f; 2、网络爬虫步骤 3、爬虫核心 4、爬虫的用途 5、爬虫分类 6、反爬手段 1、什么是爬虫&#xff1f; 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那一台计算机上的数据便是蜘蛛网上的一个猎物&#xff0c;而爬虫程序就是一只小蜘蛛&am…

给定一个链表,判断链表中是否有环

【思路】 快慢指针&#xff0c;即慢指针一次走一步&#xff0c;快指针一次走两步&#xff0c;两个指针从链表其实位置开始运行&#xff0c; **如果链表带环则一定会在环中相遇&#xff0c;**否则快指针率先走到链表的末尾。比如&#xff1a;陪女朋友到操作跑步减肥。 bool hasC…

测试域: 流量回放-工具篇jvm-sandbox,jvm-sandbox-repeater,gs-rest-service

JVM-Sandbox Jvm-Sandbox-Repeater架构_小小平不平凡的博客-CSDN博客 https://www.cnblogs.com/hong-fithing/p/16222644.html 流量回放框架jvm-sandbox-repeater的实践_做人&#xff0c;最重要的就是开心嘛的博客-CSDN博客 [jvm-sandbox-repeater 学习笔记][入门使用篇] 2…

Unity丨自动巡航丨自动寻路丨NPC丨

文章目录 概要功能展示技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 本文功能是制作一个简单的自动巡逻的NPC&#xff0c;随机自动寻路。 功能展示 技术细节 using UnityEngine;public class NPCController : MonoBehaviour {public float moveSpeed 5.0f; // …

成都瀚网科技:抖音提供差异化​​亮点!

在抖音平台上&#xff0c;精选联盟是一个专门为优质品牌提供展示和推广机会的合作项目。对于斗店主来说&#xff0c;如何成功对接精选联盟并实现上市是一个重要目标。在这篇文章中&#xff0c;我们将分享一些豆点与精选联盟对接的方法&#xff0c;并提供上币指南。 1、提升店铺…

2023最新如何轻松升级、安装和试用Navicat Premium 16.2.10 教程详解

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

六、决策树算法(DT,DecisionTreeClassifier)(有监督学习)

决策树&#xff08;DT&#xff09;是一种用于分类和回归的非参数监督学习方法。其目标是创建一个模型&#xff0c;通过学习从数据特征中推断出的简单决策规则来预测目标变量的值。一棵树可以看作是一个片断常数近似值。 一、算法思路 具体可参考博文&#xff1a;七、决策树算…

linux升级glibc-2.28

1.准备工作 1.1升级gcc到gcc8 # 安装devtoolset-8-gcc yum install centos-release-scl yum install devtoolset-8 scl enable devtoolset-8 -- bash# 启用工具 source /opt/rh/devtoolset-8/enable # 安装GCC-8 yum install -y devtoolset-8-gcc devtoolset-8-gcc-c devtoolse…

【C语言】数组和指针刷题练习

指针和数组我们已经学习的差不多了&#xff0c;今天就为大家分享一些指针和数组的常见练习题&#xff0c;还包含许多经典面试题哦&#xff01; 一、求数组长度和大小 普通一维数组 int main() {//一维数组int a[] { 1,2,3,4 };printf("%d\n", sizeof(a));//整个数组…

[plugin:vite:css] [sass] Undefined mixin.

前言&#xff1a; vite vue3 TypeScript环境 scss报错&#xff1a; [plugin:vite:css] [sass] Undefined mixin. 解决方案&#xff1a; 在vite.config.ts文件添加配置 css: {preprocessorOptions: {// 导入scss预编译程序scss: {additionalData: use "/resources/_ha…

如何使用远程桌面软件进行远程工作

远程工作提供了更大的灵活性和自由度&#xff0c;使得可以在任何地点工作。而要实现高效的远程工作&#xff0c;一个关键的工具就是远程桌面软件。本文将详细介绍如何使用远程桌面软件进行远程工作&#xff0c;以帮助读者提高工作效率。 一、了解远程桌面软件的基本原理 远程桌…

带你一步实现《栈》(括号匹配问题)

栈的结构及概念 栈是一种特殊的线性表&#xff0c;只允许在固定的一端插入或删除数据&#xff0c;进行插入和删除的一端被称为栈顶&#xff0c;另一端称为栈底。栈中的数据遵循后进先出原则 LIFO&#xff08;LAST IN FIRST OUT) 俗称栈的插入过程叫做压栈&#xff0c;入栈&…

Batbot智慧能源管理云平台:拥抱数字化,提高能源效率!

我们拥抱数字化&#xff0c;以帮助提高能源效率。 政府已采取措施增强国家的环境信誉&#xff0c;旨在实现雄心勃勃的法定目标&#xff0c;即到2035年&#xff0c;将国家温室气体排放量减少78%&#xff08;与1990年相比&#xff09;。 拥抱数字化&#xff0c;提高能源效率&a…

HTTP 协商缓存 Last-Modified,If-Modified-Since

浏览器第一次跟服务器请求一个资源&#xff0c;服务器在返回这个资源的同时&#xff0c;在respone header加上Last-Modified属性&#xff08;表示这个资源在服务器上的最后修改时间&#xff09;&#xff1a; ----------------------------------------------------------------…

ThinkPHP5,使用unionAll取出两个毫无相关字段表的数据且分页

一&#xff1a;首先来了解一下 union 和 unionAll 1&#xff1a;取结果的并集&#xff0c;是否去重 union&#xff1a;对两个结果集进行并集操作&#xff0c;不包括重复行&#xff0c;相当于distinct&#xff0c;同时进行默认规则的排序&#xff1b; unionAll&#xff1a;对两…

JVM面试题-JVM对象的创建过程、内存分配、内存布局、访问定位等问题详解

对象 内存分配的两种方式 指针碰撞 适用场合&#xff1a;堆内存规整&#xff08;即没有内存碎片&#xff09;的情况下。 原理&#xff1a;用过的内存全部整合到一边&#xff0c;没有用过的内存放在另一边&#xff0c;中间有一个分界指针&#xff0c;只需要向着没用过的内存…

【QT】QRadioButton的使用(17)

QRadioButton这个控件在实际项目中多用于多个QRadioButton控件选择其中一个这样的方式去执行&#xff0c;那么&#xff0c;今天这节就通过几个简单的例子来好好了解下QRadioButton的一个使用。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装&#xff1a;Download Pyt…

PIL或Pillow学习2

接着学习下Pillow常用方法&#xff1a; PIL_test1.py : 9, Pillow图像降噪处理由于成像设备、传输媒介等因素的影响&#xff0c;图像总会或多或少的存在一些不必要的干扰信息&#xff0c;我们将这些干扰信息统称为“噪声”&#xff0c; 比如数字图像中常见的“椒盐噪声”&…

聊一聊Twitter的雪花算法

什么是Twitter的雪花算法方法&#xff1f; 这是一种在分布式系统中生成唯一ID的解决方案。Twitter在推文、私信、列表等方面使用这种方法。 •ID是唯一且可排序的•ID包含时间信息&#xff08;按日期排序&#xff09;•ID适用于64位无符号整数•仅包含数字值 符号位&#xff08…

芋道商城,基于 Vue + Uniapp 实现,支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面 DIY 等功能

商城简介 芋道商城&#xff0c;基于 芋道开发平台 构建&#xff0c;以开发者为中心&#xff0c;打造中国第一流的 Java 开源商城系统&#xff0c;全部开源&#xff0c;个人与企业可 100% 免费使用。 有任何问题&#xff0c;或者想要的功能&#xff0c;可以在 Issues 中提给艿艿…