黑马程序员——接口、多态、构造函数



------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


兴趣是学习编程最好的老师

不积跬步,无以至千里

这辈子没办法做太多事情,所以每一件都要做到精彩绝伦。


<接口(interface)>


1.接口当一个类中所有的方法都是抽象的时候,就可以定义为接口。接口解决了java中只能单继承的局限,因为虽然类与类之间只能是单继承,但是接口与接口之间可以是单继承,也可以是多继承。类与接口可以是单实现,也可以是多实现。

作为功能扩展:
在Java中不允许多继承,但允许同时实现多个接口,例如;
	interface IA{
		void f1();
		void f2();
	}
	interface IB{
		void f2();
		void f3();
	}
	class A implements IA,IB{
	}

2.成员特点

   A:只有成员变量和成员方法。

   B:成员变量 默认修饰符 public static final

      int i = 20会被默认为public static final int i = 20;

   C:成员方法 默认修饰符 public abstract

      void show()会被默认为public abstract void show();

例如:
interface IPersonnel
{
	int num  = 2;                 //默认为public static final int num = 2;
	void say();                    //默认为public abstract say();
	void show();                   //默认为public abstract show();

}
class Student implements IPersonnel
{
	//访问修饰符一定要等于或大于父类的访问修饰符;
	//访问权限从小到大为:private (默认) protected  public
	public void say(){
	}
}
class Demo 
{
	public static void main(String[] args) 
	{
		System.out.println("Hello World!");
	}
}

3.接口特点:

接口符合对外暴露的规则并且实现了功能的扩展降低了程序的耦合性。高内聚,低耦合接口的理解狭义的理解Java中的接口。广义的理解任何定义的规范都是接口。

 

4.接口和抽象类的区别:

1):抽象类只能被单继承;接口可以被多实现。

2):抽象类中的成员变量可以是常量,也可以是变量。成员方法可以是抽象的,也可以是非抽象的。构造方法虽然不可以创建对象,但是可以给子类实例化用。

   接口中的成员变量只能是常量。默认修饰符 public static final成员方法只能是抽象的。默认修饰符 public abstract

3)抽象类中定义的是体系结构中的共性的内容。接口中定义的是对象的扩展功能。

4)抽象类被继承表示的是:"is a"的关系。ab中的一种。接口被实现表示的是: "like a"的关系。ab中的一种。

5.接口、抽象类、接口之间的实现与继承如图:



<多态>

1.某一类事物的多种存在形态。方法重载(静态多态),方法重写(动态多态,对象多态)对象多态必须满足类与类(或接口)要有继承(或实现)关系。有重写父类或接口的方法,一定要有父类或者接口的引用指向子类的对象。


2.多态中的成员特点:

举例: 动物的例子:

向上转型

Animal a = new Cat();

a.eat();

向下转型

Cat c = (Cat)a;

c.eat();

向上转型

Animal a = new Dog();

向下转型 转换异常

Dog d = (Dog)a;

多态的特点:

 1.当父类的引用指向子类对象时,访问被覆盖成员时,访问的是父类的,在调用被覆盖的方法时,调用的是子类的。方法是运行时动态绑定的;

 2.当父类的引用指向子类对象时,不能访问子类自有的成员;只能访问被覆盖的

class Personnel
{
	int num = 10;
	void say(){
		System.out.println("我是传智播客一员");
	}
}
class Student extends Personnel
{
	int num = 20;
	//重写的
	void say(){
		System.out.println("我是一名学生");
	}
	//自有的方法
	void show(){
		System.out.println("子类的show()");
	}
}
class Teacher extends Personnel
{
	//重写
	void say(){
		System.out.println("我是一名教师");
	}
	//自有的方法
	void teach(){
		System.out.println("讲解Java");
	}
}
class Master
{
	void talk(Personnel obj){

		System.out.println(obj.num);
		obj.say();
		 
		if(obj instanceof Student){
			Student stu = (Student)obj;
			stu.show();
		}
		if(obj instanceof Teacher){
			Teacher tea = (Teacher)obj;
			tea.teach();
		}
		
	}
	
}
class  Demo
{
	public static void main(String[] args) 
	{
		Student stu = new Student();
		Teacher tea =new Teacher();

		Personnel p = new Teacher()
		Teacher t = (Teacher)p;

		Master m = new Master();
		m.talk(stu);
	}
}


<构造方法>

1.初始化代码块位于类体中,每当创建此类的对象时,都会执行一次,一般用于初始化数据成员,以及做一些类的初始化工作;

2.构造函数位于类体中,如果存在"初始化代码块"时,是在"初始化代码块"之后执行;

  构造函数的规则:跟类名相同,不能有返回值的声明,甚至是void可以重载,如果定义了带参的构造器,那么Java不再自动添加默认构造器;

class Student{
	private String stuName;
	private int stuAge;

	//定义一个默认的,无参的构造函数
	Student(){
	}
	//定义一个带参数的构造函数
	Student(String stuName,int stuAge){
		
		this.stuAge = stuAge;
	}
	
	Student(String stuName){
		this.stuName = stuName;
	}
	Student(int stuAge){
		this.stuAge = stuAge;
	}
	
	
	//初始化代码块
	{
		System.out.println("Student的初始化代码块!");
	}
	void show(){
		System.out.println("我叫:" + stuName + " ,年龄:" + stuAge);
	}


}

3.单例模式

class Student
{
	//2.步骤2
	private static Student stuObj = null;
	//1.步骤1
	private Student(){
	}
	//3.步骤3
	public static Student getStudentInstance(){
		if(stuObj == null){
			System.out.println("构造了一个Student对象");
			stuObj = new Student();
		}
		System.out.println("返回一个Student引用");
		return stuObj;
	}
}
class Demo 
{
	public static void main(String[] args) 
	{
		Student stu = Student.getStudentInstance();//第一次获取,产生一个对象

		Student stu2 = Student.getStudentInstance();//之后再获取,将直接返回引用,不再产生对象
		Student stu3 = Student.getStudentInstance();
	}
}
结果为:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值