什么是继承
继承是面向对象三大特征之一(封装,继承和多态)
可以使得子类使用父类非私有属性和方法,还可以在子类中重新定义,追加属性和方法
继承的格式:
格式:public class 子类名 extends 父类名 { }
范例:public class Zi extends Fu { } // 在创建的时候直接继承
Fu:是父类,也被称为基类、超类
Zi:是子类,也被称为派生类
继承的好处之一:提高了代码的复用性
如下 直接创建一个类型,继承JFrame类也就是窗口类
两个内方法极大的缩小了构造方法内的复杂程度,其他的代码都放在两个新建的代码中
public class ChatDemo extends JFrame { public ChatDemo (){ initFrame();//自定义窗体初始化方法 paintView();//自定义绘制窗体方法 this.setVisible(true); }
public void paintView() { //聊天域 JTextArea jTextArea =new JTextArea(); jTextArea.setBounds(10,10,360,200); this.add(jTextArea); //聊天输入框 JTextField jTextField = new JTextField(); jTextField.setBounds(10,230,180,20); this.add(jTextField); //两个按钮 JButton btn1 =new JButton("发送"); btn1.setBounds(200,230,70,20); btn1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String msg = jTextField.getText().trim();//得到输入的内容并且去掉前后空格 jTextArea.append(msg+"\n");// 添加聊天信息到聊天域并且换行 jTextField.setText("");//删除聊天框内容 } }); JButton btn2 =new JButton("清空聊天"); btn2.setBounds(280,230,100,20); btn2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { jTextArea.setText(""); } }); this.add(btn1); this.add(btn2); } public void initFrame() { this.setSize(400,300); this.setDefaultCloseOperation(3); this.setAlwaysOnTop(true); this.setLocationRelativeTo(null); this.setLayout(null); }
继承的好处2:提高了代码的维护性
如创建两个类 student和teacher类,但是他们的成员属性跟方法都是都是一样的
那我们可以新建一个person类,设置成员属性跟方法,让Student跟Teacher去继承
以后如果需要添加或者修改,只需要修改一个Person类就可以了
继承的好处3:
让类与类产生了联系,是多态的前提
弊端
继承是侵入性的
降低了代码的灵活性
增强了代码的耦合性
耦合:代码与代码之间存在关联都可以称之为耦合
如删除父类一个方法,那么所以子类都没发使用了
什么时候使用继承
当类于类之间 存在相同(共性)内容 并产生了都是每种类型的关系,就可以考虑
继承的特点
java只 支持单继承 不支持多继承 但支持多层继承
一个子类只能拥有一个父类
多层继承:子类继承父类 父类继承爷类 爷类也可以继承子类
子类所有构造方法都会默认访问父类中的无参构造方法
子类在初始化之前,一定要先完成父类数据的初始化
子类在初始化之前,一定要先访问到父类的构造方法完成父类数据的初始化
系统在每一个构造方法中 默认隐藏了第一句代码 super() 去访问父类构造方法
所以在子类构造的时候可以灵活使用super();
我们编写的类 没有手动指定父类,系统也会自动继承Object类
继承的成员变量访问特点
先在子类局部范围 ,再子类成员范围,再父类成员范围
如果一定要使用父类 可通过 super.变量名 /方法名 调用
super 类似于this关键字
this代表本类对象的引用
super 代表父类存储攻坚的标识(可以理解为父类对象引用)
如果父类只有带参构造方法 没有空参构造方法那么就会报错
建议父类初始化时一定创建空参方法
或者子类可以通过super 手动调用父类的带参构造方法
this(); 跟super(); 都要只能放在构造方法的第一句 二者不能共存
this(); 就是调用本类的构造方法
方法重写
当子类需要父类的功能,,而功能主体又有自己特有的内容
且子类方法名跟父类一模一样
可以在子类中重写父类的功能 这样既沿袭父类的功能,又定义了类特有的内容
也就是在子类中重新写一个跟父类方法名一样的方法,内容中 可以调用父类原方法 可以再添加特有的内容
如
public void language(){
super.language();
System.out.println("中文")
}
注意事项
父类中私有方法不能重写
父类静态方法,子类必须通过静态方法进行重写
非静态则必须通过非静态方法进行重写
注意:静态方法不能被重写,如果子类中也存在一个方法声明一模一样的方法,可以理解为,子类将父类中同名的方法 隐藏 而不是方法重写
子类重写父类方法时,访问权限必须大于等于父类