Interface 详解
简单的说 java都是通过继承父类,重写父类的方法来实现一些功能,继承只能单继承,而接口Interface是可以实现多个的,恰好补充了这个缺点。
接口可以实现多个,可以通过接口来实现不同的方法,这个接口可以看作是一些功能(类的本身不具有这个功能,则它可以通过实现一些接口来实现这个功能)
注意 使用接口一定要有回调!
语言表达能力有限,上个代码可以帮助理解
(1) 创建接口
public interface ToastListener {
void showToast();
}
(2) 创建接口的回调,以及设置一个方法调用接口
public class ToastListenerClass {
private ToastListener toastListener;
public void setToastListener(ToastListener toastListener) {
this.toastListener = toastListener;
}
public void getToastListener() {
toastListener.showToast();
}
}
(3) 点击按钮弹窗吐司
public class MainActivity extends AppCompatActivity implements View.OnClickListener,ToastListener {
private Button btn;
private ToastListenerClass listenerClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intView();
}
private void intView() {
btn = (Button) findViewById(R.id.btn);
listenerClass = new ToastListenerClass();
//设置弹出吐司的监听
listenerClass.setToastListener(this);
btn.setOnClickListener(this);
}
@Override
public void showToast() {
Toast.makeText(this,"弹出的吐司?",Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn:
//调用接口类,使之弹出吐司
listenerClass.getToastListener();
break;
default:
break;
}
}
}
先设置吐司的监听listenerClass.setToastListener(this),设置之后就会实现ToastListener 这个接口,然后就会回调showToast()方法。 而这一切的开关都在 listenerClass.getToastListener()方法的调用。
效果入下
之前只是简单的说了一下接口,只是知道它定义以后,设置并回调…OK我再举个栗子,加深一下印象
使用Interface进行传值
(设置一个DialogFragment页面)
public class LoginDialogFragment extends DialogFragment {
private EditText mUsername;
private EditText mPassword;
//定义一个接口 用来传值
public interface LoginInputListener
{
void onLoginInputComplete(String username, String password);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
View view = getActivity().getLayoutInflater().inflate(R.layout.fragment, null);
mUsername = (EditText) view.findViewById(R.id.id_txt_username);
mPassword = (EditText) view.findViewById(R.id.id_txt_password);
builder.setView(view)
.setPositiveButton("sign in", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
LoginInputListener listener = (LoginInputListener) getActivity();
//可以看到 调用这个接口对象,并把值存入进去 listener.onLoginInputComplete(mUsername
.getText().toString(), mPassword
.getText().toString());
}
}).setNegativeButton("Cancel", null);
return builder.create();
}
}
主页面调用这个接口 可以获取值
public class MainActivity extends AppCompatActivity implements View.OnClickListener,LoginDialogFragment.LoginInputListener {
private Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intView();
}
private void intView() {
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn1:
LoginDialogFragment dialog = new LoginDialogFragment();
dialog.show(getFragmentManager(), "loginDialog");
break;
default:
break;
}
}
@Override
public void onLoginInputComplete(String username, String password) {
Toast.makeText(this, "帐号:" + username + ", 密码 :" + password,
Toast.LENGTH_SHORT).show();
}
}
效果图如下
接下来总结一下接口的使用
<1> 接口一般定义的是常量和一些抽象方法。抽象类中可以包含抽象方法,也可以有非抽象方法,但是有抽象方法的类一定是抽象类。抽象方法不能有方法体。
<2> 在引用接口时,接口的引用指向实现的对象,尽量定义为接口或父类的引用。这其中有可能用到多态的知识。引用接口用implements。
<3> 接口(interface)只能定义抽象方法而且默认为是Public。常量是public static final 修饰的
<4> 通过implements来引用接口。例:Class runnrtmp inplements runner.
<5> 多个无关类可以实现一个接口,!!!接口的引用指向实现的对象。
<6> 一个类可以实现多个无关的接口(这点和继承要有所区别)
<7> 和继承一样,接口与实现类之间存在多态性。
<8> 接口可以继承其他的接口,并添加新的属性和抽象方法。
<9> 在类中实现接口的方法时必须加上public修饰符
[希望这篇文章可以帮到你]
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2832.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...