----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
一、封装
1、什么叫封装?
(1) 封装就是包装。
(2)隐藏内部实现细节,隔离外界对内的直接操作。
(3)仅对外提供公共访问方式。
理解:对外界隐藏属性,开方部分方法。
2、封装的好处?
(1)将变化隔离。
(2)便于使用。
(3)提高重用性。
实例:
public class Test {
public static void main(String[] args){
display();//调用打印"hello,word"的方法即可
}
public static void display() { //将打印"hello,word"的功能封装在一个方法中
System.out.println("hello,word");
}
}
二、继承的由来
如果多个类中存在相同的属性和方法,那么可以把相同的部分抽取出来,放到一个单独的类中,然后让原来这些类去继承这个单独的类。这样原来的类就无需再去定义这些相同的属性和方法了。
1、继承的特点和注意事项
(1)继承的体系结构:就是对要描述的事物进行不断的向上抽取,就出现了体系结构。
(2)继承的好处:
A:继承的出现,提高了代码的复用性。
B:继承的出现,让类与类之间产生了关系,extends来表示,
这个关系的出现,为后面我们面向对象的第三个特点多态打下了基础。
(3)特点
A:java只支持单继承(其实确切的说是java对多继承进行了优化,避免了安全问题)。
B:java支持多重(层)继承。
(4)注意:
A:子类可以直接访问父类中的非私有的属性和行为。
B:不要仅为了获取其他类中部分功能而去继承。
C:类与类之间要有所属( " is a " )关系,xx1是xx2的一种。
**如何判断A和B是否有继承关系?
**A如果继承B,那么就可以说A是B的一种。
实例:
class Father
{
int num1 = 5;
}
class Son extends Father
{
int num1 = 20;
int num2 = 10;
public void show()
{
int num1 = 30;
System.out.println("num1:"+num1);
System.out.println("num2:"+num2);
//局部范围内有的变量,如果我想使用成员变量,怎么办?this
System.out.println("this num1:"+this.num1);
//就想子类中访问父类中和子类同名的变量super
System.out.println("father num1:"+super.num1);
}
}
总结:使用子类中的成员变量时,首先看局部有没有和成员变量同名的,如果有就是用局部的。
其实,在子类的成员变量里面找,如果有,直接输出。
最后,在父类中找同名的变量,如果有,就输出父类的值。否则报错。
this和super的区分:
**this代表本类对象的引用
super代表父类的内存空间的标识。
**this可以用于区分局部变量和成员变量同名的情况。
super可以用于区分子类和父类成员变量同名的情况。
**一般,子类中不会出现和父类同名的成员变量。
2.重写的特性
实例:
class Father
{
public void show()
{
System.out.println("father show");
}
}
class Son extends Father //子类继承了父类
{
public void show() //子类重写了父类的show方法
{
System.out.println("son show");
}
public void show1()
{
System.out.println("son show1");
}
}
总结:在使用子类的成员方法时:首先在子类中找,其次在父类中找。否则,报错。
super可以在子类中使用父类的成员方法。
子类中存在和父类成员方法同名的这种现象,叫做重写,复写,覆盖。
重写(override)和重载(overload)的区别:
重载的特点:
**在同一类中。
**方法名相同,参数列表不同。
重写的特点:
**要有继承关系。在子父类中
**方法的声明相同。(方法名和参数列表都相同)
***覆盖时,子类方法权限一定要大于等于父类方法权限
***静态只能覆盖静态。
注意:在继承中,父类的static.private修饰的成员变量和方法是无法继承的,继承只是继承了父类的所有public的东西。
三、多态调用的概念
重载:编译器确定要调用的是哪一个方法。同一条调用语句,但调用的哪个重载版本的方法是多态的!
重写:JVM确定调用的是哪一个方法。同一个类型的引用,调用的是哪个类的方法是多态的!
2、运行时多态的前提
(1)继承或实现;
(2)重写方法
(3)向上转型,然后调用重写方法
3、多态注意事项
(1)属性不是多态的------由引用类型来确定调用的是哪个属性
实例:
public class Test {
public static void main(String[] args) {
B b = new B();
A a = b;
// 当子类和父类中存在同名属性时
// 由引用类型来决定使用的是哪个类的i
System.out.println(a.i);
System.out.println(b.i);
a.fun();
b.fun();
}
}
class A {
int i = 1;
}
class B extends A {
int i = 2;
}
(2)static方法不是多态的
实例:
public class Test {
public static void main(String[] args) {
B b = new B();
A a = b;
// 引用类型来决定调用的是哪个类的静态方法
a.fun();
b.fun();
}
}
class A {
public static void fun() {
System.out.println("A");
}
}
class B extends A {
public static void fun() {
System.out.println("B");
}
}
(3)private不是多态的
实例:
public class Test {
public static void main(String[] args) {
A a = new B();
a.fun();//因为A类中fun()方法是private的,所以外界不能调用,编译不通过!
}
}
class A {
private void fun() {
System.out.println("A");
}
}
class B extends A {
public void fun() {
System.out.println("B");
}
}
总结:多态提高了代码的重用性,提倡了java中的高内聚低耦合特点,增加了代码的扩展性。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------