面向对象(一)
1.什么是面向对象
1.1语言的分类
- 第一代语言:机器语言
- 第二代语言:汇编语言
- 第三代语言:高级语言
1.2面向对象和面向过程的区别
1:面向过程
针对小问题的时候,面向过程可以很简单的解决问题,事情复杂的时候面向过程就显得力不从心。面向过程是微观上解决问题的方式。
比如:领导出游,司机开车。
- 领导找司机开车
- 司机取车
- 司机加油
- 定制出游路线
这些问题都是面向过程解决的问题。
2:面向对象
面向对象是解决事情的另外一种方式,针对小问题的时候有点大才小用,问题复杂的时候就显得很轻松。面向对象是宏观上解决问题的方式。
比如:领导出游,司机开车。
- 领导和司机就是两个对象
- 领导:出钱,出车,管去哪
- 司机:开车。
3:区别和联系
面向对象和面向过程是相互依存的,人们思考问题是用面向对象的思维,最终去实现还是用面向过程。
在编码的过程中,存在一个需求,我们应先从宏观上去思考这个需求,再从微观上去解决问题。
人开门这个需求,人和门都是对象,要实现这个需求只需要人去调用开门这个功能即可。
1.3对象
1:什么是对象
女朋友是对象,茶杯是对象,电脑是对象(万物皆对象)
对象对完提供了很多功能,我们无需一一详细了解他们是怎么实现的,我们只需要学会使用即可。
2:如何产生对象
现实生活中,找对女朋友很重要。
唯一见过的只有类和方法。唯一可以肯定的就是类一定和对象有关系。
3:类和对象的关系
类:鸟类,人类,鱼类
多个事物具有相同的特征,就将其归为一类。一个类中存在很多事物。这些都是老祖先为了让我们更好的认识这个世界,将很多具象事物归为一类。
对象:是一个具象事物。比如:大象,洗衣机,电视。
类中存在许多对象,一个类相当于有相同特征或者行为的对象的集合。
在java语言中类和对象的关系
类:class修饰的 一个类可以产生很多个对象。
对象:基于类的一个实例化的表现形式。
类的产生是依赖于对象的,类是将对象中相同特征或者是行为抽取出来归为一类;
对象的产生是依赖于类的,如果没有类是无法产生该类的对象的,该类的实例。
类是对于对象的抽像(抽取像的部分),对象是类的具象化的表现形式。
2.如何编写类和对象
2.1如何编写类
类是为了产生对象的,对象是为了帮我们实现某一具体事务,对象对于使用者而言,能够列出的有:
- 外在的属性:身高,性别,体重,年龄。。。。。。
- 内在的个方法:吃饭,睡觉,走路。。。。。。
package com.mage.testww;
public class Person {
String name="zs";
int age=18;
char gender='男';
public void eat() {
System.out.println("开始吃饭了");
}
public void sleep() {
System.out.println("睡觉了");
}
}
2.2如何编写对象
java中通过new关键词来产生当前类的一个具体的实例、对象。
package com.mage.testww;
public class PersonTest {
public static void main(String[] args) {
Person zs=new Person();
zs.eat();
int age=zs.age;
System.out.println(age);
}
}
- 引用类型创造对象是用new关键字
- 创建方式:类型名称 变量名=new 类型名称();
2.3new关键字的作用
- 开空间(在堆内存中开空间)
- 赋初值(给当前类中所有成员变量赋初始值)
- 指向引用(将堆内存中的对象地址赋值给局部变量)
3.构造器
构造器就是在java代码中用来产生对象的特殊方法。将该方法称之为该类的一个构造器。
3.1构造器的注意事项
1.构造器的声明
- 构造器的方法名称和类名相同,首字母一定要大写
- 该方法没有返回值
- 内部不需要写返回值
2.构造器注意事项
- 如果在一个类中,没有写出任何构造器,那么一定存在一个空构造器。
- 一个类中存在带参构造器,那么如果无参构造器没写,则不存在,如果编写了,则还有。
- 构造器也存在重载
3.2 this关键词
this关键词有两种用法:this.和this()
this.
代表是当前对象的,谁在调用谁就是当前对象
this大多数时候是可以省略的(出现了同名变量的时候,则不可以省略)。
this()
- this() 用来实现构造器之间的互相调用
- 其它不同方法中无法使用this(),this()只能在构造器中使用。
- this()在构造器中实现构造器的互相调用时必须要保证在构造器的第一行语句。
4.static
static称为静态的,共享的。
1.在static中使用非static修饰的
public class StaticTest {
static int num = 10;
public static void main(String[] args) {
System.out.println(num);
}
}
不建议使用
public class StaticTest {
int num = 10;
public static void main(String[] args) {
StaticTest t = new StaticTest();
System.out.println(t.num);
}
}
创建当前类的对象,通过对象=方式访问非静态内容。
在非static中使用static修饰的
public class StaticTest {
static int num = 10;
public static void main(String[] args) {
StaticTest t = new StaticTest();
t.method();
}
public void method() {
System.out.println(num);
}
}
在一个类中非静态内容访问静态内容直接通过变量名或者是方法名称就可以访问了。
public class Test02 {
public static void main(String[] args) {
System.out.println(StaticTest.num);
}
}
在其他类中访问静态内容可以直接通过类名.方法名/变量名直接访问。
静态内容在其他类中访问时可以通过类名直接 . ,也可以通过对象 . (不推荐使用)
2.static的注意事项
-
static修饰的内容是隶属于类的,类被加载,静态内容就被加载到内存中了。
-
非static修饰的内容是隶属于对象的,对象存在,非static的内容才能被调用。
-
类信息是先于对象存在的。创建对象时类一定被加载到内存中了,但是如果类被加载到内存中,对
象不一定存在。
5.继承
5.1继承
继承就是子承父业,描述类和类之间的关系,编写类时,我们发现类和类之间可以存在父子关系的,通过extends来继承,子类extends父类。
package com.mage.Extends;
public class Animal {
String name;
int age;
public Animal() {
}
public void run() {
System.out.println("我要跑步了");
}
}
package com.mage.Extends;
public class Dog extends Animal {
String color;
public Dog() {
}
public void shout() {
System.out.println(this.color+","+this.name+","+this.age+"汪汪");
}
}
java中,一旦发生了继承关系,子类就会拥有父类的方法和属性,无需再次去声明,达到了代码的复用性。
java中一个类只有一次继承机会,如果不能完全确定,最好不要轻易使用。
5.2内存分析
-
创建子类对象时,父类的空构造器被调用。子类要创建对象一定会先创建父类对象。
-
在内存中,要new子类时,会先在内存中给父类开辟一个存储空间。存储父类的内容。
-
子类调用父类中定义的属性时,子类对象中维护了和父类存储空间的关系(紫色),给父类定义的属
性赋值时,能够找到对应的父类对象。
5.3方法的重写
当子类继承父类之后,不满足父类提供的功能,子类对于父类的一些方法可以重写,对于父类的一些行为进行拓展。
重写的前提:
- 一定要发生继承关系,子类方法和父类方法要同名。
- 参数列表要一模一样。
- 返回值类型要一模一样。
public class Person {
String name;
int age;
public Person() {
System.out.println("我是父类构造器");
}
public int info(int num) {
System.out.println("姓名:"+this.name+"年龄:"+this.age);
return 2;
}
}
public class Student extends Person{
int id;
public Student() {
System.out.println("我是子类构造器");
}
@Override
public int info(int num) {
System.out.println("姓名:"+name+"年龄:"+age+"学号"+id);
return 2;
}
}
public class Test {
public static void main(String[] args) {
Student stu=new Student();
stu.age=18;
stu.id=01;
stu.name="marry";
stu.info(2);
}
}
如何判断父子关系下的两个方法是否重写,在子方法的同名方法前面加一个@Override,不报错就是发生了重写。
QQ图片20191015192704.png调用子类对象的功能以及属性的时候,先在当前本类对象中进行查找,如果找到了则执行,如果没
有找到去父类中进行查找。沿着继承链会一直往上找。
5.4 object
object是根基类,是所有类的父亲。java中的类如果没有明确继承关系,那么他的父类都是object。
i、常见方法
- 获取到一个对象对应的Class对象(反射章节)
- 计算当前对象的hash值(一个对象的唯一值) 【集合】
- 克隆方法,创建对象的一种方式。【克隆模式】
- 唤醒、唤醒所有、等待。线程通信。【多线程】
- GC(垃圾回收器)在回收堆内存时,自动调用的方法。【GC】
ii.重要方法
toString():
-
打印对象内容
-
一般情况下将Object中的toString打印的内容可以看做是:包名.类名@地址值;
-
对于对象而言,很多时候我们都是想通过toString()方法查看该对象中存在哪些信息,而不单单值
是简单的看看内存地址。所以此时需要在当前类中重写toString()方法
-
当直接打印一个对象时,默认情况下就调用的是当前对象的toString方法。如果当前对象没有
toString方法,直接执行的是父类的(Object)的toString。
equals():
比较对象是否相等
-
equals()方法是用来比较两个对象是否相等
-
equals 方法在使用时一定要注意调用者一定要保证不是null值,否则出现空指针异常。
-
null可以给任意的引用类型赋值,但是null都不属于任意的引用类型。null通过instanceof判定从
属时一定为false。
-
如果一个类中没有重写equals方法,那么使用Object内部定义的equals方法,在Object中的
equals方法通过 == 比较相等
-
有时对象需要比较内部的属性,从而判定是否两个对象是一致的。比如对于一个User用户对象,
如果它的用户名和密码是相同的时候,那么我们觉得这两个账户信息是相同的。此时就一定要在当
前类中重写equals方法。否则将执行Object的equals方法。
-
instanceof 是用来比较对象是否属于某个类型的 如果属于则返回true 如果不属于返回false。
-
Object是所有类的父类,当Object作为形式参数时,所有的子类都可以传入。
-
java.lang.NullPointerException 空指针异常:对象.方法/属性时如果对象是null值,则一定会空指
针。
-
java.lang.ClassCastException 类型转换异常:在进行引用类型转换时可能由于类型不一致导致转
换过程中出现问题。
网友评论