接口
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);
}
}
复制代码