Java SE 面向对象(上)

  • 面向对象的概念
    • 对象
  • 构造方法
    • this 关键字
    • 垃圾回收
  • 创建对象
  • Static关键字
  • 成员内部类和访问权限
    • 非静态内部类
    • 静态内部类
    • 访问权限
  • 实例运用:超市购物

面向对象的概念

Java作为一种面向对象语言,暂且不谈其特性封装,继承和多态,我们先来了解什么是类和对象,这样有助于我们接下来进一步的学习。

对象

现在让我们深入了解什么是对象。在我们真实的世界里,会发现身边有很多对象(当然不是指的男女朋友)。动物,人,汽车,房子都是我们所说的对象,而这些对象具有自己的行为和状态。

我们可以拿一只猫举个例子,猫猫就作为我们的对象,而其拥有的行为有睡觉,跑动,叫;状态就例如品种,颜色,名字,年龄等等。

那我们对比现实对象和软件对象,它们之间十分相似。软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成的。

类是一个模板,它描述一类对象的行为和状态。而对象是类的一个实例。我们不如创建一个猫的类来理解一下:

public class Cat {String breed;String colour;String name;int age; void sleep(){}void run() {}void meow(){}
}

一个类可以包含以下类型变量:

局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。

成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。

类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。

一个类可以拥有多个方法,在上面的例子中:sleep() run() meow() 都是 Cat 这个类的方法。

构造方法

每个类都有构造方法(其实就是构造了一个函数)。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
值得注意的是,构造方法没有返回值,也不能用void修饰. 如果不小心给构造方法前面添加了返回值类型,那么这将使这个构造方法变成一个普通的方法,在运行时将产生找不到构造方法的错误。

this 关键字

this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。

this 的用法在 Java 中大体可以分为3种:

  1. 普通的直接引用:this 相当于是指向当前对象本身
  2. 形参与成员名字重名,用 this 来区分
  3. 引用构造函数:结合()使用 代表构造方法

垃圾回收

垃圾回收:用于清除垃圾对象,有JAVA虚拟机自动完成,其实本质上是在释放内存空间
可以通过System.gc()来建议进行垃圾回收
对象对回收时finalize会被调用

创建对象

对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:

  1. 声明:声明一个对象,包括对象名称和对象类型
  2. 实例化:使用关键字 new 来创建一个对象
  3. 初始化:使用 new 创建对象时,会调用构造方法初始化对象
    下面是一个创建对象的例子:
public class Cat{public Cat(String name){//这个构造器仅有一个参数:nameSystem.out.println("The cat name : " + name ); }public static void main(String[] args){// 下面的语句将创建一个Cat对象Cat myCat = new Cat( "Bella" );}
}

Static关键字

在java中,static是一个修饰符,用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能;被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问

静态变量:
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。

静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。

static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途----《Java编程思想》P86.

对于static所修饰的内容,我们分为下面三类

  1. 修饰变量:
    存储空间只有一份
    通过类名直接访问
  2. 修饰方法:
    通过类名直接访问 也可以通过实例进行访问;
    不能访问实例变量和实例方法
  3. 修饰代码块:
    类被加载的时候得到执行;应用场景 对类变量进行初始化
    没有static关键字进行修饰的代码块 每创一个对象 都会得到一个执行

成员内部类和访问权限

Java 一个类中可以嵌套另外一个类,语法格式如下

class OuterClass {   // 外部类// ...class NestedClass { // 嵌套类,或称为内部类// ...}
}

要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。而嵌套类有两种类型:

非静态内部类

非静态内部类是一个类中嵌套着另外一个类。 它有访问外部类成员的权限, 通常被称为内部类。

由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现。

class OuterClass {int x = 10;class InnerClass {int y = 5;}
}public class MyMainClass {public static void main(String[] args) {OuterClass myOuter = new OuterClass();OuterClass.InnerClass myInner = myOuter.new InnerClass();System.out.println(myInner.y + myOuter.x);}
}

静态内部类

静态内部类可以使用 static 关键字定义,静态内部类我们不需要创建外部类来访问,可以直接访问它

class OuterClass {int x = 10;static class InnerClass {int y = 5;}
}public class MyMainClass {public static void main(String[] args) {OuterClass.InnerClass myInner = new OuterClass.InnerClass();System.out.println(myInner.y);}
}

注意:静态内部类无法访问外部类的成员

访问权限

所谓访问权限,指的是本类的成员变量、成员方法和内部类对其他类的可见性.
Java一共有四种访问权限,按照权限由大到小分别为public、protected、default和private,如果省略了访问修饰符,那访问权限就是defualt。访问权限的含义和权限控制如下表所示:

访问权限 含义 本类 本包的类 非本包子类 非本包非子类
public 公共的
protected 保护访问权限
default 包访问权限
private 私有的

default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

public : 对所有类可见。使用对象:类、接口、变量、方法

protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

实例运用:超市购物

public class Shopping {public static void main(String[] args){Product apple=new Product();apple.setName("apple");Product orange=new Product();orange.setName("orange");Product juice=new Product();juice.setName("juice");Market market=new Market();market.setName("Hongqi supermarket");market.setProducts(new Product[]{apple,orange,juice});Person Tony=new Person();Tony.setName("Tony");String producename="apple";Person Charles=new Person();Charles.setName("Charles");String producename2="banana";Product product=Tony.buy(market,producename);Product product2=Charles.buy(market, producename2);if(product==null){System.out.println(Tony.getName() + " didn't buy:"+ producename);}else {System.out.println(Tony.getName() + " buy:"+ producename);if(product2==null){System.out.println(Charles.getName() + " didn't buy:"+ producename2);}else {System.out.println(Charles.getName() + " buy:"+ producename2);}    }}
}class Market {private String name;private Product[] products;public String getName() {return name;}public void setName(String name) {this.name = name;}public Product[] getProducts() {return products;}public void setProducts(Product[] products) {this.products = products;}public Product sell(String productName){for(Product product:products){if(productName.equals(product.getName())){return product;}}return null;}
}class Person {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public Product buy(Market market,String productName){return market.sell(productName);}
}class Product {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}

利用上述实例来简单的理解Java的面向对象的思想,特别是对于类和对象,创建对象,构造方法的运用,以及this关键字的使用,垃圾回收来释放内存的操作。

学习笔记:Java SE(2)相关推荐

  1. JAVA学习笔记—JAVA SE(四)JAVA核心库类(下)

    文章目录 四.JAVA核心库类(下) 1. 异常机制和File类 1.1 异常机制 1.1.1 基本概念 1.1.2 异常的分类 1.1.3 异常的避免 1.1.4 异常的捕获 1.1.5 异常的抛出 ...

  2. JDBC学习笔记——Java语言与数据库的鹊桥

    JDBC学习笔记--Java语言与数据库的鹊桥     JDBC(Java DataBase Connectivity):SUN公司提供的 一套操作数据库的标准规范,说白了就是用Java语言来操作数据 ...

  3. 学习笔记-Java并发(一)

    学习笔记-Java并发(一) 目录 学习笔记-Java并发一 目录 Executer Callable和Future 后台线程 线程加入 小计 今天看了这一篇 Java编程思想-java中的并发(一) ...

  4. 深入理解Java虚拟机(第3版)学习笔记——JAVA内存区域(超详细)

    深入理解Java虚拟机(第3版)学习笔记--JAVA内存区域(超详细) 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 对象的创建 对象的内存布局 ...

  5. 狂神说学习笔记 Java流程控制

    目录 Java流程控制 1.用户交互Scanner Scanner对象 next() nextLine(): 2.顺序结构 3.选择结构 4.循环结构 5.Break & Continue 6 ...

  6. java jdk 8学习笔记,Java JDK 8学习笔记 PDF_源雷技术空间

    资源名称:Java JDK 8学习笔记 PDF 内容简介: ●本书是作者多年来教学实践经验的总结,汇集了学员在学习课程或认证考试中遇到的概念.操作.应用等问题及解决方案 ●针对Java SE 8新功能 ...

  7. 狂神说Java学习笔记 Java基础

    目录 机器语言 第二代语言(汇编语言) 第三代语言 高级语言 Java特性和优势 JDK(Java Development Kit) JRE(Java Runtime Enviroment) JVM( ...

  8. Linux学习笔记------java学习

    前言 学习笔记仅供参考 该笔记是作者根据b站狂神说视频以及自己翻阅的一些资料而写 视频连接:狂神Linux视频链接 如果有兴趣的小伙伴可以前去观看 如果购买过服务器的话,可以直接使用宝塔进行傻瓜式安装 ...

  9. 学习笔记-java基础-网络编程

    刚在培训机构学习完JAVA基础和WEB,感觉边学边忘.就把这作为记忆的笔记,我也不知道要不要记笔记,写在本子上太耗费时间了. 一.要想实现网络通信,首先要解决两个问题: ①:如何从网络中定位到一台或多 ...

最新文章

  1. c语言gga字符串校验和代码,NMEA-0183协议解析(示例代码)
  2. [Nginx] – 性能优化 – 配置文件优化
  3. 小样本点云深度学习库_NeurIPS2019 | MIT与上海交大提出新型点云深度学习框架Point-Voxel CNN...
  4. multiply 和 dot 的区别
  5. 冒泡排序(一分钟懂)
  6. ad建集成库_手把手教你创建自己的Altium Designer集成元件库
  7. 怎么使用CAD编辑工具将图纸中的文本对齐
  8. mysql debug版本_MySQL各个版本区别
  9. 关于利用背景减除法的固定摄像头的移动侦测算法
  10. VB学习记录——数组
  11. reactjs中使用高德地图计算两个经纬度之间的距离
  12. AI绘图:chatGpt,midjourney, discord
  13. IDEA中maven项目dependencies报错飘红问题解决
  14. 计算机系统基础——我与袁春风不得不说的知识——入门必看
  15. 梦想世界3手游服务器维护,梦想世界手游进不去 闪退及登录不上解决方法
  16. CSS3 动画实现方法大全
  17. 【转载】极路由KMS_Activator插件使用教程
  18. 法制日报:要在法律上“悉心关照”百度
  19. 区块链 实验十 DAPP开发
  20. 十、Cadence ic 617 D触发器版图设计

热门文章

  1. 98拳皇(c)实现人物走动 释放技能
  2. 关于申请个人域名和虚拟主机---虚拟主机篇
  3. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32
  4. 嘉明的Java学习(6)之Scanner与if...语句
  5. RFID固定资产-基于RFID技术在数据中心资产智能管理系统中的应用—铨顺宏
  6. DFT之LOC和LOS
  7. 云服务器买来之后必做的几件事——你做了吗!【❤️建议收藏❤️】
  8. Vue使用Markdown文档
  9. 解决Anaconda3国内资源下载缓慢、下载不了
  10. 支付宝账单下载读文件解析