(一)
1.继承格式
继承的关键字是extends.
继承语法格式
public class 类名(子类名) extends 类名(父类名){
}
2.子类继承到父类的那些方法和属性
现实生活中的继承:儿子只能继承父母一定的特征和行为。
子类只能继承到一部分的属性和方法。
子类和父类在同一个包下:
只有私有的属性、方法和构造函数不能被继承。
只有公有的、受保护的、默认的属性和方法可以被子类继承。
(公有的构造函数也不能被继承)
子类和父类不在同一个包下:
只有公有的属性和方法可以被子类继承。
3.方法的重写
方法重载:方法的名字必须完全相同,但是参数个数和参数类型要不同。
要实现方法重写:必须存在继承的关系,子类中定义的方法,必须在父类中存在。
创建对象的格式:子类名 对象名 = new 子类构造函数();
实现了方法重写后,在调用方法的时候,会优先执行子类的方法,如果子类没有该方法,则调用父类的方法。
4.自动转型
要实现自动转型必须存在继承的关系。
创建对象的格式:父类名 对象名 = new 子类构造函数();
(将由子类构造函数创建的对象转换为父类)
自动转型后,不能调用子类自己的方法.
多态:是由方法重载,继承、方法重写、自动转型导致程序在编译的时候不能确定最终要执行的方法是谁的,
只有在运行的时候才能确定最终要执行的方法。
多态:表示的是对象的不同形态。
5.继承的优势
如果没有继承,增加工作量,不便于扩展,
存在继承的优势:
1.提供高程序的可扩展性
2.降低代码的冗余
3.增加了协作的方便
(二)
1.定义接口的语法
接口是一种特殊的类。
定义关键字是interface.
定义的语法:
public interface 接口{
接口中只能定义公有的属性和公有的方法。
定义常量(属性一种)
//定义常量的语法,static表示是静态的可以直接使用接口名.常量名进行调用,final表示常量的值不可以修改。
public static final 数据类型 常量名 = 值;
//定义方法的语法,接口的方法定义,一定不要加上{},否则就出错。
public 返回值类型 方法名([参数类型 参数名,...]);
//接口的默认访问修饰符是public的。
返回值类型 方法名([参数类型 参数名,...]);
}
2.实现接口
实现接口的关键字是implements .
实现的语法格式:
public class 子类名 implements 父接口名{
}
接口的特性:要求子类必须实现接口中定义的所有方法(相当于方法重写)
用途:如果要求子类必须要完成某些功能,就可以定义一个接口,让子类去实现。
3.接口和类的区别
1.定义接口的关键字是interface,定义类的关键字是class
2.实现接口的关键字是implements,继承类的关键字是extends
3.接口中所有的方法和属性必须是公有的并且没有具体的实现,
类中定义的方法可以是private ,protected,public属性和方法,但是方法必须要有具体的实现。
4.接口可以继承接口,并且可以继承多个接口,类只能继承一个父类,但是可以实现多个接口。
5.接口不可以定义构造函数,类可以定义构造函数
6.接口不能用来创建对象,类可以用来创建对象
4.抽象类
定义抽象类的关键字是abstract class
抽象类是介于接口和类之间的一种类。
定义抽象类的格式:
public abstract class 抽象类名{
//抽象类中可以定义私有、受保护的、公有的属性、方法和构造函数。
//抽象类还可以定义抽象方法
public abstract 返回类型 方法名([参数类型 参数名,...]);
}
抽象类不可以用来创建对象。
5.监听器
监听器就是用来监听动作的方法。
实现整个监听的流程:接收监听的对象、监听方法、处理监听的对象
常用的监听器接口都位于java.awt.event包下,以Listener结尾的都是监听接口。
事例: 类的继承:窗体绘制皆继承于JFrame;
接口:监听器的运用
具体体现:qq窗体的绘制
import cn.netjava.login.LoginListener;
/**
* qq登陆界面
*
* @author Administrator
*
*/
public class Frame {
public static void main(String[] args) {
Frame f = new Frame();
f.showUI();// 下面要定义show方法
}
// 显示界面show方法
public void showUI() {
// 创建窗体
javax.swing.JFrame jf = new javax.swing.JFrame();
// 设置窗体
jf.setTitle("登陆框");
jf.setSize(321, 250);
jf.setResizable(false);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(2);
// 设置布局-绝对布局
jf.setLayout(null);
// 创建组件
// 1、图片(要有参数)
javax.swing.ImageIcon image = new javax.swing.ImageIcon(this.getClass()
.getResource("qq.jpg"));
javax.swing.JLabel myimage = new javax.swing.JLabel(image);
myimage.setBounds(0, 0, 321, 64);
jf.add(myimage);
// 创建"帐号"
javax.swing.JLabel myName = new javax.swing.JLabel("帐号:");
myName.setBounds(30, 74, 50, 25);
jf.add(myName);
// 创建文本框
javax.swing.JTextField txtName = new javax.swing.JTextField(20);
txtName.setBounds(95, 74, 120, 25);
jf.add(txtName);
// 创建“密码”
javax.swing.JLabel myPassword = new javax.swing.JLabel("密码:");
myPassword.setBounds(30, 115, 50, 25);
jf.add(myPassword);
// 创建密码输入框
javax.swing.JPasswordField txtPassword = new javax.swing.JPasswordField(
20);
txtPassword.setBounds(95, 115, 120, 25);
jf.add(txtPassword);
// 创建”注册新帐号"
javax.swing.JLabel myReg = new javax.swing.JLabel("注册新密码");
myReg.setBounds(230, 74, 90, 25);
jf.add(myReg);
// 创建”找回密码“
javax.swing.JLabel myReturn = new javax.swing.JLabel("找回密码");
myReturn.setBounds(230, 115, 90, 25);
jf.add(myReturn);
// 创建“登陆”
javax.swing.JButton myLogin = new javax.swing.JButton("登陆");
myLogin.setBounds(245, 180, 60, 25);
jf.add(myLogin);
// 创建“设置”
javax.swing.JButton myset = new javax.swing.JButton("设置");
myset.setBounds(30, 180, 65, 25);
jf.add(myset);
// 创建状态
javax.swing.JLabel mysit = new javax.swing.JLabel("状态:");
mysit.setBounds(40, 150, 50, 25);
jf.add(mysit);
javax.swing.JComboBox myBox = new javax.swing.JComboBox();
myBox.addItem("我在线上");
myBox.addItem("Q我吧");
myBox.addItem("离开");
myBox.addItem("忙碌");
myBox.addItem("请勿打扰");
myBox.addItem("隐身");
myBox.setBounds(90, 150, 60, 25);
jf.add(myBox);
// 创建勾选项
javax.swing.JCheckBox myCheck1 = new javax.swing.JCheckBox();
myCheck1.setBounds(160, 150, 25, 25);
jf.add(myCheck1);
javax.swing.JLabel myRem = new javax.swing.JLabel("记住密码");
myRem.setBounds(190, 150, 50, 25);
jf.add(myRem);
javax.swing.JCheckBox myCheck2 = new javax.swing.JCheckBox();
myCheck2.setBounds(200, 150, 25, 25);
jf.add(myCheck2);
javax.swing.JLabel myzi = new javax.swing.JLabel("自动登录");
myzi.setBounds(230, 150, 50, 25);
jf.add(myzi);
//创建一个LoginListener类的对象
LoginListener ll = new LoginListener(txtName,txtPassword);
//给事件源添加监听器方法以及给方法绑定事件处理类对象
myLogin.addActionListener(ll);
jf.setVisible(true);
}
}
/**
* 创建动作处理类
* @author Administrator
*
*/
//引入ActionEvent类和ActionListener接口
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LoginListener implements ActionListener{
//定义属性
private javax.swing.JTextField txtName;
private javax.swing.JPasswordField txtPassword;
//应为ActionListener为接口,要重写他的方法(动作处理方法)
public void actionPerformed(ActionEvent e){
//得到输入的账号和密码
String username =txtName.getText();
char [] pwd =txtPassword.getPassword();
String password = new String(pwd);
//如果账号与密码输入正确
if(username.equals("12345")&&pwd.equals("12345")){
//弹出消息框
javax.swing.JOptionPane.showMessageDialog(null,"输入正确,请等待...");
}else{
//弹出消息框
javax.swing.JOptionPane.showMessageDialog(null,
"你输入的账号和密码错误,请重新输入!");
}
}
//创建一个带参数的构造函数(即创建对象)
public LoginListener(javax.swing.JTextField txtName,javax.swing.JPasswordField txtPassword){
this.txtName =txtName;
this.txtPassword =txtPassword;
}
}
部分总结:
1、窗体上组件排布时可运用绝对布局、流式布局等多种布局方式;
2、窗体上大部分组件可从API文档下javax.swing包内找到,例如JLable,JCheckBox 等组件;
3、jf.setDefaultCloseOperation(3);表示点击窗体的关闭按钮时执行的方法。
3表示隐藏窗口并退出程序;
2表示如果存在父窗体,则隐藏窗体,不退出程序,如果没有父窗体,则隐藏窗体并退出程序;
1表示隐藏窗体但程序不退出;
0表示什么也不做。
4、在窗体绘制中,可用继承来代替实例化一个Frame对象:
public class Frame extends javax.swing.JFrame {
/**
* 主函数
*/
public static void main(String[] args) {
// 创建Frame的对象
Frame df = new Frame();
// 调用显示界面的方法
df.showUI();
}
/**
* 定义一个显示界面的方法
*/
public void showUI() {
// 设置窗体
this.setTitle("qq");
this.setSize(600, 500);
此时,设置窗体是用当前对象this,不用df;