什么是类,什么是对象
类其实就是一个模板,一个分类,打个比方,比如家具 和 沙发 这两样东西我们能够很自然的想到沙发是属于家具的对吧,其实在java中也是一样,我们可以把某一类具体的东西给他归纳为某一类抽象一点的物品,就像家具和沙发一样的关系
总结出来就是 类就是抽象化的一个模板 对象是类的一个具象化的实例
类的组成
属性(成员变量,全局变量),一些简单的值保存在属性中
行为(方法)-一些具体的操作放在方法中
那么如何实例化一个对象呢?
假如这里有一个学生类class Student{}
那么我们只需要使用new关键字就可以实例化一个对象
new Student();
注意
只要new了,那么就是一个新的对象
为什么呢?这就要在内存上去分析了,下面用一张图来演示这个原因
new 一个对象的时候就会划分一块新的内存空间,很形象的解释了上面的问题
类和类之间的关系
类和类之间的关系有三种
继承 组合 依赖
那么它们的区别在哪里呢?下面我们来简单的说一下他们的区别
1.组合关系(关联关系has a):
主要表现是一个类在另外一个类中做为属性出现
我们用代码演示
class A{
public int id;
}
class B{
public int score;
public A a;
}
- 依赖关系(use a)
它为 一个类在另一个类的方法中调用 或者做为参数使用
class A{
public int id;
}
class B{
public int score;
public void call(A a){
this.score=a.id
}
}
3. 继承关系(泛化关系is a)
由于继承关系知识点比较多,下面我们简单的说一下
继承关系主要就是java中的继承和实现关系,会用到extends
class A{
public int id;
}
class B extends A{
public int score;
public void call(){
this.score=a.id
}
}
在上面代码中B继承A 那么A就是B的父类,父类有的方法和属性子类都能继承包括私有属性,只不过私有属性在子类中不能访问,那么也说明了父类中能够被访问的属性和方法能够直接在子类中或者子类对象访问
当然,子类如果还有子类的话,那么同样的他也能访问到父类的父类里面的属性和方法
简单来说,继承是依次往下的,最下面的子类,可以访问到上面所有父类允许被访问的内容
那么可能有好奇的人就会问了,既然属性和方法都能被继承,那父类的构造方法(构造器)能不能被继承呢
答案是不能,如果没有super()特意指定且父类没有无参构造器的话那么在new 子类对象的时后就会报错,这里说明子类在new的时候会调用父类的无参构造方法,
这里补充一下
super就是代指父类或者引用父类内容的关键字
在子类的内部,如果想调用父类的方法,可以使用super关键字
子类先调用父类的无参构造器,在调用自己的构造器
重写父类方法
实现重写的条件如下:
1.继承
2.子类重写父类的方法,方法所有规则和父类一致修饰符范围要比父类大,或同级
例如
public class Person{
public void eat(){
System.out.println("person eat");
}
}
public class Student extends Person{
//这里就是重写的父类的方法
public void eat(){
System.out.println("Student eat");
}
}
面向对象的三大特征
封装
封装也称为信息隐藏 就是利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体部分。使得外部不能直接访问它的数据,只能通过一些对外接口与外部发生联系
继承
在上面我们简单的介绍了继承,这里我们在补充一下
继承是一种静态共享代码的手段,通过派生类对象的创建,可以接收某一段消息,启动其基类所定义的代码段,从而使基类和派生类共享了这一段代码
封装机制其实提供的是一种动态的代码共享手段,我们可以通过创建该类的实例,并向它发送启动某一段代码的消息,也能实现代码共享
多态
多态是指一个程序中同名的不同方法共存的情况,这些方法同名的原因是它们的最终功能和目的都相同,但由于在完成同一功能时,可能遇到不同的具体情况,所以需要定义含不同的具体内容的方法,来代表多种具体实现形式
简单来说就是相同行为不同实现
java中提供了两种多态机制:重载与覆盖
多态又分为静态多态与动态多态
静态多态指的是程序在编译时,系统就能决定调用哪个函数,如重载。
动态多态指的是在运行中才能动态的确定操作指针所指的对象,只要通过方法逇重写来实现。
文字不易理解,上一段代码吧
静态多态:
print(int i);
print(Sring str);
print(double d);
print(cahr c);
动态多态:
public class A{
void eat(){
System.out.println("a");
}
}
public class B extends A{
void eat(){
System.out.println("b");
}
}
public class C extends A{
void eat(){
System.out.println("c");
}
}
public class Test{
public static void main(String [] args){
A a=new B();
a.eat();
A a2=new C();
a2.eat();
}
}
当然很多态的应用场景都会运用到对象转型,当然我在这里就不写了,待会可以查看下面的面向对象知识点罗列