【知晓的丧day拯救计划】java基础学习笔记7 类和对象

笔记来自2019求知讲堂零基础Java入门编程视频教程 https://www.bilibili.com/video/av76235341

本章全是个人瞎理解,错了算我的

面向对象&面向过程

面向过程:POP(Procedure Oriented Programing)
面向对象:OOP(Object Oriented Programing)

面向过程是一种“执行者”思维,如何按照步骤执行一件事,适合解决简单的问题。
面向对象是一种“设计者思维”,如何宏观的分析整个事件,适合解决复杂的问题。

比如要解决“如何造车”这个问题,面向过程考虑的是如何按照步骤一步步建造汽车,面向对象考虑的是如何设计汽车。

当然面向对象离不开面向过程,虽然宏观上是通过面向对象进行整体设计的,但微观上的具体执行和处理数据还是面向过程的。

面向对象的编程过程更接近人类日常的思维逻辑,它将万事万物抽象为对象(例如猫),对象的静态属性(例如猫的名字、颜色),以及对象的动态行为(例如猫吃饭喝水),而面向过程强调的只有其中的动态行为

类和对象的概念可以类比表格
类就相当于表格的表头
对象就相当于表格中的数据,每一行数据就是类的一个对象

姓名年龄性别
张三18
李四20

类的创建

java代码由一个个功能不同的类(Class)组成
类中通过属性Field(成员变量)和行为Method(成员方法)来描述事物。

  • 类的语法格式
    修饰符 class 类名{
      //声明属性;
      //声明方法;
    }

类的成员之一:成员变量

语法格式:

修饰符 类型 属性名 [= 初始值] ;

  • 修饰符
    private:该属性只能被该类的方法访问
    public:该属性可以被该类以外的方法访问

  • 类型
    任何基本类型,int、double,或其他类。

  • 当一个对象被创建时,会对其中成员变量自动进行初始化赋值。

成员变量类型初始值
byte、short、int0
longt0L
float0.0F
double0.0D
char‘\u0000’(表示为空)
booleanfalse
引用类型(String在这里)null

变量的分类

变量的分类:成员变量和局部变量

  • 成员变量:写在类体内,方法体外的变量是成员变量
    { 实 例 变 量 : 不 以 s t a t i c 修 饰 的 , 实 例 化 之 后 才 能 使 用 的 变 量 静 态 变 量 ( 类 变 量 ) : 以 s t a t i c 修 饰 , 不 需 要 类 实 例 化 成 对 象 就 可 以 使 用 , 可 以 通 过 类 名 . 属 性 直 接 使 用 \begin{cases} 实例变量:不以static修饰的,实例化之后才能使用的变量 \\ \\ 静态变量(类变量):以static修饰,不需要类实例化成对象就可以使用,可以通过类名.属性直接使用 \end{cases} static使static使.使

  • 局部变量:写在方法体内的变量称为局部变量
    { 形 参 : 方 法 定 义 中 的 变 量 ( 定 义 方 法 时 括 号 里 的 变 量 ) 方 法 局 部 变 量 : 定 义 在 方 法 内 部 的 变 量 ( 只 能 在 该 方 法 大 括 号 内 使 用 ) 代 码 块 局 部 变 量 : 直 接 在 类 里 的 一 组 大 括 号 就 是 代 码 块 , 在 其 中 定 义 的 变 量 就 是 代 码 块 局 部 变 量 \begin{cases} 形参:方法定义中的变量(定义方法时括号里的变量) \\ 方法局部变量:定义在方法内部的变量(只能在该方法大括号内使用)\\ 代码块局部变量:直接在类里的一组大括号就是代码块,在其中定义的变量就是代码块局部变量 \end{cases} 使

类型声明位置从属于生命周期(作用域)
局部变量方法或语句块内部方法/语句块从声明位置开始,到方法或语句块执行完毕,局部变量消失
实例变量类内部,方法外部对象对象创建,实例变量跟着创建,对象消失,实例变量跟着消失
静态变量类内部,static修饰类被加载,静态变量有效,类被卸载,静态变量消失
  • 成员变量和局部变量的区别
    ①成员变量有默认的初始化值。局部变量没有,声明之后必须显式初始化才能使用
    ②实例变量存在于堆内存中,需要手动释放内存;局部变量存在于栈内存中,作用范围结束后会自动释放内存
    ③成员变量可以根据需要选择权限修饰符,局部变量不用指定权限修饰符

类的成员之二:方法

语法格式
修饰符 返回值类型 方法名(参数列表){
  方法体语句;
  return 返回值;
}

  • 修饰符:public,private,protected等;
  • 返回值类型:return语句传递返回值,没有返回值时为void。
  • 参数列表:[参数类型 参数名称],多个参数之间用逗号隔开;
  • 方法只有被调用才会被执行
  • 方法中只能调用方法,不能在方法中定义方法
  • 同一个类中的方法可以直接互相调用(static调用非static除外)

有关方法重载和参数传递
java基础学习笔记8 方法

一个没啥意义辅助理解的简单例子

public class Cat {    //类名要与该类的文件名一致
	//声明属性;类的成员变量可以先声明,不用初始化,因为他们有默认值
	String name;     //String 类型的默认值是null
	int age;         //int类型的默认值是0
	
	//声明方法;
	public void showName() {
		System.out.println(name);
	}
	public void setAge(int age){
		this.age = age;
	}	
	//返回值类型不为空(void)时,最后一行应该用return返回相应数据
	public int getAge() {
		return age;          
	}
	
	//一般来说,实体类应该有所有属性的set、get方法,以便对属性进行存取修改
	//eclipse中,右键→Source→Generate Setters and Getters... 可以快速生成

	public void eat(String food) {
		System.out.println(name + "今天的食物是:" + food);
	}
	
}

总结,创建类的步骤:
1.定义类(考虑修饰符、类名)
2.编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
3.编写类的方法(考虑修饰符、返回值类型、方法名、形参等)

类的成员之三:构造器(构造方法)

构造器(构造方法)用于创建对象,并给对象进行初始化。
Java通过new关键字来调用构造器。

从名字上理解,就是构造这个类的对象时执行的方法,方法体之中的内容是对成员变量进行初始化

语法格式
修饰符 类名(参数列表){
  初始化语句;
}

public class Person {     //Person类
	public Person() {}    //Person类的默认构造方法
}	

当我们使用" new Person(); " 语句的时候,实际上就是调用了类中的构造方法" public Person() {} ",这个是系统默认的构造器,所以如果没有需求,可以不写构造方法,系统会自动提供一个无参无内容的构造器,默认初始化就是按照上面的表格进行的。

构造器实际上就是类中的一个方法,与普通方法不同之处在于
①具有与类相同的名称;
②不声明返回值类型(与声明成void不同)
③不能被static、final、synchronized、abstract、native修饰
④不能有return语句返回值

如果在创建对象的时候,需要对属性进行额外的定义,比如新建Person类的时候,int型的属性age默认初始值是0,但我想要age的默认值为1,就可以自定义一个构造方法。

//Person类
public class Person {
	public Person() {         //自定义的构造方法,将age初始化为1
		age = 1;
	}	
	private int age;
	public void printAge() {
		System.out.println("年龄是:" + age);
	}
}

//Test类
public class Test {
	public static void main(String[] args) {
		Person p = new Person();          //使用自定义的构造方法新建对象
		p.printAge();
	}	
}
//运行结果:年龄是:1

构造方法还可以传递参数,比如我想在创建Person对象的时候为age属性赋不同的值

public class Person {
	public Person(int age) {    //自定义的构造方法,将age初始化为传入的参数
		this.age = age;         
	}
	private int age;
	public void printAge() {
		System.out.println("年龄是:" + age);
	}
}

public class Test {
	public static void main(String[] args) {
		Person p = new Person(2);   //使用自定义的构造方法新建对象,age初始化为2
		p.printAge();
	}	
}
//运行结果:年龄是:2	

和普通方法一样,构造方法也可以重载,使对象的创建更加灵活,方便创建各种不同的对象,比如上面两个构造器就可以同时存在。当然,不同的构造方法要有不同的参数列表加以区分。

还需要注意的是一旦自定义了构造器,系统就不再提供默认构造器了,所有的对象都将按照自定义的显示构造器创建。

其他注意:
java语言中,每个类至少有一个构造器
默认构造器的修饰符与所属类的修饰符一致
父类的构造器不可以被子类继承

对象的创建和使用

对于类的使用无外乎两种:一是操作类的变量,一是调用类的方法。

  • 创建类的对象(即类的实例化)
    声明一个类的变量,格式和基本数据类型的声明相同——类名 变量名;
    使用 new+构造器 创造一个对象;
Cat cat = new Cat();     //cat就是Cat类的一个实例
  • 使用 对象名.属性 访问对象的属性
  • 使用 对象名.方法 调用类的方法。
//以上面的Cat类,为例
cat.name = "喵喵";    //给cat对象的属性赋值
System.out.println(cat.name);   //访问对象的属性

cat.showName();      //调用cat对象的方法
cat.setAge(2);       //若成员变量不是public而是private,类外就不能直接使用对象名.属性访问属性,要养成使用get/set方法访问成员变量的习惯
int age = cat.getAge();   //调用有返回值的方法时,需要有对应的变量接受返回值
cat.eat("猫粮");      //有参数的方法调用时,输入参数的数据类型应该与方法声明的形参相同
  • 一个类可以创建多个对象,每个对象拥有各自的一套属性值,且互不干扰
  • 匿名对象,即不将new的对象赋给一个具体的变量,直接调用这个对象的方法
    使用情况:只需要对一个对象进行一次方法调用;或者将匿名对象作为实参传递给一个方法。
new Cat().showName();
  • 同一个类中的访问机制:类中方法可以直接访问类中的成员变量(static方法访问非static变量,编译不通过)
    不同类中的访问机制:先要创建访问类的对象,再使用对象来访问类中的成员变量。

利用面向对象的编程理念,计算圆的周长面积

  • 首先进行面向对象分析
    对象:圆;圆的属性:半径;圆的方法:求半径,求周长
//Circle类
public class Circle {
	public final static double PI = 3.14;    //定义常量
	public float r;
	
	public double getCircumference(double r) {
		double circumference = 2 * PI * r;
		return circumference;
	}
	
	public double getArea(double r) {
		double area = PI * r * r;
		return area;
	}
}

//测试类
public class TestObject {
	public static void main(String[] args) {
		double r = 2;
		Circle circle = new Circle();
		double circum = circle.getCircumference(r);
		double area = circle.getArea(r);
		System.out.println("半径" + r + "的圆的周长为:" + circum + ",面积为:" + area);		
	}
}

//运行结果:半径2.0的圆的周长为:12.56,面积为:12.56
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值