1.面向过程的代表语言:C语言

面向过程:每一步都需要一步步实现,按照程序进行编程

2.面向对象

面向对象是基于面向过程的编程思想;

2.1面向对象:是以对象为基础的编程—分析需求,找到对象,利用对象去处理业务

2.2什么是对象?

  1. 万物皆对象--看得见摸得着的东西<br />(1)特征(属性)--名词<br />(2)特征(方法)--动词

2.3面向对象的特点

(1)高效—-节省代码量,可以进行封装,将一些共有的属性和方法进行打包
(2)可以将程序中的逻辑进行抽象—-把对象中的共有的属性进行提取—>封装

2.4面向对象的特征:封装、继承、多态

封装:实际上就是把一些共有的属性和方法进行抽象之后打包—-后面可以灵活地调用
继承:子类可以继承父类的属性和方法—还可以拓展父类的功能
多态:贯穿于整个oop的,灵活地比较难理解的点—一个对象多种状态

2.5我们学习Java中的最基本的单位(层级结构)—-类

类可以封装数据
类:是一组相关的属性和行为的集合
对象:是该类事物的具体体现

2.6定义类其实就是定义类的成员(成员变量和成员方法)

成员变量:就是事物的属性
定义成员变量,在类中,方法外
成员方法:就是事物的行为
定义成员方法,就是一种方法,只不过不用static
调用类:创建一个对象
格式:类名 对象名=new 类名();
匿名对象:new 类名();只能调用一次。
调用成员变量:对象名.成员变量
调用成员方法:对象名.成员方法

案例:

  1. /**
  2. * @author Lynn
  3. * @create 2020-11-23-10:44
  4. */
  5. /**
  6. * 需求:封装一个学生类
  7. *
  8. * 学生的事物:
  9. * 特征:姓名,年龄····
  10. * 行为:学习,吃饭····
  11. *
  12. * 成员变量(全局变量):声明在类中,方法外
  13. * 初始化:不必要
  14. *
  15. * 成员方法:其实就是方法,只不过不能加static
  16. */
  17. public class Student {
  18. //成员变量---属性
  19. String name;
  20. int age;
  21. public void study(){
  22. //成员方法---行为
  23. System.out.println("good good study");
  24. }
  25. public void eat(){
  26. System.out.println("干饭啦");
  27. }
  28. }
  1. /**
  2. * @author Lynn
  3. * @create 2020-11-23-11:04
  4. */
  5. /**
  6. * Student 是一个类,用来描述学生的信息
  7. * 利用demo这个类来实例化Student
  8. *
  9. * 对象的实例化---new 对象
  10. * 格式:
  11. * 类名 对象名=new 类名()
  12. *
  13. * 访问对象的属性
  14. * 成员变量:对象名.成员变量
  15. * 成员方法:对象名.成员方法
  16. */
  17. public class StudentDemo {
  18. public static void main(String[] args) {
  19. //实例化对象
  20. Student s=new Student();
  21. //查看对象
  22. System.out.println("s"+s);//sStudent@4554617c(是一个地址,表示当前这个Student在内存中的地址)
  23. //调用属性和方法
  24. System.out.println("姓名:"+s.name);//姓名:null(null 表示空,对象是存在的,但是没有值--对象类型)
  25. System.out.println("年龄:"+s.age);//年龄:0(基本类型)
  26. //给成员变量赋值
  27. System.out.println("-------------------------");
  28. s.name="Lynn";
  29. s.age=18;
  30. // s.sex="男";// 没有这个属性,所以不能直接调用
  31. System.out.println(s.name);
  32. System.out.println(s.age);
  33. System.out.println("-------------------------");
  34. //调用成员方法
  35. s.study();
  36. s.eat();
  37. }
  38. }

练习

  1. /**
  2. * @author Lynn
  3. * @create 2020-11-23-11:19
  4. */
  5. public class Phone {
  6. // 定义成员变量
  7. String brand;
  8. int price;
  9. String color;
  10. //定义成员方法
  11. public void call(){
  12. System.out.println("你的电话响啦!");
  13. }
  14. public void send(){
  15. System.out.println("该干饭啦!");
  16. }
  17. public void paly(){
  18. System.out.println("TiMi");
  19. }
  20. }

2.7Java语言的特点:

强类型语言:必须经过编译才可以运行的
可移植性:一处编写,到处运行
面向对象

  1. /**
  2. * @author Lynn
  3. * @create 2020-11-23-11:24
  4. */
  5. /**
  6. * 强类型语言:必须经过编译才可以运行的
  7. * 可移植性:一处编写,到处运行
  8. * 面向对象
  9. *
  10. * 编译期:程序员写好代码之后,按下保存按钮之后的事情--将Java代码编译成二进制的字节码文件,即.class,保存在bin目录下
  11. * 运行期:代码执行的期间
  12. */
  13. public class PhoneDemo {
  14. public static void main(String[] args) {
  15. //创建对象调用类
  16. Phone p=new Phone();
  17. //调用成员变量
  18. p.brand="华为";
  19. p.price=5699;
  20. p.color="红色";
  21. System.out.println("品牌:"+p.brand);
  22. System.out.println("价格:"+p.price);
  23. System.out.println("颜色:"+p.color);
  24. //调用方法
  25. p.call("Lynn");//实参
  26. p.send();
  27. p.paly();
  28. }
  29. }
  1. /**
  2. * @author Lynn
  3. * @create 2020-11-23-14:30
  4. */
  5. /**
  6. *
  7. */
  8. public class PhoneDemo02 {
  9. public static void main(String[] args) {
  10. //实例化第一个对象
  11. Phone p1=new Phone();
  12. p1.brand="索尼";
  13. p1.price=1999;
  14. p1.color="黑色";
  15. System.out.println(p1.brand+","+p1.price+","+p1.color);
  16. //实力化第二个对象
  17. Phone p2=new Phone();
  18. p2.brand="iPhone";
  19. p2.price=6999;
  20. p2.color="黑色";
  21. System.out.println(p2.brand+","+p2.price+","+p2.color);
  22. }
  23. }
  1. /**
  2. * @author Lynn
  3. * @create 2020-11-23-14:34
  4. */
  5. public class PhoneDemo03 {
  6. //main方法,程序的主入口,必须写成字符串类型(String[]),args是一个参数(形参)
  7. public static void main(String[] args) {
  8. //创建对象调用类
  9. Phone p=new Phone();
  10. //调用成员变量(赋值)
  11. p.brand="华为";
  12. p.price=5699;
  13. p.color="红色";
  14. System.out.println(p.brand+","+p.price+","+p.color);
  15. //把对象p赋值给p2
  16. Phone p2=p;
  17. //两个对象的地址相同
  18. System.out.println(p2);//Phone@4554617c
  19. System.out.println(p);//Phone@4554617c
  20. //为p2进行再赋值
  21. p2.brand="iPhone";
  22. p2.price=6999;
  23. p2.color="黑色";
  24. System.out.println(p2.brand+","+p2.price+","+p2.color);//iPhone,6999,黑色
  25. System.out.println(p.brand+","+p.price+","+p.color);//iPhone,6999,黑色
  26. }
  27. }

image.png

2.8成员变量和局部变量的区别:

1.在类中位置不同
成员变量:在类中,方法外
局部变量:方法内或者声明上(参数列表)
2.在内存中的位置不同
成员变量—-堆内存中
局部变量—-栈内存中
3.生命周期不同
成员变量—-随着对象的存在而存在,随着对象的消失而消失
局部变量—-随着方法的调用而存在,随着方法的运行完毕而消失
4.初始化值不同—Java中规定的
成员变量—-有默认的初始化值
局部变量—-没有默认的初始化值—-必须先声明,赋值,才能使用

  1. /**
  2. * @author Lynn
  3. * @create 2020-11-23-15:05
  4. */
  5. /**
  6. * 成员变量和局部变量的区别:
  7. * 1.在类中位置不同
  8. * 成员变量:在类中,方法外
  9. * 局部变量:方法内或者声明上(参数列表)
  10. *
  11. * 2.在内存中的位置不同
  12. * 成员变量---堆内存中
  13. * 局部变量---栈内存中
  14. *
  15. * 3.生命周期不同
  16. * 成员变量---随着对象的存在而存在,随着对象的消失而消失
  17. * 局部变量---随着方法的调用而存在,随着方法的运行完毕而消失
  18. *
  19. * 4.初始化值不同--Java中规定的
  20. * 成员变量---有默认的初始化值
  21. * 局部变量---没有默认的初始化值---必须先声明,赋值,才能使用
  22. */
  23. public class VailableDemo {
  24. //成员变量
  25. int x;
  26. public void show(){
  27. //方法内可以直接调用成员变量
  28. System.out.println(x);
  29. //局部变量
  30. int y=9;
  31. System.out.println(y);
  32. }
  33. public static void main(String[] args) {
  34. //调用show方法
  35. //1.首先要实例化对象(即创建对象)
  36. VailableDemo v=new VailableDemo();
  37. v.x=618;
  38. v.show();
  39. }
  40. }

2.9 private:

是一个权限修饰符。
可以修饰成员(成员变量和成员方法)
被private修饰的成员只在本类中才能访问。

  1. /**
  2. * @author Lynn
  3. * @create 2020-11-23-15:22
  4. */
  5. /**
  6. * 当前案例中讲解数据的安全性
  7. * 通过private这个关键字用于修饰数据进行数据的私有处理
  8. *
  9. * private:私有的
  10. * 是一个权限修饰符
  11. * 可以修饰变量方法
  12. * 被private修饰的数据只能在本类中被访问
  13. *
  14. * 如果其他类中如要访问私有数据,可以申请访问:
  15. * 即在当前类中声明get/set方法
  16. */
  17. public class Student01 {
  18. //成员变量---属性
  19. String name;
  20. private int age;
  21. //声明set方法
  22. public void setAge(int a){
  23. //正常人的年龄0~200
  24. if(a<0 || a>200){
  25. System.out.println("非人类");
  26. }else{
  27. age=a;
  28. }
  29. }
  30. //声明get方法
  31. public int getAge(){
  32. return age;
  33. }
  34. //展示学生信息
  35. public void show(){
  36. System.out.println("姓名:"+name+","+"年龄:"+age);
  37. }
  38. }
  1. import java.sql.SQLOutput;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-23-15:23
  5. */
  6. public class StudentDemo01 {
  7. public static void main(String[] args) {
  8. Student01 s=new Student01();
  9. System.out.println(s.getAge());//申请访问age属性
  10. s.show();
  11. //赋值
  12. s.name="张三丰";
  13. s.setAge(150);// 走setAge方法
  14. // s.setAge(250);// 走setAge方法
  15. //展示信息
  16. s.show();
  17. }
  18. }
  19. 结果:
  20. 0
  21. 姓名:null,年龄:0
  22. 非人类 //这个数据显示在前面是因为,150这个数据在Student01中开始没有被打印,
  23. //250这个数据显示打印出来,然后在调用show方法中
  24. 姓名:张三丰,年龄:150

private最常见的应用:

把成员变量用private修饰
提供对应的getXxx()/setXxx()方法
一个标准的案例的使用

3.封装

封装概述

是面向对象三大特征之一
是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。就像上章说的年龄。

封装原则:

将不需要对外提供的内容都隐藏起来。
把属性隐藏,提供公共方法对其访问。
成员变量private,提供对应的getXxx()/setXxx()方法

好处:

通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性

3.2this关键字

this: 代表所在类的对象引用
记住:方法被哪个对象调用,this就代表那个对象
什么时候使用this呢? 局部变量隐藏成员变量

  1. package com.igeek_02;
  2. /**
  3. * @ClassName: Student
  4. * @Description: 学生类
  5. * @date 2017年11月10日 下午5:14:25
  6. * Company www.igeekhome.com
  7. *
  8. * 起名字我们要求做到见名知意。
  9. * 而我们现在的代码中的n和a就没有做到见名知意,所以我们要改进。
  10. *
  11. * 如果有局部变量名和成员变量名相同,在局部使用的时候,采用的是就近原则。
  12. *
  13. * 我们有没有办法把局部变量的name赋值给成员变量的name呢?有
  14. *
  15. * 什么办法呢?
  16. * 用this关键字就可以解决这个问题。
  17. *
  18. * this: 代表所在类的对象引用
  19. * 方法被哪个对象调用,this就代表那个对象
  20. *
  21. * 使用场景: 局部变量隐藏成员变量
  22. */
  23. public class Student {
  24. /**
  25. * @Fields name : 姓名
  26. */
  27. private String name;
  28. /**
  29. * @Fields age : 年龄
  30. */
  31. private int age;
  32. /**
  33. * @Title: setName
  34. * @Description: 设置姓名
  35. * @param n
  36. */
  37. public void setName(String name){//吴京
  38. //name=name;
  39. this.name=name;
  40. }
  41. /**
  42. * @Title: getName
  43. * @Description: 获取姓名
  44. * @return
  45. */
  46. public String getName(){
  47. return name;
  48. }
  49. /**
  50. * @Title: setAge
  51. * @Description: 设置年龄
  52. * @param a
  53. */
  54. public void setAge(int age){
  55. //age=age;
  56. this.age=age;
  57. }
  58. /**
  59. * @Title: getAge
  60. * @Description: 获取年龄
  61. * @return
  62. */
  63. public int getAge(){
  64. return age;
  65. }
  66. }
  1. package com.igeek_02;
  2. /**
  3. * @ClassName: StudentDemo
  4. * @Description: 学生类的测试类
  5. * @date 2017年11月10日 下午5:17:34
  6. * Company www.igeekhome.com
  7. *
  8. */
  9. public class StudentDemo {
  10. public static void main(String[] args) {
  11. //创建学生对象
  12. Student s=new Student();
  13. System.out.println(s.getName()+"---"+s.getAge());
  14. s.setName("吴京");
  15. s.setAge(35);
  16. System.out.println(s.getName()+"---"+s.getAge());
  17. }
  18. }

4.构造方法

4.1构造方法作用概述

给对象的数据进行初始化
构造函数:

  • 又称为构造器
  • 作用:初始化全(成)员参数—主要是在构造函数中初始化的参数,在整个的类中都可以直接调用

    4.2构造方法格式

    方法名与类名相同
    没有返回值类型,连void都没有
    没有具体的返回值 ```java package com.hdzx_06;

import javax.sound.midi.Soundbank;

/**

  • @author Lynn
  • @create 2020-11-23-16:18 */

/**

  • 构造函数:
  • 又称为构造器
  • 作用:初始化全(成)员参数—主要是在构造函数中初始化的参数,在整个的类中都可以直接调用 *
  • 格式:
  • 1.构造函数的方法名与类名完全一致(包括大小写)
  • 2.没有返回值类型,不需要写void
  • 3.没有具体的返回值—没有return */ public class Student { //声明两个属性 private String name; private int age;

    public String getName() {

    1. return name;

    }

    public void setName(String name) {

    1. this.name = name;

    }

    public int getAge() {

    1. return age;

    }

    public void setAge(int age) {

    1. this.age = age;

    }

    //写一个(无参)构造函数 public Student(){

    1. System.out.println("我是一个Student类的构造函数");

    } } java package com.hdzx_06;

import java.sql.SQLOutput;

/**

  • @author Lynn
  • @create 2020-11-23-16:18 */ public class StudentDemo { public static void main(String[] args) {
    1. //调用了构造函数--实例化Student这个类
    2. Student s=new Student();
    // System.out.println(s); // s.setName(“宋祖儿”); // s.setAge(18); // System.out.println(s.getName()+””+s.getAge()); }

}

  1. <a name="qNyWd"></a>
  2. ### 4.3构造方法注意事项
  3. 如果你不提供构造方法,系统会给出默认构造方法 <br />如果你提供了构造方法,系统将不再提供 <br />构造方法也是可以重载的
  4. <a name="wqQ5u"></a>
  5. #### 方法重载:在Java中,同一个类中的多个方法可以有相同的方法名称,但是有不同的参数列表,这就称为方法重载(method overloading)。
  6. 说明:
  7. - 参数列表不同包括:个数不同、顺序不同、类型不同。
  8. - 仅仅参数变量名称不同是不可以的。
  9. - 跟成员方法一样,构造方法也可以重载。
  10. - 声明为final的方法不能被重写。
  11. - 声明为static的方法不能被重载,但是能够被在此声明。
  12. <a name="5CULd"></a>
  13. #### 方法的重载的规则:(同一个类,相同方法名,参数列表不同)
  14. - 方法名称必须相同。
  15. - 参数列表必须不同。
  16. - 方法的返回类型可以相同也可以不相同。
  17. - 仅仅返回类型不同不足以称为方法的重载。
  18. 判断是否是重载:<br />跟权限修饰符、返回值类型、形参变量名、方法体都没有关系
  19. <a name="OebXJ"></a>
  20. # 5.标准类的代码写法和测试
  21. <a name="TN7LW"></a>
  22. ### 5.1 类
  23. - 成员变量 <br />- 构造方法 <br />ž 无参构造方法 <br />ž 带参构造方法 <br />- 成员方法 <br />ž getXxx()<br />ž setXxx()
  24. ```java
  25. package com.hdzx_06;
  26. /**
  27. * @author Lynn
  28. * @create 2020-11-23-16:38
  29. */
  30. /**
  31. * 这是一个实体类的模板
  32. * 实体:将抽象的东西进行实体化的类就是实体类
  33. * 通常需要封装属性,方法,get/set方法,toString方法,equals方法(后面讲解)
  34. */
  35. public class Person {
  36. //属性
  37. private String name;
  38. private int age;
  39. private String sex;
  40. //定义构造函数,目的是初始化全员参数,为了避免创建对象报错的问题,就讲有参和无参都写上
  41. public Person(){
  42. }
  43. //定义有参构造函数
  44. public Person(String name,int age,String sex){
  45. //初始化参数
  46. this.name=name;
  47. this.age=age;
  48. this.sex=sex;
  49. }
  50. // get/set
  51. public String getName() {
  52. return name;
  53. }
  54. public void setName(String name) {
  55. this.name = name;
  56. }
  57. public int getAge() {
  58. return age;
  59. }
  60. public void setAge(int age) {
  61. this.age = age;
  62. }
  63. public String getSex() {
  64. return sex;
  65. }
  66. public void setSex(String sex) {
  67. this.sex = sex;
  68. }
  69. @Override
  70. public String toString() {
  71. return "Person{" +
  72. "name='" + name + '\'' +
  73. ", age=" + age +
  74. ", sex='" + sex + '\'' +
  75. '}';
  76. }
  77. }
  1. package com.hdzx_06;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-23-16:45
  5. */
  6. public class PersonTest {
  7. public static void main(String[] args) {
  8. //实例化对象
  9. Person s1=new Person();
  10. Person s2=new Person("王俊凯",21,"中国");
  11. System.out.println(s1);
  12. System.out.println(s2);
  13. System.out.println(s2.getName());
  14. }
  15. }

5.2给成员变量赋值的方式

无参构造方法+setXxx()
带参构造方法

  1. package com.igeek_04;
  2. /**
  3. * @ClassName: StudentDemo
  4. * @Description: 学生类的测试类
  5. * @date 2017年11月11日 上午9:26:15
  6. * Company www.igeekhome.com
  7. *
  8. */
  9. public class StudentDemo {
  10. public static void main(String[] args) {
  11. //无参构造方法+setXxx()方法
  12. Student s=new Student();
  13. s.setName("吴京");
  14. s.setAge(35);
  15. System.out.println(s.getName()+"---"+s.getAge());
  16. //带参构造方法
  17. Student s2=new Student("吴京", 35);
  18. System.out.println(s2.getName()+"---"+s2.getAge());
  19. }
  20. }