1.面向过程和面向对象概述
面向过程特点:
1.问题的复杂化,对事情进行一系列的操作与实施。
2.过程的执行者,对所要达到的结果中的过程一步步完成。
3.具有费时间,费精力。
面向对象特点:
1.将复杂问题简单化,符合人类思考的逻辑。
2.从过程的执行者,转换成了对象的指挥者。
3.具有省时间,省精力,将过程进行对象的封装,面向过程,有问题直接找对象即可。
2.对象和类
对象:万事万物皆对象。
比如:买电脑直接拜托行内人帮忙去电脑城购买;面试官对面试者提出问题;
1.小张和小李是兄弟。
2.你家的旺财咬人了。
3.一辆坦克发射了三发炮弹打落十架飞机。
类:具有相同属性和行为的对象的统称。
1.小张、小李∈人类
2.旺财∈狗
- 人:属性:眼睛,耳朵。 类:飞机图纸 RMB模板
行为:走路。 对象:一个飞机 一张钞票
3.面向对象思想
过程和对象在我们的程序中是如何体现的呢?
过程其实就是函数。对象是将函数等一些内容进行了封装。
//new 类名(); new 创建由类所描述的对象
//Scanner scanner=new Scanner();
范例:计算两个点的坐标距离
class Demo01{
public static void main(String[] args){
Cicle c1=new Cicle(); //创建一个c1的对象 Cicle是类名
c1.radius=10; //radius是c1的属性
Point o1=new Point(); //创建一个o1的对象 point是类名
o1.x=0; //x是o1的属性
o1.y=0; //y是o1的属性
c1.o=o1; //o是c1的属性 将o1这个对象的地址赋给o
Cicle c2=new Cicle(); //创建一个c2的对象 Cicle是类名
c2.radius=10; //radius是c2的属性
Point o2=new Point(); //创建一个o2的对象 point是类名
o2.x=10; //x是o2的属性
o2.y=10; //y是o2的属性
c2.o=o2; //o是c2的属性 将o2这个对象的地址赋给o
System.out.println(c1.getDistance(c2));//c1指向c2 打印距离
}
}
class Point{
double x; //本体的属性x
double y; //本体的属性y
public double getDistance(Point o2){
return Math.sqrt(Math.pow(this.x-o2.x,2)+Math.pow(this.y-o2.y,2));
}
}
class Cicle{
double radius; //本体的属性radius
Point o; //本体的属性o
//this是这个类中的特指
public double getArea(){ //获得面积
return 3.14*Math.pow(this.radius,2);
}
public double getPerimeter(){//获得周长
return 2*3.14*radius;
}
public double getDistance(Cicle c2){
return this.o.getDistance(c2.o);//this.o指向c2.o
}
}
1. javac 对Demo01.java进行编译的时候 产生3个字节码文件
Demo02.class Circle.class Point.class
没有主函数main的类(字节码),不能够独立运行(Circle.class Point.class)
主类 Demo02 主要用于运行程序 作为程序的开始main
实体类 Circle Point 主要用于描述事物 但不推荐写主函数
2.java Demo02 意思将Demo02.class字节码文件加载进虚拟机开始运行
Circle.class Point.class 虽然没有明显的写出加载 但是会随着Demo02加载而加载。
这些字节码文件加载到JVM的方法区里边->JVM在方法区中找主函数-Demo01-main->将该段main代码加载进栈开始运行
4.成员变量和成员函数
在类中定义其实都称之为成员。成员有两种:
1、成员变量:其实对应的就是事物的属性。
2、成员函数:其实对应的就是事物的行为。
因为类是对象的定义,对象从类创建。所以,其实定义类,就是在定义成员变量和成员函数。但是在定义前,必须先要对事物(对象)进行属性和行为的分析,才可以用代码来体现。
成员变量和局部变量的区别:
1、 源代码中定义的位置不同:
成员变量定义在类中。
局部变量定义在方法中,也可以定义在语句中。
2、作用域不同:
成员变量在这个类中有效。
局部变量只在自己所属的大括号内有效,大括号结束,局部变量失去作用域。
3、内存中的存储位置不同:
成员变量存储在堆内存的对象中。
局部变量存储在栈内存的方法中。
4、生命周期不同:
成员变量随着对象的出现而出现。
局部变量随着所属区间的运行出现,随着所属区间的结束而释放。
(局部变量随着方法的加载而出现,随着方法的消失而消失。)
5.权限修饰符private、set修改器、get访问器和this关键字
private:属性前加了private修饰,只是访问权限降低,只可在本类被访问,但是创建对象后,相应的堆内存中,该属性还是真实存在的。
私有的成员:其他类不能直接创建对象访问,所以只有通过本类对外提供具体的访问方式(函数)来完成对私有的访问。
set修改器:间接修改
get访问器:间接访问 因为加了private,直接修改和直接访问不可用了。
this:1.代表的是对象。哪个对象调用this所在的函数,this就代表哪个对象,就是哪个对象的引用。
2.this 还可以用于构造函数间的调用。
3.this对象后面跟上 . 调用的是成员属性和成员方法(一般方法)。
4.this(实际参数) this对象后面跟上() 调用的是本类中的对应参数的构造函数。
注意:用this调用构造函数,必须定义在构造函数的第一行!(因为构造函数是用于初始化的,所以初始化动作一定要先执行。 否则编译失败 )。一个构造函数里不可以使用两次this,即一个构造函数中不可以调用两个构造函数。
class Demo02{
public static void main(String[] args){
Person p1=new Person(); //创建p1对象 Person是类
//p1.show();
Person p2=new Person(10);
p2.show();
Person p3=new Person("旺财");
p3.show();
Person p4=new Person(10,"狗蛋");
p4.show();
}
}
class Person{
private int age;
private String name;
Person(){
this(0,null);//this(...) 调用当前类的其他构造函数 必须在第一句
print();
}
Person(int age){
this(age,null);
System.out.println("1age参的");
}
Person(String name){
this(0,name);
System.out.println("1name参的");
}
Person(int age,String name){
//this();
System.out.println("2参的");
this.age=age;
this.name=name;
}
private void print(){
System.out.println("无参的");
System.out.println("无参的");
System.out.println("无参的");
System.out.println("无参的");
System.out.println("无参的");
System.out.println("无参的");
System.out.println("无参的");
}
public void show(){
//如果局部变量没有重名 则默认用成员变量
System.out.println(this.name+":"+this.age);
}
public void setAge(int age){
//局部变量age 成员变量age
if(age<0){
this.age=0;
}else{
this.age=age;
}
}
public int getAge(){
return this.age;
}
}