面向对象编程01

java的核心思想就是OOP

面向过程&面向对象

面向过程思想:

  1. 步骤清晰简单,第一步做什么,第二步做什么......
  2. 面向过程适合处理一些较为简单的问题

面向对象思想:

  1. 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后才对某个分类下的细节进行面向过程的思索
  2. 面向对象适合处理复杂的问题,适合处理需要多人协作的问题

对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

面向对象编程(Object-Oriented Programming,OOP)

面向对象编程的本质就是:以类的方式组织代码,以对象的形式组织(封装)数据

三大特性:封装、继承、多态

1.回顾方法

方法的定义

package com.oop.demo01;

//Demo01类
public class Demo01 {
//main方法
public static void main(String[] args) { }
/*
修饰符 返回值 方法名(...){
//方法体
return 返回值
}
*/
//return 结束方法,返回一个结果!
public String sayHello(){
return "Hello,world";
}
public void print(){
return;
}
public int max(int a,int b){
return a > b ? a : b;//三元运算符
}
}

方法的调用

package com.oop.demo01;

public class Demo02 {
public static void main(String[] args) { //实例化这个类new
//对象类型 对象名 = 对象值
Student student = new Student();
//调用
student.say();
}
}
package com.oop.demo01;
//学生类
public class Student { //非静态方法
public void say(){
System.out.println("学生说话了");
}
}
package com.oop.demo01;

public class Demo03 {
public static void main(String[] args) {
//实际参数和形式参数的类型要对应
int add = Demo03.add(1,2);
System.out.println(add);
}
public static int add(int a, int b){
return a + b;
}
}

值传递与引用传递

package com.oop.demo01;
//值传递
public class Demo04 {
public static void main(String[] args) {
int a = 1;
System.out.println(a);//1 Demo04.change(a);
System.out.println(a);//1
}
//返回值为空
public static void change(int a){
a = 10;
}
}
package com.oop.demo01;
//引用传递:对象,本质还是值传递
public class Demo05 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);//null Demo05.change(person);
System.out.println(person.name);//阿波
}
public static void change(Person person){
//person是一个对象:指向的--->Person person = new Person();这是一个具体的人,可以改变属性!
person.name = "阿波";
}
}
//定义了一个Person类,有一个属性:name
class Person{
String name;//默认值为null
}

变量知识点补充

java中一共有三大变量:局部变量、实例变量(对象级别)、静态变量(类级别)

  1. 局部变量存储在栈(stack)

  2. 实例变量存储在堆内存

  3. 静态变量存储在方法区

2.类与对象的关系

类是一种抽象的数据类型,它是对某一类事物的整体描述/定义,但是并不能代表某一个具体的事物

  1. 动物、植物、手机、电脑......
  2. Peson类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为

对象是抽象概念的具体实例

  1. 张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例
  2. 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念

创建与初始化对象

对象的创建和使用:

  1. 类是一个模板,通过一个类,是可以创建N多个对象的

  2. new是一个运算符,专门负责对象的创建

//例:
XueSheng s1 = new XueSheng();

S1是变量名(局部变量),XueSheng是变量s1的数据类型(引用数据类型),XueSheng()是一个对象(学生类创建出来的学生对象)

package com.oop.demo02;

//使用new关键字创建对象
//一个项目应该只有一个main方法
public class Application {
public static void main(String[] args) { //类,抽象的,实例化
//类实例化后会返回一个Student类的具体实例
//student对象就是一个Student类的具体实例
Student xiaoming = new Student();
Student xiaohong = new Student(); xiaoming.name = "小明";
xiaoming.age = 3;
System.out.println(xiaoming.name);
System.out.println(xiaoming.age); xiaohong.name = "小红";
xiaohong.age = 3;
System.out.println(xiaohong.name);
System.out.println(xiaohong.age);
}
}
package com.oop.demo02;

//学生类
public class Student { //属性:字段
String name;//默认值为null
int age;//默认值为0 //方法
public void study(){
System.out.println(this.name + "在学习");
}
}

构造方法

使用new创建对象的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。

类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:

  1. 必须和类的名字相同
  2. 必须没有返回值类型,也不能写void
package com.oop.demo02;

public class Application {
public static void main(String[] args) { //new 实例化了一个对象
Person person = new Person();
System.out.println(person.name);//阿波 Person person1 = new Person("波波");
System.out.println(person1.name);//波波
}
}
package com.oop.demo02;

public class Person {

    //一个类即使什么都不写,他也会存在一个构造方法

    String name;

    //显示的定义构造器
//无参构造
//实例化初始值,使用new关键字本质上是在调用构造器
public Person(){
this.name = "阿波";
} //有参构造,一旦定义了有参构造,无参构造必须显示定义
public Person(String name){
this.name = name;
}
}
/*
1.快捷键:Alt + insert会弹出一个小窗口
2.选择Constructor,勾选参数再点0k即可
3.若要选择无参,选择Constructor后点select none
*/

构造方法的作用:

  1. 创建对象

  2. 给属性赋值

注意:

  1. 构造方法支持重载

  2. 当一个类没有提供任何构造方法的时候,系统会默认提供一个无参数的构造方法(这个方法被称为缺省构造器)

  3. 手动定义有参的构造方法,无参数构造方法将消失(保险一些建议将无参数的构造方法手写出来)

  4. 构造方法中没有手动赋值,统一都会默认赋值,默认赋系统值

空指针异常

空引用访问对象相关的数据时,会出现空指针异常(NullPointerException)

Public class NullPointerTest{

Public static void main(String[] args){

	//创建客户对象
Customer c = new Customer();
//访问这个客户的id
System.out.println(c.id);//0 //重新给id赋值
c.id = 9527;
System.out.println(“客户的id是” + c.id); c = null;
// NullPointerException
//编译没问题,因为编译器只检查语法
//但是运行的时候需要对象的存在,但是对象没了(null)
//就只能出现异常
System.out.println(c.id);
}
}
Class Customer{ int id;
}

3.静态代码块和实例语句块(扩展)

static(静态的)关键字

  1. 所有static关键字修饰的都是类相关的,类级别的

  2. 都采用类名.的方式访问

    Static修饰的变量:静态变量

    Static修饰的方法:静态方法

//静态代码块语法:
Static{
Java语句;
Java语句;
}
//特点:静态代码块在类加载时执行,并且只执行一次
//作用:记录类加载的日志信息
Public class Test{
//静态代码块
Static{
System.out.println(“A”);
}
//一个类当中可以编写多个静态代码块
Static{
System.out.println(“B”);
}
//入口
Public static void main(String[] args){
System.out.println(“Hello World!”);
}
Static{
System.out.println(“C”);
}
}
//运行结果:A,B,C,Hell World!
//注意:静态代码块在main方法执行之前执行
//实例语句块
//语法:
{
Java语句;
Java语句;
}
//只要是构造方法执行,必然在构造方法执行之前,自动执行“实例语句块”中的代码

4.this关键字

  1. 一个对象一个this,this存储在堆内存当中对象的内部

  2. this是一个变量,一个引用,this保存当前对象的内存地址,指向自身

  3. this不能使用在静态方法中,this只能使用在实例方法中,谁调用这个实例方法,this就是谁,所以this代表的是:当前对象

  4. 大部分情况下this可以省略

JavaSE学习笔记05面向对象编程01的更多相关文章

  1. javascript 学习笔记之面向对象编程(一):类的实现

    ~~想是一回事,做是一回事,写出来又是一回事~~一直以来,从事C++更多的是VC++多一些,从面向过程到面向对象的转变,让我对OO的编程思想有些偏爱,将一个客观存在的规律抽象出来总是让人比较兴奋,通过 ...

  2. python 学习笔记7 面向对象编程

    一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...

  3. C++ Primer 学习笔记_67_面向对象编程 --转换与继承、复制控制与继承

    面向对象编程 --转换与继承.复制控制与继承 I.转换与继承 引言: 由于每一个派生类对象都包括一个基类部分,因此能够像使用基类对象一样在派生类对象上执行操作. 对于指针/引用,能够将派生类对象的指针 ...

  4. javascript 学习笔记之面向对象编程(二):继承&多态

    ~~接上篇~~上一篇实现了类的实现以及类成员变量和方法的定义,下面我们来了解下面向对象中两个最重要的特性:继承和多态. 继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属 ...

  5. C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

    面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...

  6. Spark学习笔记11面向对象编程

    面向对象编程   11.1 object类 11.1.1定义一个简单的类   11.1.2 field的getter与setter 定义类包含,定义类的field及方法.其格式如下 class Cla ...

  7. C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]

    面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...

  8. python学习笔记(七):面向对象编程、类

    一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一 ...

  9. python自动化测试学习笔记-7面向对象编程,类,继承,实例变量,邮件

    面向对象编程(OOP)术语: class TestClass(object):   val1 = 100       def __init__(self):     self.val2 = 200   ...

随机推荐

  1. 【Flutter 实战】路由堆栈详解

    老孟导读:Flutter中路由是非常重要的部分,任何一个应用程序都离不开路由管理,此文讲解路由相关方法的使用和路由堆栈的变化. Flutter 路由管理中有两个非常重要的概念: Route:路由是应用 ...

  2. 一道JavaScript的二维数组求平均数的题

    JavaScript中只支持一维数组,但是可以在数组中嵌套数组来创建二维以至于多维的数组.今天下午在看书时候,发现一道感觉比较有意思的题,就是js中如何求二维数组的列之和和行之和,现在就给大家分享下, ...

  3. Mysql查看最大连接,修改

    1.查看最大连接量 show variables like '%max_connections%'; 2.修改最大连接量 //修改完记得重启 set GLOBAL max_connections = ...

  4. CSDN博客图片水印自定义及去除方法

    小图上传说明 尺寸较小的图片上传后默认不加水印,而且默认水平居中显示.你可以更改markdown格式后面的#pic_center,这是设置图片水平对齐的方式.#pic_left就是左对齐,#pic_r ...

  5. 微信小程序入门到精通[更新版]

    微信小程序账号与工具 在线文档:https://mp.weixin.qq.com/debug/wxadoc/dev/ 小程序开发者账号注册 微信公众平台:https://mp.weixin.qq.co ...

  6. hystrix源码之插件

    HystrixPlugins 获取并发相关类(HystrixConcurrencyStrategy).事件通知类(HystrixEventNotifier).度量信息类(HystrixMetricsP ...

  7. Raspberry Pi 4B 安装 CentOS 8

    最近新入手一块Raspberry Pi 4B 8G的板子,想在这块板子上搭建CentOS 8的环境.经过数次采坑终于安装成功. 准备条件: 1.Raspberry Pi 4B 板子 +  SD卡 2. ...

  8. 【JVM系列1】深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因

    前言 JVM系列文章如无特殊说明,一些特性均是基于Hot Spot虚拟机和JDK1.8版本讲述. 下面这张图我想对于每个学习Java的人来说再熟悉不过了,这就是整个JDK的关系图: 从上图我们可以看到 ...

  9. 堆的源码与应用:堆排序、优先队列、TopK问题

    1.堆 堆(Heap))是一种重要的数据结构,是实现优先队列(Priority Queues)首选的数据结构.由于堆有很多种变体,包括二项式堆.斐波那契堆等,但是这里只考虑最常见的就是二叉堆(以下简称 ...

  10. 大白话谈JVM的类加载机制

    前言 我们很多小伙伴平时都是做JAVA开发的,那么作为一名合格的工程师,你是否有仔细的思考过JVM的运行原理呢. 如果懂得了JVM的运行原理和内存模型,像是一些JVM调优.垃圾回收机制等等的问题我们才 ...