----------Android、Java开发期待与您交流----------
面向对象的特征:封装、继承、多态
继承:通过抽取同一类事物的一些共有的属性和行为单独存放在一个类中,具体的事物可以通过继承此 类来使用共有的属性和行为,以使类与类之间产生关联并提高代码利用率的一种行为如果要继承一个类需要使用关键字extends,被继承的类称为超类、基类或者父类,新生类称为子类、派生类或孩子类;java.lang.Object是所有类的超类
Java语言只支持单继承,因为多继承容易带来安全隐患;当多个父类定义了同名函数,但具体内容不同时,子类会因为不确定到底调用哪个父类的方法而产生混乱。
子类只能使用父类中非私有的变量和方法
子父类中变量和函数的特点:
1.子类只能使用父类中非私有的变量和方法
2.子类要访问本类中变量,用this调用;访问父类中的同名变量用super调用
3.当子父类具有同名函数时,当子类对象调用该函数时,调用的是子类函数,父类的函数内容会被子类覆盖(重写)
子父类方法覆盖原则:
1.子类覆盖父类成员,必须确保子类成员的权限大于等于父类成员权限,否则编译失败。
2.静态只能覆盖静态
子父类构造函数的特点:
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为在子类构造函数内的第一句隐藏了super();(调用父类的空的构造方法)
为什么子类一定要访问父类中的构造函数
因为父类中的数据,子类可以直接获取。所以子类在建立时,需要先查看父类是如何对这些数据进行初始化的,所以在子类对象初始化之前要访父类构造函数
如果访问父类的非空构造可通过手动定义super语句的方式指定
结论:
子类所有的构造函数都会默认访问父类中空参数的构造函数
当父类没有空参数的构造函数时,子类必须手动通过super或this语句来指定要访问父类中的构造函数
当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数,子类中至少会有一个构造函数会访问父类的构造函数
Java中的初始化顺序:
Java类首次装入时,会对静态成员进行一次初始化,但方法不被调用是不会被执行,静态成员变量和静态代码块初始化级别相同,非静态成员变量和构造代码块初始化级别相同
代码初始化顺序:
父类静态代码块-->子类静态代码块-->父类的非静态代码-->父类的构造函数-->子类的非静态代码-->子类的构造函数
class ObjInit {
static {
System.out.println("父类静态代码块!");
}
{
System.out.println("父类构造代码块!");
}
ObjInit() {
System.out.println("父类构造方法!");
}
}
class ObjInitChild extends ObjInit {
static {
System.out.println("子类静态代码块!");
}
{
System.out.println("子类构造代码块!");
}
ObjInitChild() {
System.out.println("子类构造方法!");
}
}
public class InitTest {
public static void main(String[] args) {
ObjInitChild oic = new ObjInitChild();
}
}
fianl关键字
fianl:可以修饰类、函数、变量
1.fianl修饰的类不能被继承
2.修饰的方法不能被重写
3.修饰的变量只能赋值一次,既可以修饰成员变量,也可以修饰局部变量
4.内部类定义在类中的局部位置上时,只能访问局部被final修饰的局部变量
抽象类:
1.抽象方法一定在抽象类中
2.抽象方法和抽象类必须被abstract关键字修饰
3.抽象类不可以用new创建对象,因为抽象方法没有方法体,调用没有意义
4.抽象类中的方法要被使用,子类必须重写所有的抽象方法并建立子类对象调用;如果子类只重写了部分抽象方法,那么该子类还是抽象类
模版方法设计模式:
在定义功能时,功能的一部分是确定的,但是有一部分不确定,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴漏出来,由该类的子类去实现
import java.util.Scanner;
//手动输入一个0-1000的正数,同时随机生成一个0-1000的数,直到两数相等程序截至,计算多少时长可以达到目的
public class TempletTest {
public static void main(String[] args) {
Templet st = new SubTemplet();
long time = st.duration();
System.out.println("代码片段运行时长:" + time);
}
}
abstract class Templet {
// 获取某一段代码的执行时间
public final long duration() {
long start = System.currentTimeMillis();
// 需要测试的代码片段
runCode();
long end = System.currentTimeMillis();
return (end - start);
}
abstract void runCode();
}
class SubTemplet extends Templet {
//
// 待测试运行时长的代码
public void runCode() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个0-1000的整数:");
int num = sc.nextInt();
int count = 0;// while循环次数计数器
while (true) {
count++;
if (num == (int) (1000 * Math.random())) {
break;
}
}
System.out.println("while循环次数:" + count);
}
}
多态
多态性是指允许不同的类对象对统一消息做出响应。多态有两种形式:重载和重写
重载:同一类中,至少有两个同名函数,但它们的参数名称或参数别表不同,不以返回值类型为判断依据
重写:存在于子父类中,子父类中存在同名函数,但是函数内容不同
多态的优缺点:
优点:提高来了程序的扩张性
缺点:只能使用父类的引用访问父类中的成员
多态中成员函数的特点:
编译期间:参阅引用变量所属的类中是否有被调用的方法;有则编译通过,无则编译失败
运行期间:参阅所属类中是否有被调用的方法
简单的说,成员函数在多态调用时,编译看等号左边,运行看等号右边
多态中成员变量的特点:
无论编译和运行,都参考等号左边的引用变量所属的类
多态中静态成员函数的特点:
无论编译和运行参考等号左边
----------
Android、Java开发期待与您交流----------