Java面向对象①

目录

一.类和对象

二.对象内存图

三.成员变量和局部变量

四.this关键字

五.构造方法

六.封装

 七.API

八.static关键字

九.练习


一.类和对象

1.类:是一组相关属性和行为的集合,可看作是一张对象的设计图

   对象:创造出的实体

2.Java中要创建对象,必须有类的存在

3. 一个类可以创建多个对象

4. 类的组成 

  • 属性(名词):使用成员变量表示

 成员变量:跟定义变量的格式一样,但是位置需要放在方法的外面

  • 行为(动作):使用成员方法表示

成员方法:跟定义方法的格式一样,但是需要去掉static关键字

public class Student{
        String name = "张三";
        int age = 23;//成员变量
        
        public void study(){
            System.out.println("学习Java");

        }
        public void eat(){
             System.out.println("吃饭");

        }//成员方法

}

 5.类的本质:对事物进行描述

6.测试类:带有主方法的类

7.格式

创建对象:类名 对象名 = new 类名();

示例:

Student  stu1 = new Student();

使用对象成员变量:对象名.成员变量;

stu1.name;

使用对象成员方法:对象名.成员方法();

stu1.study();

public class StudentTest {
    public static void main(String[] args){
        Student stu1 = new Student();
        
        System.out.println(stu1.name);
        System.out.println(stu1.age);
        stu1.study();
        stu2.eat();
        
    }
}
public class PhoneTest {
public static void main(String[] args) {
    Phone p1 = new Phone();
    pl.brand ="小米";
    p1.color = "白色":
    p1.price = 4999;
    System.out.println(p1.brand + "---" + p1.color + "---" + pl.price);
    Phone p2 = new Phone() ;
    p2.brand = "华为";
    p2.color = "黑色";
    p2.price = 6999:
    System.out.println(p2.brand + "---" + p2.color + "---" + p2.price);
    }
}

8. 细节

1)打印对象名,可以看到对象的内存地址

全类名:包名+类名

2)成员变量没有赋值也可以直接用,使用的是对象的默认值,可在使用成员变量的时候赋值

二.对象内存图

1.类的字节码文件进入方法区,先加载有主方法的类文件,字节码文件根据源文件加载

2.主方法会被虚拟机调入栈内存

3.出现new,会进入堆内存,在里面开辟空间,传回地址,空间里有成员变量和成员方法的引用地址,引用地址指向方法区

4.方法执行的时候进栈,执行完出栈

5.不同的对象使用的是内存中相互独立的内存空间,互不打扰

6.一个类的不同对象调用的是同样的成员方法

三.成员变量和局部变量

public class Student {
    String name;//成员变量
    int age;
}


public class Test{
 public static void main(String[] args){
        int numl = 10;//局部变量
        }
}


public class Student {
        public void method(){
        int num2 = 20;//局部变量
        }
}

四.this关键字

1.局部变量和成员变量重名时,Java使用就近原则

public class Student {
    String name;//成员变量
    public void sayHello(String name) {
    System.out.printin(name);//局部变量
    }
}

--------------------------------------------------------------
public class ThisDemo {
        public static void main(String[] args){
            Student stu = new Student();
            stu.name ="钢门吹雪";
            stu.sayHello( name:“西城狂鸭");//根据就近原则,最终打印局部变量“西域狂鸭”
        }
}

2.重名时使用this变量区分

3.作用:可以调用本类的成员(变量,方法)

this.本类成员变量

this.本类成员方法();

public void Hello(String name)
    {
        this.name=name;//把局部变量的值赋给本地变量
    }

4.this的省略规则

本类成员方法:没有前提条件,this可以直接省略

本类成员变量:方法中没有出现重名的变量

4.this代表当前类对象的引用(地址

5.哪一个对象调用的方法,方法中的this代表的就是哪一个变量

五.构造方法

1.定义:构建、创造对象的时候所调用的方法

2.格式

1)方法名与类名相同,大小写一致

2)没有返回值,也没有void

3)没有具体的返回值(不由return带回结果数据)


public class Movie {
    private int id;
    private String title;
    private String time;
    private String area;
    private String type;
    private String director;
    private String starring;
    private double score;
//空参构造方法
    public Movie() {
    }
//带参构造方法
    public Movie(int id, String title, String time, String area, String type, String director, String starring, double score) {
        this.id = id;
        this.title = title;
        this.time = time;
        this.area = area;
        this.type = type;
        this.director = director;
        this.starring = starring;
        this.score = score;
    }
}


 

3.构造方法的执行时机

在创建对象的时候被执行调用,每创建一个对象,就会执行一次构造方法

4.作用:可以创建对象的时候,给对象的数据初始化

5.注意事项

1)当没有给出构造方法时,系统会提供一个默认的,无参数的构造方法

2)一个类当中,手动给出了构造方法,系统不会再提供无参构造方法

最好全部手动写出构造方法

3)构造方法不能手动调用

4)构造方法允许重载方法出现

六.封装

1.面向对象三大特征:封装,继承,多态

2.定义:使用类设计对象的时候,将需要处理的数据和处理这些数据的方法,设计到对象中

3.好处:更好的维护数据;

              使用者无需关心内部实现,只要知道如何使用即可。

4.设计规范:合理隐藏,合理暴露

5.权限修饰符(可修饰成员变量和方法)

修饰符

类本身

同一个包的类

不同包的子类

任何类

private

默认

protected

public

6.私有成员变量可以保证数据的安全性

   针对私有成员变量,提供对应set...(设置)和get...(获取)方法

public int getId() {
        return id;
    }

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

7.标准Javabean

1)这个类中成员变量都要私有,并且要对外提供相应的get...和set...方法

2)类中要提供无参,带参构造方法

3)只负责存取数据,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离

 七.API

1)定义:应用程序编程接口

2)其他API(不完整)

3)API帮助文档的使用流程
1.在索引位置搜索自己要查看的类
2.看包
目的: 是不是iava.lang包(核心包),不需要编写导包代码 (import)- 不是java.lang包,都需要编写导包代码
3.看这个类的介绍
目的: 搞清楚这个类的作用
4.看这个类的构造方法
目的: 为了将该类的对象,创建出来
5.看这个类的成员方法(方法摘要)

方法名,参数,返回值,介绍

八.static关键字

1.修饰成员变量和成员方法

2.特点

1)数据被所有类的对象所共享

2)可以直接通过类名调用(推荐)

例: Student.school

public class Student {
    int age;
    String name;
    static String  school;//将school数据设为静态变量
    public void eat() {
        System.out.println("学生需要吃饭");
    }

    public void sleep() {
        System.out.println("学生需要睡觉");

    }

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

    public void print() {
        System.out.println(this);
    }

}
public class StudentTest {
    public static void main(String[] args){
        Student stu1 = new Student();
        stu1.name ="张三";
        stu1.age = 23;
        Student.school="传智专修学院";//直接通过类名进行调用
        System.out.println(stu1.name + "---" + stu1.age + "---"+ Student.school);
        System.out.println("-------");
        Student stu2 = new Student();
        stu2.name ="李四";
        stu2.age = 24;
        System.out.println(stu2.name + "---" + stu2.age + "---" + Student.school);

    }
}

3)随着类的加载而加载,优先与对象存在,在创建对象前就可以使用

4)静态成员变量在堆内存中有单独空间

3.static修饰成员方法

1)常用于制作工具类,使调用更加方便

工具类:不描述事情,只完成一些事情

2)一个类中所有方法都是static修饰,要私有该类的构造方法

目的:不让其他类再创建对象

4.注意事项:

静态方法只能访问静态成员(直接访问)

非静态成员在创建对象后才能使用

public class StaticDemo2{
    static int num1 = 1;//静态成员
    int num2 = 20;//非静态成员

public static void method()
{
    System.out.printin("static...method");

}

public static void main(String[] args) {
// 在静态方法中,只能访问静态成员(直接访问)
        System.out.printIn(num1);//可访问num1,而不能访问num2
        method();
    }
}

不允许使用this关键字(对象还未创建)

只能静态访问静态数据

九.练习

机票查询系统

public class Airticket {
    public static String company = "中国南方航空";
    private int score;
    private double price;
    private String time;
    private String elapsedtime;
    private String  process;

    public Airticket() {
    }

    public Airticket(int score, double price, String time, String elapsedtime, String process) {
        this.score = score;
        this.price = price;
        this.time = time;
        this.elapsedtime = elapsedtime;
        this.process = process;
    }

    /**
     * 获取
     * @return score
     */
    public int getScore() {
        return score;
    }

    /**
     * 设置
     * @param score
     */
    public void setScore(int score) {
        this.score = score;
    }

    /**
     * 获取
     * @return price
     */
    public double getPrice() {
        return price;
    }

    /**
     * 设置
     * @param price
     */
    public void setPrice(double price) {
        this.price = price;
    }

    /**
     * 获取
     * @return time
     */
    public String getTime() {
        return time;
    }

    /**
     * 设置
     * @param time
     */
    public void setTime(String time) {
        this.time = time;
    }

    /**
     * 获取
     * @return elapsedtime
     */
    public String getElapsedtime() {
        return elapsedtime;
    }

    /**
     * 设置
     * @param elapsedtime
     */
    public void setElapsedtime(String elapsedtime) {
        this.elapsedtime = elapsedtime;
    }

    /**
     * 获取
     * @return process
     */
    public String getProcess() {
        return process;
    }

    /**
     * 设置
     * @param process
     */
    public void setProcess(String process) {
        this.process = process;
    }


}

package test;

import domain.Airticket;
import domain.Movie;

import java.util.Scanner;

public class AirticketService {
    private Airticket[] tickets;
    private Scanner sc = new Scanner(System.in);
    public AirticketService(Airticket[] tickets) {
        for (int i = 0; i < tickets.length; i++) {
            this.tickets = tickets;
        }
    }

    public void start() {


        lo:
        while (true) {
            System.out.println("------机票查询系统(5月1日长春到武汉)------");
            System.out.println("请输入您的选择");
            System.out.println("1.查询全部机票信息");
            System.out.println("2.查询推荐指数最高机票");
            System.out.println("3.查询价格最低机票");
            System.out.println("4.退出");
            int choice = sc.nextInt();
            switch (choice){
                case 1:
                    alltickets();
                    break;
                case 2:
                    System.out.println("推荐指数:4------价格:796.0-----时间:16:40—19:50------旅途时长:3h10m------旅途过程:无需中转");
                    break;
                case 3:
                    System.out.println("推荐指数:3------价格:591.0-----时间:9:50—18:40------旅途时长:8h50m------旅途过程:需要中转");
                    break;
                case 4:
                    System.out.println("感谢您的使用,再见!");
                    break lo;
                default:
                    System.out.println("您的输入有误,请检查");
                    break;
            }
        }
    }

    private void alltickets(){
        for (int i = 0; i < tickets.length; i++) {
            Airticket airticket= tickets[i];
            System.out.println("推荐指数:"+airticket.getScore()+"------"+"价格:"+airticket.getPrice()+"-----"+"时间:"+
                    airticket.getTime()+"------"+"旅途时长:"+airticket.getElapsedtime()+
                    "------"+"旅途过程:"+airticket.getProcess()+"------"+"航空公司:"+Airticket.company);
        }

    }

    public void  best() {
        int[] score = {3, 4, 2, 2, 2};
        int max = score[0];
        for (int i = 1; i < score.length; i++) {
            if (max < score[i]) {
                max = score[i];
            }
        }
        System.out.println();
    }


}

package test;

import domain.Airticket;
import test.AirticketService;

public class AirticketTest {
    public static void main(String[] args){

        Airticket airticket1 = new Airticket(3,591,"9:50—18:40","8h50m","需要中转");
        Airticket airticket2 = new Airticket(4,796,"16:40—19:50","3h10m","无需中转");
        Airticket airticket3 = new Airticket(2,1016,"3:25—18:20 ","4h55m","需要中转");
        Airticket airticket4 = new Airticket(2,1105,"19:00—22:15","3h15m","无需中转");
        Airticket airticket5 = new Airticket(2,1200,"16:15—19:30","3h15m","无需中转");
        Airticket[] tickets = {airticket1,airticket2,airticket3,airticket4,airticket5};

        AirticketService airticketService = new AirticketService(tickets);
        airticketService.start();
    }
}

输出结果:

------机票查询系统(5月1日长春到武汉)------
请输入您的选择
1.查询全部机票信息
2.查询推荐指数最高机票
3.查询价格最低机票
4.退出

1
推荐指数:3------价格:591.0-----时间:9:50—18:40------旅途时长:8h50m------旅途过程:需要中转------航空公司:中国南方航空
推荐指数:4------价格:796.0-----时间:16:40—19:50------旅途时长:3h10m------旅途过程:无需中转------航空公司:中国南方航空
推荐指数:2------价格:1016.0-----时间:3:25—18:20 ------旅途时长:4h55m------旅途过程:需要中转------航空公司:中国南方航空
推荐指数:2------价格:1105.0-----时间:19:00—22:15------旅途时长:3h15m------旅途过程:无需中转------航空公司:中国南方航空
推荐指数:2------价格:1200.0-----时间:16:15—19:30------旅途时长:3h15m------旅途过程:无需中转------航空公司:中国南方航空
------机票查询系统(5月1日长春到武汉)------
请输入您的选择
1.查询全部机票信息
2.查询推荐指数最高机票
3.查询价格最低机票
4.退出
2
推荐指数:4------价格:796.0-----时间:16:40—19:50------旅途时长:3h10m------旅途过程:无需中转
------机票查询系统(5月1日长春到武汉)------
请输入您的选择
1.查询全部机票信息
2.查询推荐指数最高机票
3.查询价格最低机票
4.退出
3
推荐指数:3------价格:591.0-----时间:9:50—18:40------旅途时长:8h50m------旅途过程:需要中转
------机票查询系统(5月1日长春到武汉)------
请输入您的选择
1.查询全部机票信息
2.查询推荐指数最高机票
3.查询价格最低机票
4.退出
4
感谢您的使用,再见!
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值