面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节
面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿。
import java.util.Arrays;
public class ArrayPrint01 {
public static void main(String[] args) {
int[] array = {10,20,30,40,50};
//要求打印格式为[10,20,30,40,50]
//使用面向对象过程,每一个步骤细节都要亲力亲为
//System.out.println("hello world");
System.out.print("[");
for (int i = 0; i <array.length ; i++) {
if(i == array.length-1){
System.out.println(array[i]+"]");
}else {
System.out.print(array[i]+" ,");
}
}
System.out.println("=================");
//使用面向对象
//找一个JDK给我们提供好的Arrays类
//其中有一个toString方法,直接就能将数数组变成想要的格式的字符串
System.out.println(Arrays.toString(array));
}
}
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
在Java中类中成员的属性有:public, protected, < default >, private,这四个属性的访问权限依次降低。
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
实现多态,有二种方式,覆盖,重载。
覆盖,是指子类重新定义父类的虚函数的做法。
重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。
对象:是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。
现实世界的一类事物
属性:事物的状态信息
行为:事物能够做什么
Java中用class描述事物也是如此
成员变量:对应事物的属性
成员方法:对应事物的行为
定义一个类,用来模拟“学生”事物。其中有两个组成部分
属性(是什么):
姓名
年龄
行为(能做什么)
吃饭
睡觉
学习
对应到Java的类当中
成员变量(属性):
String name;//姓名
int age;//年龄
成员方法(行为):
public void eat(){};//吃饭
public void sleep(){};//睡觉
public void study(){};//学习
注意事项:
1.成员变量是直接定义在类当中的,在方法外边
2.成员方法不要写static关键字
public class Student {
String name;//姓名
int age;//年龄
//成员方法
public void eat(){
System.out.println("eat eat eat");
}
public void sleep(){
System.out.println("sleep sleep sleep");
}
public void study(){
System.out.println("study study study");
}
}
通常情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用。
1.导包,也就是指出需要使用的类,在什么位置。
import 包成名.类名称
import demo1.Student;
对于和当前类属于同一个包的情况,可以省略导包语句不写。
2.创建,格式:
类名称 对象名 = new 类名称();
Student stu = new Student();
3.使用,分两种情况
使用成员变量:对象名.成员变量名
使用成员方法:对象名.成员方法名(参数)
(也就是说,想用谁,就用对象名点儿谁)
注意:
如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组规则一样。
public class Demo02Student {
public static void main(String[] args) {
Student stu = new Student();
System.out.println(stu.age);
System.out.println(stu.name);
stu.name = "alex";
stu.eat();
stu.sleep();
stu.study();
}
}
1.在方法区(method area)中存放着两个.class文件 Phone.class Demo01PhoneOne.class
Phone.class:存放成员变量和成员方法
Demo01PhoneOne.class:存放着主函数
2.在栈中首先存放着主函数main(String[] args)
执行 Phone one = new Phone(); 结果为new Phone();在堆中的地址0x666;
上述语句执行后,在堆(heap)中会新建一个new Phone();其中它的成员变量则会默认初始化,成员方法则会初始化为方法区中的成员方法的地址0x333。
执行System.out.println(one.brand) System.out.println(one.price) System.out.println(one.color)
会根据one在堆中的地址0x66查找相应的变量
3.执行System.out.println(one.call)
首先会把call(String who) 进栈,然后根据one在堆中的地址0x666,查找成员方法,然后再根据成员方法在方法区中的地址0x333获得对应的成员方法。执行结束后,将此方法出栈。
4.最后主函数执行完后也会出栈。
注意:当一个对象作为参数,传递到方法当中时,实际上传递进去的是对象的地址值。
public class Phone {
String brand;
double price;
String color;
public void S(){
}
}
public class Demo01Phone {
public static void main(String[] args) {
Phone one = new Phone();
one.brand = "苹果";
one.price = 1888.0;
one.color = "土豪金";
method(one); //传递进去的参数其实就是地址值
}
public static void method(Phone param){
System.out.println(param.brand);
System.out.println(param.color);
System.out.println(param.price);
}
}
注意:当使用一个对象类型作为方法的返回值时:返回值其实就是对象的地址值;
public class Demo02Phone {
public static void main(String[] args) {
Phone two = getPhone();
System.out.println(two.price);
System.out.println(two.color);
System.out.println(two.brand);
}
public static Phone getPhone(){
Phone one = new Phone();
one.color = "玫瑰金";
one.price = 8888.0;
one.brand = "苹果";
return one;
}
}
public class Demo01VariableDifference {
String name;//成员变量;
public void methodA(){
int num = 20;//局部变量
System.out.println(num);
System.out.println(name);
}
public void methodB(int param){//方法的参数就是局部变量
//参数在方法调用的时候,必然会被赋值的。
System.out.println(param);
int age;//局部变量
System.out.println(age);//没有赋值,不能使用
System.out.println(num);//num是局部变量。错误写法
System.out.println(name);
}
封装性在java当中的体现:
方法
就是一种封装private
也是一种封装public class Demo01Method {
public static void main(String[] args) {
int [] array = {5,15,63,1000,45,400};
int max = getMax(array);
System.out.println(max);
}
public static int getMax(int[] array){
int max = array[0];
for (int i = 1; i <array.length ; i++) {
if(max < array[i]){
max = array[i];
}else {
continue;
}
}
return max;
}
}
public class Person {
String name;
private int age;//私有成员变量
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show(){
System.out.println("我叫"+name+",年龄:"+age);
}
}
public class Student {
private String name;
private int age;
private boolean male;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setMale(boolean male) {
this.male = male;
}
public boolean isMale() {
return male;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Demo02Student {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("Alex");
stu.setAge(18);
stu.setMale(true);
System.out.println("姓名:"+stu.getName());
System.out.println("年龄:"+stu.getAge());
System.out.println("姓名:"+stu.isMale());
}
}
当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量,如果需要访问本类当中的成员变量,需要使用格式:
public class PersonThis {
String name;
public void sayHello(String name){
System.out.println(name+",你好,我是"+ this.name);
}
}
构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法。
public class GouZaoFunction {
String name;
int age;
public GouZaoFunction(){
System.out.println("构造方法执行了");
}
public GouZaoFunction(String name,int age){
System.out.println("重构构造方法执行了");
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Demo01 {
public static void main(String[] args) {
GouZaoFunction gouZaoFunction1 = new GouZaoFunction();//无参构造函数执行
GouZaoFunction gouZaoFunction2 = new GouZaoFunction("Alex",18); //有参构造函数执行
System.out.println("姓名:"+gouZaoFunction2.getName()+",年龄:"+gouZaoFunction2.getAge());
gouZaoFunction2.setAge(21);
System.out.println("姓名:"+gouZaoFunction2.getName()+",年龄:"+gouZaoFunction2.getAge());
}
}
一个标准的类通常要拥有下面四个组成部分:
注意:在IDEA有快捷方式创建构造函数和settr和getter方法。
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}