封装
定义和原理
Java的三大特点之封装:封装又称数据的封装,因为Java是面向对象的语言,需要对一些私密的数据进行隐藏。就像在银行取钱一样,每个用户不可能去操控别人的账号,你只能操控你自己有的账户,而且对于ATM机取钱的一些业务,你只知道结果,不知道机器是如何运行。这样就把程序功能性的代码封装起来,外部人看不到也不知道。只能去通过操作相应的接口来访问(信息隐藏)。
原理:“该露的露,该藏的藏”。 写程序设计追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉。低耦合:仅暴露少量的方法给外部使用。电视大家都看过吧,可是有多少人对电视内部的是如何运行执行功能的!我们可以使用的是那一个遥控板上面给的按键,来对电视里面的能行进行操控。
注意:属性私有getter/setter
代码展示
这里可以看出当我们对private修饰的变量的name调用时,即使在Application类中使用了new关键字还是会报“The field Student name is not visible(Student name该字段不可见)”的错误提示。面对这种情况Java语言提供一些可以操作这个私有属性的方法!提供一些public的get、set方法。
通过 get 获得这个数据和set 给这个数据设置值。这样我就可以调用getName()和setName()。
注意:①public void setName(String name) { this.name = name; }
是形参方法,在使用的时候需要传实际参数.
②public String getName() { return name; }
是有返回值的String 方法。
继承
继承的本质:对某一批类的抽象,从而实现对现实世界更好的建模。
程序员是”建模师“,但是哈,不可以“建模”需要走出网络,走出房门,走向户外运动运动。哈哈哈……
extands
** extands **:”扩展“的意思。子类是父类的扩展,从意义上讲是 ”is a“ 的关系。比如学生是人、老师是人,而人类具有sleep()和eat()等方法,所以老师和学生也有sleep()和eat()等方法的行为。
注意:Java中类只有单继承,没有多继承。一个子类只有一个父类,而一个父类可以有多个子类。
代码展示
我们在Person类中写了sleep()和eat()方法,由于
public class Student extends Person {
}
所以即使在Student类里面什么都不写,在Application类中依旧可以调用sleep()和eat()。
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.say();
student.eat();
}
}
object
在Java中所以的类都直接或间接继承object类。即使Person类里面什么都不写,在Application类里面new 一个Person还是得调用出来一些方法。这些方法是Java里面原本就存在的。在后面会再学习到。
super
super和this的区别:super代表父类,this代表当前的。
代码展示
代码里父类中
public class Person {
protected String name = "徐小磊";
}
子类中
public class Student extends Person {
private String name = "徐磊";
public void print(String name) {
System.out.println(name); // Mr.xu
System.out.println(this.name); //徐磊
System.out.println(super.name); //徐小磊
}
}
测试类中
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.print("Mr.xu");
}
}
打印的结果
这里我们可以看到this和super的区别。this是调用本类中的变量,super是调用父类的变量,此外super还可以调用父类的构造器必须要在子类方法的 。
重写
(Override)重写 :都是方法的重写,和属性无关。子类重写了父类的方法
代码展示
在继承的关系下,我new了两个对象。
public static void main(String[] args) {
A a = new A();
a.print();
//父类的引用指向了子类
B b = new A();
b.print();
}
但是有什么不一样的嗯?
下面代码中的new的就很正常
A a = new A();
a.print();
可是在下面代码中 却 new的是A();
指向A类
B b = new A();
b.print();
}
可是运行的结果却是
这个和之前了解的new对象的创建有点不太
public static void print() {
System.out.println("A-->print()");
}
public static void print() {
System.out.println("B-->print()");
}
区别在于在写方法的时候使用了static的静态方法:方法的调用只和左边指向的定义数据类型有关。如果不适用static的静态方法呢?又会是这样的结果?思考一下!!!
展示
public void print() {
System.out.println("A-->print()");
}
public void print() {
System.out.println("B-->print()");
}
果然运行结果也变了
因此可以看出,静态的方法和非静态方法区别很大,所以在非静态的方法下适用方法重写。
总结
封装:
1、提高了程序的安全性,保护数据。
2、隐藏代码的实现细节
3、统一接口
4、系统可维护增强了
继承:
1,Java中类只有单继承,没有多继承。
2、关于super的注意点:
①super调用父类的构造方法,必须在子类构造方法的第一个
②:super只能出现在子类的方法或者构造方法中!
③:super和this 不可以同时调用方法!
重写:需要有继承关系,子类重写父类的方法!
1、方法名必须相同
2、参数列表必须相同
3、修饰符:范围可以扩大但是不可以缩小。public>protected>Default>private
4、子类和父类的方法必须一致,方法体不同!