Java 面向对象的三大特性
1.封装
封装的主要目的:是为了保护信息。将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
优点
1.阻止在外部定义的代码随意访问内部代码和数据。
2.隐藏细节信息,一些不需要程序员修改和使用的信息。比如取款机中的键盘,用户只需要只要按哪个键实现哪个操作就可以,不需要知道内部是如何运行的,
3.建立系统的松耦合关系,提高系统的独立性。当一个系统的实现方式发生变化时,只要它的接口不变,就不会影响其他系统的使用。例如 U 盘,不管里面的存储方式怎么改变,只要 U 盘上的 USB 接口不变,就不会影响用户的正常操作。
4.提高软件的复用率,降低成本。每个系统都是一个相对独立的整体,可以在不同的环境中得到使用。例如,一个 U 盘可以在多台电脑上使用。
Java 语言的基本封装单位是类。由于类的用途是封装复杂性,所以类的内部有隐藏实现复杂性的机制。Java 提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西,私有的方法数据只能通过该类的成员代码来访问,这就可以确保不会发生不希望的事情。
1.访问修饰符
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
2.this关键字
this表示当前对象,函数参数名和成员函数名重合的时候,可以使用this区别
3.JAVA中的内部类
内部类:是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
分为:
(1)成员内部类
(2)静态内部类
(3)方法内部类
(4)匿名内部类:1.声明一个抽象类(abstract)2.声明一个接口(interface)。必须继承一个类或者实现一个接口。不可兼得。
作用:
(1)内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。
(2)内部类的方法可以直接访问外部类的所有数据,包括私有数据。
(3)内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。
(4)匿名内部类可以方便的定义回调
(5)使用内部类可以非常方便的编写事件驱动程序。
2.继承 inheritance
继承是类与类之间的一种关系。继承已存在的类,就是复用(继承)这些类的方法和域。是 “is a”的关系。
eg.狗继承动物,动物类:父类或者基类;狗类是动物类的子类或者派生类。
Java中是单继承,即一个类只有一个父亲。
优点
子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有)。实现代码复用。
关键字:extends
eg. class Dog extends Animal{…}
1.方法的重写
子类如果对继承的父类的方法不满意,可以自己编写继承的方法。即方法的重写。当调用方法是会优先调用子类的方法。
注意:返回值类型;方法名;参数类型及个数-----需要与父类继承的方法相同, 才叫方法的重写。
方法重载:同一个类处理不同数据的多个相同方法名的多态手段。
方法重写:继承,子类中对父类已存在的方法进行修改。
2.继承的初始化顺序
先初始化父类,再初始化子类
先执行初始化对象中属性, 再执行构造方法中的初始化。
所以:实例化一个子类,java程序的执行顺序为,
父类对象属性初始化------->父类对象构造方法----->子类对象属性初始化----->子类对象构造方法。
3.final关键字
(1)修饰类,不允许被继承
(2)修饰方法,不允许被覆盖(重写)
(3)修饰属性,不会进行隐形的初始化,所以初始化时必须有值,或在构造方法中赋值(只能赋值一次)
(4)修饰变量,声明变量的时候才能复制,即为常量。
4.super关键字
在对象的内部使用,可以代表父类对象。
(1)访问父类的属性,super.age()
(2)访问父类的方法,super.eat()
子类的构造过程中必须调用父类的构造方法。这就隐式的使用了super关键字。因为如果子类的构造方法中没有显式调用父类的构造方法,则系统默认调用父类无参的构造方法。那如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法的第一行。
如果子类构造方法中既没有显式调用父类的构造方法,父类也没有无参的构造方法,则编译出错。
(补充说明,虽然没有显式声明父类的无参的构造方法,系统会自动默认生成一个无参构造方法,但是,如果你声明了一个有参的构造方法,而没有声明无参的构造方法,这时系统不会动默认生成一个无参构造方法,此时称为父类没有无参的构造方法。)
5.Object类
是所有类的父类。如果一个类没有extends关键字,默认继承Object类。
Object中的方法适用于所有的子类。
- toString() :返回对象的名字@哈希code。
/*Returns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.
The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Returns:
a string representation of the object.*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
可以重写。表示出对象的属性
运行结果:
- equals():
返回boolean
比较的是对象的应用是否相同,是否指向同一块内存地址。
eg. dog.equals(dog2);
如果是两个对象,判断两个对象的属性,则重写equals()方法。
getClass()可以得到类对象,判断类型是否一样-----if (getClass() != obj.getClass()),不一样则返回false
可以参考:https://blog.csdn.net/zzy372219506/article/details/90934987
3.多态
多态就是对象的多种形态。
1.引用多态;
2.方法多态。
员工
经理
。。。
参考:
内部类:
- [1] https://www.cnblogs.com/hysum/p/7101974.html
- [2] https://www.cnblogs.com/rove888/p/9936109.html
- [3] http://c.biancheng.net/view/939.html