JavaSE学习笔记05面向对象编程01
面向对象编程01
java的核心思想就是OOP
面向过程&面向对象
面向过程思想:
- 步骤清晰简单,第一步做什么,第二步做什么......
- 面向过程适合处理一些较为简单的问题
面向对象思想:
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后才对某个分类下的细节进行面向过程的思索
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题
对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
面向对象编程(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中一共有三大变量:局部变量、实例变量(对象级别)、静态变量(类级别)
局部变量存储在栈(stack)
实例变量存储在堆内存
静态变量存储在方法区
2.类与对象的关系
类是一种抽象的数据类型,它是对某一类事物的整体描述/定义,但是并不能代表某一个具体的事物
- 动物、植物、手机、电脑......
- Peson类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为
对象是抽象概念的具体实例
- 张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例
- 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念
创建与初始化对象
对象的创建和使用:
类是一个模板,通过一个类,是可以创建N多个对象的
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创建对象的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:
- 必须和类的名字相同
- 必须没有返回值类型,也不能写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
*/
构造方法的作用:
创建对象
给属性赋值
注意:
构造方法支持重载
当一个类没有提供任何构造方法的时候,系统会默认提供一个无参数的构造方法(这个方法被称为缺省构造器)
手动定义有参的构造方法,无参数构造方法将消失(保险一些建议将无参数的构造方法手写出来)
构造方法中没有手动赋值,统一都会默认赋值,默认赋系统值
空指针异常
空引用访问对象相关的数据时,会出现空指针异常(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(静态的)关键字
所有static关键字修饰的都是类相关的,类级别的
都采用类名.的方式访问
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关键字
一个对象一个this,this存储在堆内存当中对象的内部
this是一个变量,一个引用,this保存当前对象的内存地址,指向自身
this不能使用在静态方法中,this只能使用在实例方法中,谁调用这个实例方法,this就是谁,所以this代表的是:当前对象
大部分情况下this可以省略
JavaSE学习笔记05面向对象编程01的更多相关文章
- javascript 学习笔记之面向对象编程(一):类的实现
~~想是一回事,做是一回事,写出来又是一回事~~一直以来,从事C++更多的是VC++多一些,从面向过程到面向对象的转变,让我对OO的编程思想有些偏爱,将一个客观存在的规律抽象出来总是让人比较兴奋,通过 ...
- python 学习笔记7 面向对象编程
一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...
- C++ Primer 学习笔记_67_面向对象编程 --转换与继承、复制控制与继承
面向对象编程 --转换与继承.复制控制与继承 I.转换与继承 引言: 由于每一个派生类对象都包括一个基类部分,因此能够像使用基类对象一样在派生类对象上执行操作. 对于指针/引用,能够将派生类对象的指针 ...
- javascript 学习笔记之面向对象编程(二):继承&多态
~~接上篇~~上一篇实现了类的实现以及类成员变量和方法的定义,下面我们来了解下面向对象中两个最重要的特性:继承和多态. 继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属 ...
- C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域
面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...
- Spark学习笔记11面向对象编程
面向对象编程 11.1 object类 11.1.1定义一个简单的类 11.1.2 field的getter与setter 定义类包含,定义类的field及方法.其格式如下 class Cla ...
- C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]
面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...
- python学习笔记(七):面向对象编程、类
一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一 ...
- python自动化测试学习笔记-7面向对象编程,类,继承,实例变量,邮件
面向对象编程(OOP)术语: class TestClass(object): val1 = 100 def __init__(self): self.val2 = 200 ...
随机推荐
- pytest(3):pytest运行参数介绍
前言 pytest 带有很多参数,可以使用 pytest --help 来查看帮助文档,下面介绍几种常用的参数: 无参数 读取路径下所有符合规则的文件,类,方法,函数全部执行.使用方法如下: py ...
- [剑指Offer]30-包含min函数的栈
题目 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 题解 辅助栈记录当前最小值. 代码 import java.util.Stack; pub ...
- Spring基于XML的IOC环境搭建及入门
一.使用Maven构建Java项目 * 项目目录结构 1. 在sun.service包下创建UserDao接口和接口实现类: UserDao接口: package sun.service; /** * ...
- (专题一)04 matlab矩阵表示
矩阵的建立 1. 直接输入法建立矩阵, 建立一个三行三列的矩阵 >>A=[1,2,3;4,5,6;7,8,9] 建立一个三行两列的矩阵 >>B=[1,2;4,5;7,8] 2. ...
- 10月1日之后,你新建的GitHub库默认分支不叫「master」了
从 2020 年 10 月 1 日开始,GitHub 上的所有新库都将用中性词「main」命名,取代原来的「master」,因为后者是一个容易让人联想到奴隶制的术语. 这个决定并不是最近才做出的.今年 ...
- Java源码赏析(六)Java String 三顾
在大致了解了String之后,可能有的读者发现了,我们并没有谈到CharSequence接口. 原因是在这一节,CharSequence要和StringBuilder(Java1.5).StringB ...
- [0CTF 2016]piapiapia(反序列逃逸)
我尝试了几种payload,发现有两种情况. 第一种:Invalid user name 第二种:Invalid user name or password 第一步想到的是盲注或者报错,因为fuzz一 ...
- awk的一些认识
awk awk '{pattern + action}' {filenames} 当我们所指定的规则脚本过长的时候,我们可以使用-f的选项加上我们的脚本文件.再复杂点我们可以直接调用shell脚本,就 ...
- vue学习04 v-on指令
vue学习04 v-on指令 v-on的作用是为元素绑定事件,比如click单击,dbclick双击 v-on指令可简写为@ 代码测试 <!DOCTYPE html> <html l ...
- web自动化整理
HTML学习 https://www.w3school.com.cn/html/html_headings.asp 如何写html呢? 可以选择软件 文本编辑器sublime(http://www.s ...