接口

MyInterface

/**
 * 
 */
package cn.itcast.demo01;

/**
 * @author Administrator
 *	接口
 *		成员方法,全部抽象
 *		不能定义带有方法体的方法
 *	定义抽象方法:固定格式
 *		public abstract 返回值类型 方法名称(参数列表);
 *		修饰符public 写或者不写,都是public
 *	接口中成员变量的定义
 *		具体要求:
 *			必须定义为常量。
 *			public static final 数据类型 变量名=值
 */
public interface MyInterface {
	public static final int a = 1;
	//在接口中定义抽象方法。
	public abstract void function();
}
复制代码

MyInterfaceImpl

package cn.itcast.demo01;
/*
 * 定义类 实现接口,重写接口中的抽象方法
 *  关键字 implements
 */
public class MyInterfaceImpl implements MyInterface{

	@Override
	public void function() {
		// TODO 自动生成的方法存根
		System.out.println("实现类,重写接口的抽象方法");
	}
//	
	

}
复制代码

Test

package cn.itcast.demo01;

public class Test {
	public static void main(String[] args) {
		MyInterfaceImpl my = new MyInterfaceImpl();
		my.function();
	}
}
复制代码

接口中成员的特点

MyInter

package cn.itcast.demo02;
/*
 * 接口中成员的特点
 * 	1.成员变量的特点,没有变量,都是常量
 * 	固定格式: public static final 数据类型 变量名 = 值
 * 	public 权限
 * 	static 可以被类名直接 调用
 * 	final 最终,固定住变量的值(不允许被修改)
 * 
 * 	注意: public static final 修饰符可以省略不写
 * 		但是,不写不等于没有
 * 		三个修饰符,还可以选择写,但是没写的依旧还是会存在。
 * 	2. 接口中的成员方法特点:
 * 		public abstract 返回值类型 方法名(参数列表)
 * 		修饰符 public abstract 可以不写或者选择性书写
 * 	注意:写不写都有
 * 	3. 实现类,实现接口,重写接口全部抽象方法,创建实现类对象。
 * 		如果不重写接口中的所有方法,那么依旧还是一个抽象类.	
 * 		
 */
public interface MyInter {
	public static final int x = 3;
	
	public abstract void show();
	
	public abstract int getSum(int a, int b);
}

复制代码

MyInterImpl

package cn.itcast.demo02;

public class MyInterImpl implements MyInter {
	//重写接口中的抽象方法,public权限是必须的
	
	@Override
	public void show() {
		// TODO 自动生成的方法存根

	}

	@Override
	public int getSum(int a, int b) {
		// TODO 自动生成的方法存根
		return a+b;
	}

}
复制代码

Test

package cn.itcast.demo02;

public class Test {
	//使用接口中定义的常量
	//常量被静态修饰,可以被类名直接调用,被接口的名字直接调用
	public static void main(String[] args) {
		System.out.println(MyInter.x);
		
		MyInterImpl my = new MyInterImpl();
		int i = my.getSum(1, 2);
		System.out.println(i);
		
		
	}
}
复制代码

C 继承抽象类D,实现A,B接口

接口A
package cn.itcast.demo03;

public interface A {
	public abstract void a();
}
接口B
package cn.itcast.demo03;

public interface B {
	public abstract void b();

}

抽象类D
package cn.itcast.demo03;

public abstract class D {
	public abstract void d();
}

复制代码

实现类C

package cn.itcast.demo03;
/*
 * C类,在继承一个类的同时,还可以实现多个接口。
 */
public class C extends D implements A,B{

	@Override
	public void b() {
		// TODO 自动生成的方法存根
		
	}

	@Override
	public void a() {
		// TODO 自动生成的方法存根
		
	}

	@Override
	public void d() {
		// TODO 自动生成的方法存根
		
	}

}

复制代码

接口的继承

package cn.itcast.demo04;

public interface A {
	public abstract void a();
}
package cn.itcast.demo04;

public interface B {
	public abstract void b();

}
package cn.itcast.demo04;
/*
 * 接口与接口之间,是继承关系
 * Java支持接口之间的多继承,一个接口同时可以继承多个接口
 */
public interface C extends A,B{
	public abstract void c();

}

package cn.itcast.demo04;
/*
 * D实现类,必须重写A,B,C三个接口中的抽象方法
 * 
 * 类中没有多继承
 * 接口之间多继承
 * 相同点:
	都位于继承的顶端,用于被其他类实现或继承;
	都不能直接实例化对象;
	都包含抽象方法,其子类都必须覆写这些抽象方法;
	区别:
	抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;
	一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)

 */
public class D implements C {

	@Override
	public void a() {
		// 

	}

	@Override
	public void b() {
		// TODO 自动生成的方法存根

	}

	@Override
	public void c() {
		// TODO 自动生成的方法存根

	}

}

复制代码

Java中的多态

package cn.itcast.demo05;

public class Test {

	public static void main(String[] args) {
		// Java中,对象的多态性,调用程序中的方法
		//公式:父类类型或者是接口类型 变量 = new 子类的对象()
		
		Fu f =  new Zi();
		f.show();
		
		//抽象类Animal 子类Cat
		Animal a = new Cat();
		a.eat();
		
		//接口Smoking,实现类Student
		Smoking s = new Student();
		s.smoking();
		
	}

}
复制代码

多态中,成员特点

package cn.itcast.demo06;

public class Fu {
	int a = 1;
	public void show() {
		System.out.println("super method");
	}
}

package cn.itcast.demo06;

public class Zi extends Fu{
	int a = 2;
	public void show() {
		System.out.println("subclass method");
	}
}

package cn.itcast.demo06;
/*
 * 多态中,成员特点
 * 		
 * 		成员变量:
 * 			编译的时候,参考父类中有没有这个变量,如果右,编译成功,没有编译失败
 * 			运行的时候运行的是父类中的变量值
 * 		编译运行全看父类		
 * 
 * 
 * 		成员方法:
 * 			编译的时候,参考父类中有没有这个方法,如果有,编译成功,否则编译失败
 * 			运行的时候,运行的是子类的重写方法,如果子类没有重写,则运行父类中的方法
 * 		编译看父类,运行看子类
 * 		
 */
public class Test {
	public static void main(String[] args) {
		Fu f = new Zi();
		System.out.println(f.a);
		f.show();
	}
}
复制代码

关键字 instanceof

package cn.itcast.demo07;

public class Animal {

}

package cn.itcast.demo07;

public abstract class Person {
	public abstract void sleep();
}

package cn.itcast.demo07;

public class Student extends Person {

	@Override
	public void sleep() {
		// 
		System.out.println("学生在睡觉");
	}
	public void study() {
		System.out.println("我正在学习呢");
	}

}


package cn.itcast.demo07;
/*
 * 运算符比较运算符 , 结果真假值
 * 关键字 instanceof 比较引用数据类型(有继承关系或者实现关系的)
 * 
 */
public class Test {

	public static void main(String[] args) {
		//
		Person p = new Student();
		Student s = (Student)p;
		s.study();
		
		//判断是否是学生这个类型的对象
		boolean b =  p instanceof Student;
		System.out.println(b);
		p.sleep();
	}

}

复制代码

构造方法

package cn.itcast.demo02;
/*
 * 重载 
 * 参数列表的不同
 */
public class Person {
	private String name;
	private int age;
	
	 
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person() {
		super();
		// TODO 自动生成的构造函数存根
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
复制代码

this 的使用

package cn.itcast.demo03;
/*
 * this 可以再构造方法之进行调用
 */
public class Person {
	private String name;
	private int age;
	
	
	public Person() {
		//调用有参数的构造方法 
		//必须是放在第一行
		this("fengfeng",22);
	}
	
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
复制代码

super()

/*
 * 在子类中,super()的方式,调用父类的构造方法
 * 
 * super()调用的是父类中空参构造
 * super(参数)调用的是父类的有参数构造方法
 * 
 * 		子类中所有的构造方法,无论重载多少个,第一行必须是super()
 * 		如果父类有多个构造方法,子类任意调用一个就可以。
 * 		super()语句必须是构造方法第一行代码
 */
 
 package cn.itcast.demo05;

public class Person {
	public Person(int a) {
		
	}
	public Person(String a) {
		
	}
}

 
 public class Student extends Person{

	public Student(int a) {
		super(a);
		//
	}
	
	public Student(String f) {
		super(1);
	}
}

/*
 * 构造方法第一行,写this()还是super()
 * 不能同时存在,任选其一,保证子类的所有构造方法调用到父类的构造方法即可
 */
 package cn.itcast.demo06;

public class Person {
	public Person(int a) {
		
	}
	
}


 public class Student extends Person{

	public Student() {
		this("aaa");
		//
	}
	
	public Student(String s) {
		super(2);
	}
	
}
复制代码