【无标题】

面向对象(oop)

类与对象

类:共同特征的描述;

对象:真实存在的具体实例

tips:

  1. 类名首字母建议大写,满足”驼峰模式“,不能用关键字且必须是合法标识符且有意义

  2. 一个Java文件中可以定义多个class类,但只能一个类是public修饰,而且public修饰的类名必须成为代码文件名

  3. 成员变量的完整定义格式是:

    修饰符 数据类型 变量名称 = 初始化值

    public String name = ”小明“

    一般无需指定初始化值(便于创建对象时修改成员变量),存在默认值

    数据类型细则默认值
    基本类型byte、short、char、int、long0
    基本类型float、double0.0
    基本类型booleanfalse
    引用类型类、接口、数组、Stringnull

    注意:实际开发中,还是建议一个代码文件只定义一个类

public class 类名{

1. 成员变量(属性n)
2. 成员方法(行为v)
3. 构造器
4. 代码块
5. 内部类

}

举例如下:

public class Car{
//成员变量(属性)
String name;
double price;
public void start(){

}
public void run(){

}
}

如何得到类的对象:

类名 对象名 = new 构造器();

Car car = new Car();

如何使用对象

  • 访问属性:对象名.成员变量
  • 访问行为:对象名.方法名(…)

定义一个学生类:

public class Student {
    String name;//定义学生的姓名
    String id;//定义学生的学号
    public void playBasketball(){
        System.out.println(name+"正在打篮球");
    }
    public void study(){
        System.out.println(name+"的学号是"+id+",现在正在学习");
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student xiaoming = new Student();
        xiaoming.name = "小明";
        xiaoming.id = "12201";
        System.out.println(xiaoming.name);
        System.out.println(xiaoming.id);
        xiaoming.playBasketball();
        xiaoming.study();
    }
}

运行结果如下:

小明
12201
小明正在打篮球
小明的学号是12201,现在正在学习

内存运行机制

  1. new出来的对象存放在堆内存中

  2. Student xiaoming = new Student();

    xiaoming存储的是对象在堆内存中的地址

  3. 成员变量(name、id)的数据放在对象中,存在于堆内存中

Student xiaohong = xiaoming;
xiaohong.id = 12202//赋值赋的是地址值,地址值是指向堆内存中的变量,相当于把小明的学号修改了

实例:商品购物

public class ShopTest {
    public static void main(String[] args) {
        int id = 0;
        Goods[] goods = new Goods[100];//定义一个商品类型的数组
        while (true) {
            System.out.println("请选择你需要进行的操作!");
            System.out.println("添加商品:add");
            System.out.println("查询商品:query");
            System.out.println("修改商品:update");
            System.out.println("结算商品:pay");
            Scanner sc = new Scanner(System.in);
            String command = sc.next();
            switch (command) {
                case "add":
                    add(goods, sc);
                    //添加
                    break;
                case "query":
                    query(goods);
                    //查询
                    break;
                case "update":
                    update(goods);
                    //修改
                    break;
                case "pay":
                    pay(goods);
                    //结算
                    break;
                default:
                    System.out.println("没有该功能!!!");
            }
        }
    }

    private static Goods getGoodsByID(Goods[] goods, Scanner sc) {
        int id;
        Goods g = new Goods();
        System.out.println("请输入需要查询商品的编号!");
        id = sc.nextInt();
        for (int i = 0; i < goods.length; i++) {
            if (goods[i] != null && goods[i].id == id) {
                g = goods[i];
                return g;
            }
        }
        return null;
    }

    private static void pay(Goods[] goods) {
        Goods g = new Goods();
        double money = 0;
        for (int i = 0; i < goods.length; i++) {
            if (goods[i] != null) {
                g = goods[i];
                money += (g.price * g.buyNumber);
            }
        }
        System.out.println("您购买所有商品总价为:" + money);
    }

    private static void update(Goods[] goods) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            Goods g = new Goods();
            g = getGoodsByID(goods, sc);
            if (g != null) {
                System.out.println("请输入需要修改的价格!");
                g.price = sc.nextDouble();
                System.out.println("修改成功!!!");
                break;
            } else {
                System.out.println("您输入的id有误!请重新输入!");
            }
        }
    }

    private static void query(Goods[] goods) {
        Goods g = new Goods();
        System.out.println("商品编号|" + "商品名称|" + "商品金额|" + "购买数量");
        for (int i = 0; i < goods.length; i++) {
            if (goods[i] != null) {
                g = goods[i];
                System.out.println("\t" + g.id + "\t" + g.name + "\t" + g.price + "\t" + g.buyNumber);
            }
        }
    }

    private static void add(Goods[] goods, Scanner sc) {
        Goods g = new Goods();
        System.out.println("请输入需要添加商品的编号");
        g.id = sc.nextInt();
        System.out.println("请输入需要添加的商品名称");
        g.name = sc.next();
        System.out.println("请输入需要添加的商品金额");
        g.price = sc.nextDouble();
        System.out.println("请输入需要添加的商品购买数量");
        g.buyNumber = sc.nextInt();
        for (int i = 0; i < goods.length; i++) {
            if (goods[i] == null) {
                goods[i] = g;
                break;
            }
        }
        System.out.println("*********" + g.name + "添加成功!!!" + "*********");
    }
}

构造器

  • 定义在类中的,可以用于初始化一个类的对象,并返回对象的地址。

构造器分类和作用

  1. 无参构造器(默认存在):初始化对象时,成员变量的数据均采用默认值。
  2. 有参数构造器:在初始化对象的时候,同时可以接收参数为对象进行赋值

tips:

  • 任何类定义出来,默认自带了无参数构造器,写不写都有
  • 但是定义了有参数构造器,那么无参数构造器就没有了,如果还想用无参数构造器,此时就需要自己手写一个无参数构造器。

this关键字

this可以出现在构造器和方法中,代表当前对象的地址

this关键字的作用:

  • 可以用于指定访问当前对象的成员变量、成员方法

有参构造器中,填入name = name,将无法正确赋值。

解决方法调用this,代表当前对象的地址。

封装

  • 面向对象三大特征:封装、继承、多态
  • 封装:告诉我们,如何正确设计对象的属性和方法
  • 封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为。

tips:如果有一个人的类,人需要画圆这个方法,可以将圆定义为一个新的类,圆这个类中调用画圆这个方法,这样人可以直接使用画圆这个方法,狗也可以。

面向对象中,画圆、关门这些都应该是圆和门自己封装的方法。

如何更好地进行封装?

  • 一般建议对成员变量使用private(私有、隐藏)关键字修饰(private修饰的成员只能在当前类中访问)
  • 为每个成员变量提供配套public修饰的getter、setter方法暴露其取值和赋值

JavaBean

JavaBean可以称为实体类,其对象可以用于在程序中封装数据。

标准JavaBean须满足如下书写要求:

  1. 成员变量使用private修饰
  2. 提供成员变量对象的setXxx()/getXxx()方法。
  3. 必须提供一个无参构造器;有参构造器是可写可不写的。

新建一个Student类:

public class Student {
    //成员变量
    private String name;//姓名
    private int id;//学号id
    private double score;//分数

    public Student() {//无参构造器
    }

    public Student(String name, int id, double score) {//有参构造器
        this.name = name;
        this.id = id;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}

Test:

public class StudentTest {
    public static void main(String[] args) {
        Student xiaoming = new Student();
        xiaoming.setName("小明");
        xiaoming.setId(122201);
        xiaoming.setScore(100);
        System.out.println("小明的名字"+xiaoming.getName());
        System.out.println("小明的学号"+xiaoming.getId());
        System.out.println("小明的分数"+xiaoming.getScore());
        Student xiaohong = new Student("小明",122202,98);
        System.out.println("小红的名字"+xiaohong.getName());
        System.out.println("小红的学号"+xiaohong.getId());
        System.out.println("小红的分数"+xiaohong.getScore());
    }
}

Movie类:

public class Movie {
    private String name;
    private String actor;
    private double score;
    private String country;

    public Movie(String name, String actor, double score, String country) {
        this.name = name;
        this.actor = actor;
        this.score = score;
        this.country = country;
    }

    public Movie() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}

Test:

public class MovieTest {
    public static void main(String[] args) {
        Movie [] m = new Movie[3];
        m[0] = new Movie("大话西游","周星驰",9.1,"中国");
        m[1] = new Movie("泰坦尼克号","小李子",8.8,"美国");
        m[2] = new Movie("海贼王","路飞",9.0,"日本");
        showMovie(m);
    }
    public static void showMovie(Movie [] m){
        Movie n = new Movie();
        for (int i = 0; i < m.length; i++) {
            n = m[i];
            System.out.println("电影名称为:" + n.getName());
            System.out.println("电影主演为:" + n.getActor());
            System.out.println("电影评分为:" + n.getScore());
            System.out.println("电影国籍为:" + n.getCountry());
            System.out.println("------------------------------");
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值