面向对象的特征
三大特征
package com.cloud.day2; /* 面向对象三大特征: 1. 2. 3 需求: 问题:性别有问题?? 根本原因:由于其他人可以直接操作sex属性。可以对sex属性进行了直接的赋值。 封装: 权限修饰符:权限修饰符就是控制变量可见范围的。 public : private 封装的步骤: 1. 2. 命名规范: set属性名(); get属性名(); 疑问:封装一定要提供get或者set方法吗? 不一定,根据需求而定的。 规范:在现实开发中一般实体类的所有成员属性(成员变量)都要封装起来。 实体类:实体类就是用于描述一类事物的就称作为实体类。 工具类(Arrays数组的工具类): 封装的好处: 1. 2. 3. */ class Member{ public String private String public public if(s.equals("男")||s.equals("女")){ sex = s; } else{ sex = "男"; } } public String getSex(){ return } public System.out.println("comunicate very happy...."); } } public public Member m = new Member(); m.name = m.setSex("男"); m.salary = 8888; System.out.println(m.name+";"+m.getSex()+";"+m.salary+";"); } } |
计算案例
package com.cloud.day2; /* 需求:使用java类描述一个计算器类,计算器具备操作数1,操作数2 ,还具备计算的功能行为。 要求:不能直接对操作数1,操作数2,运算符这些属性进行直接的赋值,要封装起来。 根据需求提供get或者set方法。 需要提供set方法 */ class Calculator{ private private private public num1 = n1 ; num2 = n2 ; if(o==‘+‘||o==‘-‘||o==‘*‘||o==‘/‘){ option = o; }else{ option = ‘+‘; } } public switch (option) { case System.out.println(num1+num2); break; case System.out.println(num1-num2); break; case System.out.println(num1*num2); break; case System.out.println(num1/num2); break; } } } public public Calculator c = new Calculator(); c.initCalculator(1, 2, c.calculator(); } } |
操作数组
package com.cloud.day2; import java.util.Arrays; /* 需求:目前存在数组:int[] 接收该数组,然后把该数组的0清空,然后返回一个不存在0元素的数组。 步骤: 1. */ public public int[] arr = {0,1,2,3,0,4}; arr = cleanZera(arr); System.out.println(Arrays.toString(arr)); } public int count = 0; for(int i=0;i<arr.length;i++){ if(arr[i]==0){ count++; } } int index = 0; int[] newArr = for(int i=0;i<arr.length;i++){ if(arr[i]!=0){ newArr[index]=arr[i]; index++; } } return newArr; } } |
构造函数
package com.cloud.day3; /* java是面向对象的语言: "万物皆对象": 需求:使用java类描述一个婴儿. 在现实生活中有两种婴儿,一种婴儿一出生就具备了名字(白户),还有一种婴儿就是出生之后才有名字的(黑户)。 构造函数: 构造函数的作用:给对应的对象进行初始化。 构造函数的定义的格式: 修饰符 函数名(形式参数){ 函数体... } 构造函数要注意的细节: 1. 2. 3. 4. 5. 6. 疑问:创建对象时,jvm就会调用到对应的构造方法,那么我们以前没有学构造方法,那么 以前创建对象时,jvm是否也会调用构造方法呢?如果有?构造方法从何而来呢? 会调用, java编译器在编译的时候给加上去的。 jdk提供了一个java开发工具(javap.exe)给我们进行反编译的。 javap反编译工具的使用格式:
疑问: java编译器添加的无参构造方法的权限修饰符是什么? 与类的权限修饰是一致的。 构造函数与普通函数的区别: 1. 1. 2. 2. 1. 2. 3. 1. 2. 4. 1. 2. */ class Baby{ int String public Baby(int i , String n){ id = i; name = n; System.out.println("属性初始化完毕..."); } public Baby(){} public System.out.println("Baby哭了..."); } } public public Baby b1 = new Baby(1,"summer"); System.out.println(b1.id+";"+b1.name); b1.cry(); b1.cry(); } } |
构造函数案例
package com.cloud.day3; /* 描述一个员工类,员工具备的属性:id\ name \ age 具备的公共行为:工作。 要求:一旦创建一个员工对象的时候,那么该员工对象就要对应的属性值。 */ class Employee{ int String int public Employee(int i,String n,int a){ id = i; name = n; age = a; } public System.out.println(name+"好好工作"); } } public public Employee emp = new Employee(1, System.out.println(emp.id+emp.name+emp.age); } } |
构造代码块
package com.cloud.day3; /* 构造代码块: 构造代码块的作用:给对象进行统一的初始化。 构造函数的作用:给对应的对象进行初始化。 构造代码块的格式: { 构造代码块 } 注意:构造代码块的大括号必须位于成员位置上。 代码块的类别: 1. 2. 3. */ class Body{ int String { System.out.println("构造代码块...."); } public Body(int i,String n){ id = i; name = n; } public Body(){} public System.out.println(name+":speak..."); } } public public Body b1 = new Body(1,"summer"); b1.talk(); } } |
注意事项
package com.cloud.day3; /* 构造代码块要注意的事项: 1. java编译器编译一个java源文件的时候,会把成员变量的声明语句提前至一个类的最前端。 2. 3. 4. */ public public Demo5(){ i=30000; } //代码块初始化 { i=20000; } int public Demo5 d = new Demo5(); System.out.println("i="+d.i); } } |
This关键字
package com.cloud.day3; /* 需求:使用java类描述一个动物。 问题:存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(java this关键字: this关键字代表了所属函数的调用者对象。 this关键字作用: 1. 2. this关键字调用其他的构造函数要注意的事项: 1. this关键字调用其他的构造函数时,this关键字必须要位于构造函数中的第一个语句。 2. this关键字在构造函数中不能出现相互调用的情况,因为是一个死循环。 this关键字要注意事项: 1. 2. */ class Animal{ String String public Animal(String n,String c){ this.name = n; this.color = c; } public System.out.println("this:"+this); String name = System.out.println(name+"..."); } } public public Animal dog = new Animal("dog","bai"); Animal cat = new Animal("cat","black"); cat.eat(); } } |
注意事项
package com.cloud.day3; /* this关键字调用其他的构造函数要注意的事项: 1. this关键字调用其他的构造函数时,this关键字必须要位于构造函数中的第一个语句。 2. this关键字在构造函数中不能出现相互调用的情况,因为是一个死循环。 */ class Student{ int String public Student(int id,String name){ this(name); this.id = id; System.out.println("两个参数的构造方法被调用了"); } public Student(){ System.out.println("调用了无参的构造方法..."); } public Student(String name){ this.name = name; System.out.println("一个参数的构造方法被调用了..."); } } public public Student s1 = new Student(12,"Sum"); System.out.println(s1.id+";"+s1.name); Student s2 = new Student("Spring"); System.out.println(s2.name); } } |
构造方法中的this
package com.cloud.day3; /* 需求:使用java定义一个人类,人具备 id、name 要求:必须要写上构造函数,构造函数也必须要使用上this关键字。 */ class Person{ int String int public Person(int id,String name,int age){ this.id = id; this.name = name; this.age = age; } public if(this.age>p2.age){ System.out.println(this.name+"年龄大"); }else System.out.println(p2.name+"年龄大"); }else{ System.out.println("一样大"); } } } public public Person p1 = new Person(110,"nihao",17); Person p2 = new Person(111,"haha",12); p1.compareAge(p2); } } |
Static关键字
package com.cloud.day3; /* static(静态) 需求:描述一下学生类。 目前存在的问题:所有的学生都是中国的,有n个学生就会有n份中国的数据存内存中,这样子 会浪费内存。 目前方案:把“中国”这个数据移动到数据共享区中,共享这个数据给所有的Student对象使用即可。 问题2:如何才能把这个数据移动到数据共享区中共享呢? 解决方案:只需要使用static修饰该数据即可。 静态的成员变量只会在数据共享区中维护一份,而非静态成员变量的数据会在每个对象中都维护一份的。。 */ class Student1{ String //使用了static修饰country,那么这时候country就是一个共享的数据。 static String public Student1(String name){ this.name = name; } } public public Student1 s1 = new Student1("Sum"); Student1 s2 = new Student1("Aut"); System.out.println(s1.name+";"+s1.county); System.out.println(s2.name+";"+s2.county); //因为county是共享的数据,这里修改了 s2.county = System.out.println(s1.name+";"+s1.county); System.out.println(s2.name+";"+s2.county); } } |
Static修饰成员变量
package com.cloud.day3; /* static(静态\修饰符) 1. static修饰成员变量:如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰。 静态成员变量的访问方式: 方式1:可以使用对象进行访问。 格式:对象.变量名。 方式二:可以使用类名进行访问。 格式:类名.变量名; 注意: 1. 2. 才使用static修饰。 static修饰成员变量的应用场景:如果一个数据需要被所有对象共享使用的时候,这时候即可好实用static修饰。 2. static修饰成员函数: */ public static String static String public } } |
Static统计案例
package com.cloud.day3; /* 需求:统计一个类被使用了多少次创建对象,该类对外显示被创建的次数。 */ class CountUse{ static String { count++; } public CountUse(String name){ this.name = name; } public CountUse(){} public return } } public public CountUse cu1 = CountUse cu2 = CountUse cu3 = new CountUse(); System.out.println(cu3.showCount()); } } |
静态函数
package com.cloud.day4; /* 静态函数: static(静态、修饰符) static修饰成员变量时:static修饰成员变量时,那么该成员变量的数据就是一个共享的数据. 静态成员变量的访问方式: 方式一:使用对象进行访问。 对象.属性名 方式二:可以使用类名进行访问。 类名.属性名 注意: 1. 2. static修饰方法(静态的成员方法): 访问方式: 方式一:可以使用对象进行访问。 对象.静态的函数名(); 方式二:可以使用类名进行访问。 类名.静态函数名字。 推荐使用是类名直接访问静态的成员。 静态的成员变量与非静态的成员变量的区别: 1. 1. 2. 2. 1. 2. 3. 1. 2.非静态的成员数据是随着对象的创建而存在,随着对象被垃圾回收器回收而消失。 静态函数要注意的事项: 1. 2. 原因:静态函数是可以使用类名直接调用的,这时候可能还没有存在对象, 而非静态的成员数据是随着对象的存在而存在的。 3. 原因:非静态函数只能由对象调用,当对象存在的时候,静态数据老早就已经存在了,而非静态 数据也随着对象的创建而存在了。 4. 原因:因为静态的函数是可以使用类名调用的,一旦使用类名调用这时候不存在对象,而this 关键字是代表了一个函数的调用者对象,这时候产生了冲突。 静态的数据的生命周期:静态的成员变量数据是优先于对象存在的。 static什么时候修饰一个函数? 如果一个函数没有直接访问到非静态的成员时,那么就可以使用static修饰了。一般用于工具类型的方法 静态函数不能访问非静态的成员? 静态函数只要存在有对象,那么也可以访问非静态的数据。只是不能直接访问而已。 */ class Student{ String static String //静态代码块:静态代码块是在Student.class文件加载到内存的时候就马上执行的。 static { System.out.println("静态代码块执行了..."); } public Student(String name){ this.name = name; } public System.out.println("好好学习..."+this); } //静态方法与非静态方法的字节码文件是同时存在内存中的。只是静态的成员变量数据是优先于对象存在而已。 public Student s1 = new Student("sum"); System.out.println(s1.name+"睡觉了..."); } } public public Student.sleep(); } } |