面向对象,也就是找/设计对象,Java编程的核心
二、设计对象并使用 1、先设计类,再设计对象(1)类是共同特征的描述,对象是真是存在的具体实例。
(2)类包括成员变量、成员方法、构造器、代码块、内部类
(3)创建对象:类名 对象名=new 类名()
(4)使用对象:类名.成员变量,类.成员方法()
(5)练习
学生类
package com.laogao.practice;
public class Student {
//成员变量
String name;//学生姓名
String classroom;//班级
//成员方法
public void studenWhere(){
System.out.println(name+"在"+classroom);
}
public void study(){
System.out.println(name+"学习了");
}
}
使用学生类
package com.laogao.practice;
public class JavaPractice {
public static void main(String[] args) {
//面向对象
Student student1=new Student();
Student student2=new Student();
student1.name="小明";
student1.classroom="1班";
student2.name="小李";
student2.classroom="2班";
System.out.println(student1.name);
System.out.println(student2.name);
student2.studenWhere();
student1.study();
}
}
2、注意实现
(1)类名驼峰式,首字母大写,见名知意,不能用关键字
(2)一个类中可以定义多个类,但只能有一个public类,且public类名和文件名一致,推荐一个类一个文件
(3)成员变量定义完整格式:
修饰符(如public) 数据类型 变量名 = 初始值(可以不写);//有和数组一样的默认值
三、内存机制 1、多个对象的内存图(1)先将.class放入方法区,首先在栈内存开辟一块内存运行main方法,new创建的对象会放入堆内存中(即堆内存中有对象的成员变量、成员方法引用地址--->为了不占堆内存空间),接着返一个地址到栈内存(即栈中存储的是对象地址)。
在使用成员变量时,是根据栈内存中对象地址到堆中调用成员变量;在使用成员方法时,是根据栈内存中对象地址到堆中调用成员方法引用地址,根据成员方法引用地址,到方法区调用方法,在栈内存中开辟一块内存运行该方法。
注意:对象存放在堆内存中、对象变量名中存储的是对象地址、成员变量的数据也存放在堆内存中
2、两个变量指向同一个对象内存图Student s1=new Student();
Student s2=s1;//同类型的对象可以直接赋值
//s1、s2指向同一个地址
Java垃圾自动回收期,堆中的不用的对象会自动清理,不占用堆内存
四、购物车案例——架构搭建
package com.laogao.shopdemo;
import java.util.Scanner;
public class ShopCarText {
public static void main(String[] args) {
//将商品存储在数组中,数组缺点:长度固定;之后学习集合,可以解决长度问题
Goods[] shopCar=new Goods[100];
boolean flag=true;
while (flag) {
//搭建 *** 作架构
System.out.println("请选择 *** 作命令:");
System.out.println("添加商品:add");
System.out.println("查询商品:query");
System.out.println("修改数量:update");
System.out.println("结算金额:pay");
System.out.println("退出系统:out");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入您的命令:");
String command=scanner.next();
switch (command){
case "add":
add(shopCar,scanner);
break;
case "query":
query(shopCar);
break;
case "update":
update(shopCar,scanner);
break;
case "pay":
pay(shopCar);
break;
case "out":
flag=false;
System.out.println("欢迎下次使用~~~~~~");
break;
default:
System.out.println("命令错误!");
}
}
}
public static void add(Goods[] shopCar,Scanner scanner) {
Goods item=new Goods();
System.out.println("请输入商品编号(不重复):");
item.gid=scanner.nextInt();
System.out.println("请输入商品名称:");
item.gname=scanner.next();
System.out.println("请输入商品价格:");
item.gprice=scanner.nextDouble();
System.out.println("请输入商品数量:");
item.buynum=scanner.nextInt();
for (int i = 0; i < shopCar.length; i++) {
if (shopCar[i]!=null&&shopCar[i].gid==item.gid){
System.out.println("商品编号重复!");
break;
}
if (shopCar[i]==null){
shopCar[i]=item;
System.out.println("添加成功!");
break;
}
}
}
public static void query(Goods[] shopCar) {
System.out.println(String.format("%-12s","商品id")+String.format("%-12s","商品名称")+String.format("%-12s","商品价格")+String.format("%-12s","商品数量"));
for (int i = 0; i < shopCar.length; i++) {
if (shopCar[i]!=null) {
System.out.println(String.format("%-14s",shopCar[i].gid)+String.format("%-14s",shopCar[i].gname)+String.format("%-14s",shopCar[i].gprice)+String.format("%-14s",shopCar[i].buynum));
}else {
break;
}
}
}
public static void pay(Goods[] shopCar) {
double sum=0;
for (int i = 0; i < shopCar.length; i++) {
if (shopCar[i]!=null) {
sum+=shopCar[i].buynum*shopCar[i].gprice;
}else {
break;
}
}
System.out.println("商品总额为"+sum+"元");
}
public static void update(Goods[] shopCar,Scanner scanner) {
while (true) {
System.out.println("请输入要修改的商品id:");
int id=scanner.nextInt();
Goods goods=getGoodsById(shopCar,id);
if (goods==null){
System.out.println("购物车中没有该商品信息!");
}else {
System.out.println("请输入修改后商品数量:");
int num=scanner.nextInt();
goods.buynum=num;
System.out.println("修改成功!");
query(shopCar);
break;
}
}
}
public static Goods getGoodsById(Goods[] shopCar,int id){
for (int i = 0; i < shopCar.length; i++) {
if (shopCar[i]!=null){
if (shopCar[i].gid==id) {
//找到了
return shopCar[i];
}
}else {//遇到null直接结束
return null;
}
}
return null;//找完100个都还没找到
}
}
五、构造器
1、学构造器的目的
真正知道对象具体是通过调用什么代码得到的;能够掌握为对象赋值的其他简便写法;为以后学面向对象编程的其他内容做支撑
2、构造器分类无参数构造器:(默认存在的)初始化对象时,成员变量数据是默认值
有参数构造器:初始化对象时,可以接收参数为成员变量赋值
package com.laogao.practice;
public class Student {
//成员变量
String name;//学生姓名
String classroom;//班级
//成员方法
public void studenWhere(){
System.out.println(name+"在"+classroom);
}
public void study(){
System.out.println(name+"学习了");
}
/*构造器格式
修饰符 类名(){}
*/
//无参数构造器
public Student(){
System.out.println("调用了无参数构造器");
}
//有参数构造器
public Student(String n,String c){
System.out.println("调用了有参数构造器");
name=n;
classroom=c;
}
}
3、注意
无参构造器是默认有的,但写了有参数构造器后,那无参构造器就不能用了,要想用需要自己再写上无参构造器
六、this关键字可以出现在构造器、成员方法中
this代表当前对象的地址,所以可以解决成员变量名和构造器参数名冲突的问题
可以通过this访问成员变量、成员方法
//有参数构造器
public Student(String name,String classroom){
System.out.println("调用了有参数构造器");
this.name=name;
this.classroom=classroom;
}
七、封装
1、面向对象三大特征:封装、继承、多态
2、封装:告诉我们,如何正确设计对象的属性和方法
3、封装原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
4、举例:
人画圆,对象有人、圆,那画这个方法属于谁呢?属于圆,因为画所需要的数据圆的半径等信息封装在了圆这个对象中。
人关门,对象人、门,关这个方法属于门,因为关这是门的状态,人只是调用了门这个关门方法。
5、封装好处:编程变简单、降低学习成本,有利于建立面向对象的思想。
学会使用API文档
6、如何更好的封装
修饰符private:只能在当前类访问,其他类不能访问
可以通过public修饰的getter、setter()方法进行取值和赋值
八、JavaBeanJavaBean实体类,其对象可以用于程序中封装信息
标准JavaBean需要满足的书写要求:
1、成员变量使用private修饰
2、提供成员变量对应get、set方法--->快捷方式,右键Generate-->Getter and Setter,shift全选OK添加
3、必须提供一个无参构造器(默认存在的);有参数构造器可写可不写--->快捷方式,右键Generate-->Constructor,shift全选OK添加。注意需要补上无参的-->快捷方式,右键Generate-->Constructor,Select None添加
九、补充:成员变量、局部变量区别 十、综合案例欢迎分享,转载请注明来源:内存溢出
评论列表(0条)