笔记来自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、int | 0 |
longt | 0L |
float | 0.0F |
double | 0.0D |
char | ‘\u0000’(表示为空) |
boolean | false |
引用类型(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