黑马程序员_java基础_面向对象_02

----------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开发期待与您交流----------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值