面向对象思想的概述

  1. package com.besttest.class1;
  2. import java.util.Arrays;
  3. /*
  4. 面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节;
  5. 面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事。
  6. */
  7. public class DemoArrayParm {
  8. public static void main(String[] args) {
  9. //目的:打印数组格式为{1,2,3,4,5}
  10. int[] arr1={1,2,3,4,5};
  11. //使用面向对象
  12. //找一个JDK给我们提供好的Arrays类
  13. //其中有一个toString方法,直接就能把数组变成想要的格式的字符串
  14. System.out.println(Arrays.toString(arr1));
  15. }
  16. }

类的定义

  1. package com.besttest.class1;
  2. /*
  3. 定义一个类,用来模拟“学生”实物。其由两个部分组成:
  4. 属性(是什么):
  5. 姓名
  6. 年龄
  7. 行为(能做什么):
  8. 吃饭
  9. 睡觉
  10. 学习
  11. 对应到java类当中:
  12. 成员变量(属性):
  13. String name
  14. int age
  15. 成员方法(行为):
  16. public void eat() {} -吃饭
  17. public void sleep() {} -睡觉
  18. public void study() {} -学习
  19. 【注意事项】
  20. 1.成员变量是直接定义在类当中
  21. 2.成员方法不要写static关键字
  22. */
  23. public class Student {
  24. //成员变量
  25. String name;
  26. int age;
  27. //成员方法
  28. public void eat() {
  29. System.out.println("吃饭了!");
  30. }
  31. public void sleep() {
  32. System.out.println("睡觉了!");
  33. }
  34. public void study() {
  35. System.out.println("学习了!");
  36. }
  37. }

类的使用

  1. package com.besttest.class1;
  2. /*
  3. 通常情况下,一个类并不能直接使用,需要根据类创建一个对象才能使用
  4. 1.导包:也就是支出需要使用的类在什么位置
  5. import 包名.类名称
  6. import com.besttest.class1.Student;
  7. 【对于和当前类属于同一个包的情况,可以省略不写导包语句】
  8. 2.创建:格式-
  9. 类名 对象名 = new 类名();
  10. Student st= new Student();
  11. 3.使用: 分两种情况
  12. 使用成员变量:对象名.成员变量名;
  13. 使用成员方法:对象名.成员方法名();
  14. */
  15. //import com.besttest.class1.Student;
  16. public class DemoStudy {
  17. public static void main(String[] args) {
  18. //1.导包:可以不用导包
  19. //2.创建:根据Student类创建了一个名为st的对象,将右侧的字符串赋值给st对象当中的name成员变量
  20. Student st= new Student();
  21. //3.使用:使用成员变量,未赋值会有默认值null、0、0.0等
  22. System.out.println(st.name="lxy");
  23. //使用成员方法
  24. st.study();
  25. }
  26. }

一个对象的内存图

  1. package com.besttest.class1;
  2. public class Phone {
  3. String brand;
  4. double price;
  5. String color;
  6. public void call(String name){
  7. System.out.println("打电话给"+name);
  8. }
  9. public void sendMessage(){
  10. System.out.println("群发短信!");
  11. }
  12. }
  13. package com.besttest.class1;
  14. public class Demo01Phone {
  15. public static void main(String[] args) {
  16. Phone obj=new Phone();
  17. obj.brand="Apple";
  18. obj.color="black";
  19. obj.price=5999.99;
  20. System.out.println("我买了一个"+obj.color+"的"+obj.brand+"手机"+ obj.price+"元钱");
  21. obj.call("mama");
  22. obj.sendMessage();
  23. }
  24. }

image.png

两个对象使用同一个方法的内存图

  1. package com.besttest.class1;
  2. public class Phone {
  3. String brand;
  4. double price;
  5. String color;
  6. public void call(String name){
  7. System.out.println("打电话给"+name);
  8. }
  9. public void sendMessage(){
  10. System.out.println("群发短信!");
  11. }
  12. }
  13. package com.besttest.class1;
  14. public class Demo01Phone {
  15. public static void main(String[] args) {
  16. Phone obj=new Phone();
  17. obj.brand="Apple";
  18. obj.color="black";
  19. obj.price=5999.99;
  20. System.out.println("我买了一个"+obj.color+"的"+obj.brand+"手机"+ obj.price+"元钱");
  21. obj.call("mama");
  22. obj.sendMessage();
  23. Phone obj2=new Phone();
  24. obj2.brand="华为";
  25. obj2.color="black";
  26. obj2.price=6999.99;
  27. System.out.println("我买了一个"+obj2.color+"的"+obj2.brand+"手机"+ obj2.price+"元钱");
  28. obj2.call("papa");
  29. obj2.sendMessage();
  30. }
  31. }

image.png

两个引用指向同一个对象的内存图

  1. package com.besttest.class1;
  2. public class Phone {
  3. String brand;
  4. double price;
  5. String color;
  6. public void call(String name){
  7. System.out.println("打电话给"+name);
  8. }
  9. public void sendMessage(){
  10. System.out.println("群发短信!");
  11. }
  12. }
  13. package com.besttest.class1;
  14. public class Demo01Phone {
  15. public static void main(String[] args) {
  16. Phone obj=new Phone();
  17. obj.brand="Apple";
  18. obj.color="black";
  19. obj.price=5999.99;
  20. System.out.println("我买了一个"+obj.color+"的"+obj.brand+"手机"+ obj.price+"元钱");
  21. obj.call("mama");
  22. obj.sendMessage();
  23. //将obj当中保存的对象那个地址值赋值给obj2
  24. Phone obj2=obj;
  25. obj2.brand="华为";
  26. obj2.color="black";
  27. obj2.price=6999.99;
  28. System.out.println("我买了一个"+obj2.color+"的"+obj2.brand+"手机"+ obj2.price+"元钱");
  29. obj2.call("papa");
  30. obj2.sendMessage();
  31. }
  32. }

image.png

使用对象类型作为方法的参

当一个对象作为参数,传递当方法当中时,实际上传递进去的时对象的地址值

  1. package com.demo01;
  2. public class Phone {
  3. String brand;
  4. int price;
  5. String color;
  6. }
  7. package com.demo01;
  8. public class Demo01PhoneParam {
  9. public static void main(String[] args) {
  10. Phone one =new Phone();
  11. one.brand="苹果";
  12. one.price=5888;
  13. one.color="玫瑰金";
  14. method(one);
  15. }
  16. public static void method(Phone param){
  17. System.out.println(param.brand);
  18. System.out.println(param.color);
  19. System.out.println(param.price);
  20. }
  21. }

image.png
使用对象类型作为方法的返回值

  1. package com.demo01;
  2. public class Phone {
  3. String brand;
  4. int price;
  5. String color;
  6. }
  7. package com.demo01;
  8. public class PhoneReturn {
  9. public static void main(String[] args) {
  10. Phone two =getPhone();
  11. System.out.println(two.brand);
  12. System.out.println(two.color);
  13. System.out.println(two.price);
  14. }
  15. public static Phone getPhone(){
  16. Phone one = new Phone();
  17. one.brand="苹果";
  18. one.price=5888;
  19. one.color="玫瑰金";
  20. return one;
  21. }
  22. }

image.png

局部变量和成员变量区别

  1. package com.demo01;
  2. import java.util.Enumeration;
  3. /*
  4. 成员变量和局部变量的不同
  5. 1.定义的位置不一样【重点】
  6. 局部变量:在方法的内部
  7. 成员变量:在方法的外部,直接写在类当中
  8. 2.作用范围不一样【重点】
  9. 局部变量:只有在放当中才可以使用,出了烦烦烦就不能再用
  10. 成员变量:整改类全部可以使用
  11. 3.默认值不一样【重点】
  12. 局部变量:没有默认值,如果想要使用,必须手动赋值
  13. 成员变量:如果没有赋值,会有默认值,规则和数组一样
  14. 4.内存的位置不一样(了解)
  15. 局部变量:位于栈内存
  16. 成员变量:位于堆内存
  17. 5.生命周期不一样(了解)
  18. 局部变量:随着方法进栈而诞生,随着方法出栈而消失
  19. 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失
  20. */
  21. public class Demo01VariableDiffrence {
  22. String name; //成员变量
  23. public void method(){
  24. int num=20; //局部变量
  25. System.out.println(num);
  26. System.out.println(name);
  27. }
  28. public void method1(){
  29. // System.out.println(num); //错误用法
  30. System.out.println(name);
  31. }
  32. }

方法的封装

  1. package com.demo01;
  2. /*
  3. 面向对象三大特征:封装、继承、多态
  4. 封装性在java当中的提现:
  5. 1.方法就是一种封装
  6. 2.关键字private也是一种封装
  7. */
  8. public class Demo02Method {
  9. public static void main(String[] args) {
  10. int[] arr1={45,54,12,3,99};
  11. int maxone=getMax(arr1);
  12. System.out.println(maxone);
  13. }
  14. //方法封装
  15. public static int getMax(int[] array){
  16. int max= array[0];
  17. for (int i=0;i<array.length;i++){
  18. if (array[i]>max){
  19. max= array[i];
  20. }
  21. }
  22. return max;
  23. }
  24. }

关键字private封装

  1. package com.demo01;
  2. /*
  3. 问题描述:定义一个Person的年龄时,无法阻止不合理的数值设置进来
  4. 解决方案:用private关键字将需要保护的成员变量进行修饰
  5. 一旦使用了private进行修饰,那么本类当中任然可以随意访问。
  6. 但是一旦超出了本类范围之外就不能再直接访问了
  7. 间接访问private成员变量,就是定义一堆setter/getter方法
  8. 必须叫steXxx或者getXxx命名规则。
  9. 对于Getter来说,不能有参数,返回值类型和成员变量对应;
  10. 对于Setter来说,不能有返回值,参数类型和成员变量对应。
  11. */
  12. public class Person {
  13. String name;
  14. private int age;
  15. public void show(){
  16. System.out.println("我叫"+name+",我今年"+age+"岁!");
  17. }
  18. //这个成员方法专门用于获取age参数的数据
  19. public int getAge() {
  20. return age;
  21. }
  22. //这个成员方法专门用于向age设置数据
  23. public void setAge(int age) {
  24. if(age<0 || age>100){
  25. System.out.println("输入数据异常!");
  26. }
  27. else{
  28. this.age = age;
  29. }
  30. }
  31. }
  32. package com.demo01;
  33. public class Demo01Student {
  34. public static void main(String[] args) {
  35. Person per = new Person();
  36. per.setAge(30); //设置参数数据
  37. per.name="lxy";
  38. per.show();
  39. System.out.println("年龄:"+per.getAge()); //获取参数数据
  40. }
  41. }

this关键字的作用

  1. package com.demo01;
  2. /*
  3. 当方法的局部变量与类的成员变量重名的时候,根据”就近原则“,优先使用局部变量。
  4. 如果需要访问类当中的成员变量,需要使用格式:this.成员变量名
  5. ”通过谁调用的方法,谁就是this“
  6. */
  7. public class Person1 {
  8. String name;
  9. //参数的name是对方名字
  10. //成员变量name是自己的名字
  11. public void sayHello(String name){
  12. System.out.println(name+",你好我是"+this.name);
  13. }
  14. }
  15. package com.demo01;
  16. public class Demo01Student {
  17. public static void main(String[] args) {
  18. Person1 per = new Person1();
  19. per.name="baby";
  20. per.sayHello("papa");
  21. }
  22. }

构造方法

  1. package com.demo01;
  2. /*
  3. 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是调用的构造方法。
  4. 格式:
  5. public 类名称(参数类型 参数名){
  6. 方法体
  7. }
  8. 注意事项:
  9. 1.构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样
  10. 2.构造方法不要写返回值类型,脸void也不写
  11. 3.构造方法不能return一个具体的返回值
  12. 4.如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数、方法体什么事情都不做
  13. 5.一旦编写了至少一个构造方法,那么编译器将不再赠送
  14. 6.构造方法也是可以进行重载的
  15. 重载:方法名称相同,参数列表不同
  16. */
  17. public class Student {
  18. //成员变量
  19. private String name;
  20. private int age;
  21. //无参数的构造方法
  22. public Student(){
  23. System.out.println("构造方法执行啦");
  24. }
  25. public Student(String name,int age){
  26. System.out.println("全参构造方法执行啦");
  27. this.name=name;
  28. this.age=age;
  29. }
  30. //Getter/Setter
  31. public String getName() {
  32. return name;
  33. }
  34. public void setName(String name) {
  35. this.name = name;
  36. }
  37. public int getAge() {
  38. return age;
  39. }
  40. public void setAge(int age) {
  41. this.age = age;
  42. }
  43. }
  44. ----------------------------------------------------------------------------------------------
  45. package com.demo01;
  46. public class Demo02Student {
  47. public static void main(String[] args) {
  48. Student stu1 =new Student(); //无参构造
  49. System.out.println("====================");
  50. Student stu2 = new Student("Lisa",24); //全参构造
  51. System.out.println("姓名:"+ stu2.getName()+",年龄:"+stu2.getAge());
  52. stu2.setAge(25);
  53. System.out.println("姓名:"+ stu2.getName()+",年龄:"+stu2.getAge());
  54. }
  55. }

写一个标准的类

  1. package com.demo01;
  2. /*
  3. 一个标准的类通常要拥有下面四个组成部分:
  4. 1.所有的成员变量都要使用private关键字修饰;
  5. 2.为每一个成员变量编写一对Getter/Setter方法;
  6. 3.编写一个无参数构造方法;
  7. 4.编写一个全参数构造方法。
  8. */
  9. public class Student {
  10. //成员变量
  11. private String name;
  12. private int age;
  13. //无参数的构造方法
  14. public Student(){
  15. System.out.println("构造方法执行啦");
  16. }
  17. public Student(String name,int age){
  18. System.out.println("全参构造方法执行啦");
  19. this.name=name;
  20. this.age=age;
  21. }
  22. //Getter/Setter
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public int getAge() {
  30. return age;
  31. }
  32. public void setAge(int age) {
  33. this.age = age;
  34. }
  35. }