title: Java进阶学习(1) 类与对象初始化 成员变量成员函数
date: 2020-02-01 14:19:05
tags: Java学习
public static void main(String[] args)
{
Picture pic = new Picture(420,250);
Circle c1 = new Circle(320,40,80);
Rectangle r1 = new Rectangle(100, 100, 100, 100);
Triangle t1 = new Triangle(100, 100, 200, 100, 150, 50);
Line l1 = new Line(0,205,400,205);
pic.add(c1);
pic.add(r1);
pic.add(t1);
pic.add(l1);
pic.draw();
}
GUI = 图形用户界面 读作 古一~
用这个例子用于理解类和对象关系的例子
对象与类
对象是实体 需要被创建 可以为我们做事情
类的规范 根据类的定义来创建对象
类用于创建对象 制定创建对象的规则 规范定义
对象是实体 是被创建出来的物体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lok01QX4-1580663666801)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201152159741.png)]
对象 是这只猫 指具体的某一只猫 此时这只猫就是一个对象
而我们说猫的时候是指类 猫所有的属性 定义一只猫的规范
类定义了对象 每一个对象是那个类的实体
对象具有属性和服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-owjD2SeN-1580663666804)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201152353357.png)]
把数据和对数据的操作放在一起称为封装
由这些操作保护内部的数据 数据是不对外开发的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4XRIBOgs-1580663666805)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201152743971.png)]
面向对象思维看待事物看到功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xjJoqSnb-1580663666808)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201153106599.png)]
属性和动作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5EnCfEoE-1580663666811)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201153222964.png)]
public class VendingMachine {
int price = 80;
int balance; //余额
int total;
void showPrompt()
{
System.out.println("Welcome");
}
void insertMoney(int amount)
{
balance = balance + amount;
}
void showBalnace()
{
System.out.println(balance);
}
void getFood()
{
if(balance >= price)
{
System.out.println("Here you are");
balance = balance - price;
total = total + price;
}
}
public static void main(String[] args) {
VendingMachine vm = new VendingMachine();
vm.showPrompt();
vm.showBalnace();
vm.insertMoney(100);
vm.getFood();
vm.showBalnace();
}
}
定义了一个对象VendingMachine
创建对象
new VendingMachine();
VendingMachine vm = new VendingMachine();
自己设计了一个类 就可以用新设计的类型 VendingMachine 定义一个对象变量vm 用于接收新定义的一个对象new VendingMachine();
对象变量是对象的管理者。
让对象做事
使用点运算符 .
v.insertMoney(100);
v.getFood();
public static void main(String[] args) {
VendingMachine vm = new VendingMachine();
vm.showPrompt();
vm.showBalnace();
vm.insertMoney(100);
vm.getFood();
vm.showBalnace();
VendingMachine vm1 = new VendingMachine();
vm1.insertMoney(200);
vm.showBalnace();
vm1.showBalnace();
}
创建不同的对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LS8yHnyx-1580663666813)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201154618620.png)]
在debug的时候不同的对象id号不同则为不同的对象而且点开内容也不同
类是定义了这个类所有对象长什么样
对象是这个类的一个具体实例
在类中定义的变量在每一个对象中都存在,且每个对象中的变量都不一样 不是同一个变量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yM66fbq6-1580663666814)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201163105728.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0LZrOqZr-1580663666816)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201163132951.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aznFuSvX-1580663666817)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201163156478.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rMyyOuRe-1580663666820)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201163223751.png)]
函数与成员变量
在函数㕜可以直接写成员变量的名字来访问成员变量
究竟访问哪个对象 函数是通过对象来调用的
v.insertMoney()
这次调用临时建立了insertMoney()和v之间的关系 让insertMoney()内部的成员变量指的是成员变量
使用的是this联系
this
this是成员函数的一个特殊固有的本地变量 代表的是调用了这个函数的那个对象在调试的时候可以看到。
int price = 80; //成员变量price
int balance; //余额
int total;
void setPrice(int price) //此处的price是此函数的参数price 而不是上面的成员变量price=80的price
{
this.price = price; //直接的price为此函数的参数 要访问成员变量的price 要使用this来区分成员变量的price(this.price来表示成员变量)和函数参数的price(只可表示函数花括号内的参数)
}
this 常用还有因为可以少打字
this.getFood();//少打字使用this.
调用函数
通过.函数调用某个对象的函数 而this为当前调用这个函数的对象
在成员函数内部直接调用自己(this)的其他函数
void insertMoney(int amount)
{
balance = balance + amount;
showBalnace(); //在成员函数内部 调用函数不同加前缀 this.可加可不加
}
void showBalnace()
{
System.out.println(this.balance); //this.balance 与balance 一样
}
showBalnace(); //在成员函数内部 调用函数不同加前缀 this.可加可不加
但在成员函数外部调用的时候必须加上是哪个对象调用
vm.showBalnace();
vm1.showBalnace();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kkEyeucY-1580663666821)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201164404594.png)]
j进了insertMoney再进showBalance 此时id为18
进入showBalance后仍为18 this会带入
此处是在成员函数中调用成员函数不用加前缀 默认直接带入当前调用类中函数的对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjIeQ91L-1580663666823)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201164435763.png)]
本地变量
定义在函数内部的变量是本地变量 定义在函数外部的变量为成员变量
本地变量的生存期和作用域都是函数内部
成员变量的生存期是对象的生存期(new出一个对象才开始存在) 作用域是类内部的成员函数
成员变量的消失是java自动垃圾回收自动消失 只要关心什么时候开始存在
成员变量是new一个新的对象出来成员变量就存在 而本地变量是在函数当中存在的,当调用一个函数进入函数内部的时候本地变量存在 当函数调用结束本地变量消失。
作用域 本地变量在大括号内 而成员变量作用域在一个类的内部。类中的成员函数都可以使用这些成员变量。
对象的初始化
成员变量的初始化
类中的成员变量 java会保证 给成员变量一个初始值0
成员变量定义初始化
1.成员变量在定义的地方就可以给出初始值
2.没有给出初始值的成员变量会自动获得0值
对象变量的0值代表没有管理任何对象也可以主动给null值
3.定义初始化可以调用函数 甚至可以使用已经定义的成员变量
构造函数
如果一个成员变量函数的名字和类的名字完全相同 则在创建这个类的每一个对象的时候会自动调用这个函数 构造函数
这个类不能有返回类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MbE3EKBL-1580663666825)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201170316245.png)]
int price = 80; //成员变量price
int balance = f(); //余额 使用函数调用
int total;
VendingMachine() //构造函数 在构造的时候会调用构造函数 但下一步不是进入函数 而是把上面的成员变量先初始化 再进入构造函数语句
{
total = 100;
}
VendingMachine(int price) //构造函数可以有多个 重载
{
this.price = price;
}
两个同名函数看初始化的时候叫做函数重载
一个类可以有多个构造函数 只要他们的参数表不同
创建对象的时候给出不同的参数值 就会自动调用不同的构造函数
通过this()还可以调用其他构造函数
一个类里的同名但是参数表不同的函数构成了重载关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qEraLhuS-1580663666828)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201170808437.png)]