关于java的继承
Java:关于继承
1.继承的概念
Java是面向对象设计的语言(oop:Object Oriented Programming),oop主要优点是代码的模块化设计与代码的重用。如果只是依靠单一的类和对象概念无法实现这些设计要求。
利用继承可以实现类的重用性。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
2.继承的基本实现
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
class 父类 {
}
class 子类 extends 父类 {
}
//继承基本实现
class Person{
private String name;
private int age;//封装
//setter,getter 方法实现
}
class Student extends Person{
//在子类中不定义任何类型
}
public class javaDemo{
piblic static void main(String [] args)
{
Studen stu = new Student();//new开辟空间,实例化对象
stu.setname("张三")//父类定义
stu.setage(18)//父类定义
System.out.println("名字:"+stu.getname+" 年龄:"+stu.getage);
}
}
继承实现的主要目的让子类可以重用父类中的结构,同时可以根据子类的功能进行结构扩充。
//继承基本实现
class Person{
private String name;
private int age;//封装
//setter,getter 方法实现
}
class Student extends Person{
private String school;
public void setSchool(String school)
{
this.school = school;
}
public String getSchool()
{
return school;
}
}
public class javaDemo{
piblic static void main(String [] args)
{
Studen stu = new Student();//new开辟空间,实例化对象
stu.setname("张三");//父类定义
stu.setage(18);//父类定义
stu.setSchool("THU");//子类扩充方法
System.out.println("名字:"+stu.getname()+" 年龄:"+stu.getage()+" 学校:"+stu.getSchool());
}
}
Student 类在已有基础上扩充了新的属性与方法
还有一些例子.
//企鹅类
public class Penguin {
private String name;
private int id;
public Penguin(String myName, int myid) {
name = myName;
id = myid;
} //双参构造方法
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "号" + name + ".");
}
}
//老鼠类
public class Mouse {
private String name;
private int id;
public Mouse(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "号" + name + ".");
}
}
代码存在重复了,导致后果就是代码量大且臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),所以要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成 一个父类。
//公共父类
public class Animal {
private String name;
private int id;
public Animal(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "号" + name + ".");
}
}
//企鹅类
public class Penguin extends Animal {
public Penguin(String myName, int myid) {
super(myName, myid); //super()作用表示在子类中明确调用父类的无参构造
//如果不写会默认调用父类构造。对于super()构造调用的语句只能够在子类的构造方法中定义,必须放在首行。
}
}
//老鼠类
public class Mouse extends Animal {
public Mouse(String myName, int myid) {
super(myName, myid);
}
}
//无参构造调用
class Person{
public Person()
{
System.out.println("调用父类构造实例化对象");
}
}
class Student extends Person{
public Student()
{
System.out.println("调用子类构造实例化对象");
}
}
public class JavaDemo
{
public static void main(String [] args)
{
Student stu = new Student();
}
}
子类对象实例化前一定会实例化父类对象,实际上这个时候就相当于在子类的构造方法里面隐含一个super()形式
class Student extends Person{
public Student()
{
super();//明确调用父类构造,不编写时会默认找到父类无参构造
System.out.println("调用字类构造实例化对象");
}
}
//明确调用父类指定构造方法
class Person{
private String name;
private int age;
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
}
class Student extends Person{
private String school;
public Student(String name,int age,String school)
{
super(name,age);
this.school = school;
}
}
public class Javademo{
public static void main(String [] args)
{
Student stu = new Student("张三",19,"THU");
}
}
本程序Person父类不再明确提供无参构造方法,这样在子结构中就必须通过super()明确指明要调用的父类构造,并且该语句在子类构造方法的首行。
3.关于super()
直接看代码
//无参构造调用
class Person{
private String name;
private int age;
/*public Person()
{
System.out.println("父类无参构造调用");
}*/
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
}
class Student extends Person{
public Student()
{
//super();
System.out.println("调用子类构造实例化对象");
// System.out.println(name+age);
}
}
public class JavaDemo
{
public static void main(String [] args)
{
Student stu = new Student();
}
}
Error:Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Implicit super constructor Person() is undefined. Must explicitly invoke another constructor.
大概意思是:
隐式超类构造函数Person()未定义。必须显式调用另一个构造函数。
如果去掉注释,改成下面这样
//无参构造调用
class Person{
private String name;
private int age;
public Person()
{
System.out.println("父类无参构造调用");
}
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
}
class Student extends Person{
public Student()
{
//super(); 是否去掉这一句结果一样
System.out.println("调用子类构造实例化对象");
// System.out.println(name+age);
}
}
public class JavaDemo
{
public static void main(String [] args)
{
Student stu = new Student();
}
}
这样就能运行了,并且调用的是父类无参构造方法
也就是说,父类没有明确的无参构造
如果是下面这样
//无参构造调用
class Person{
private String name;
private int age;
public Person()
{
System.out.println("父类无参构造调用");
}
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
}
class Student extends Person{
public Student()
{
System.out.println("调用子类构造实例化对象");
// System.out.println(name+age);
}
}
public class JavaDemo
{
public static void main(String [] args)
{
Student stu = new Student();
}
}
如果去掉父类的双参数构造
//无参构造调用
class Person{
private String name;
private int age;
}
class Student extends Person{
public Student()
{
super();
System.out.println("调用子类构造实例化对象");
// System.out.println(name+age);
}
}
public class JavaDemo
{
public static void main(String [] args)
{
Student stu = new Student();
}
}
这样也能运行
我的理解是 没写super()时,默认找到父类的无参构造,如果此时父类编写了含参构造,但未编写无参构造,无法通过编译。只要显示编写无参构造就行。
同时注意:this()出现了super()也不能出现了
4.继承限制
1.一个子类只能继承一个父类,存在单继承局限
Java之中只允许多类继承,不允许多重继承
2.在一个子类继承的时候,实际上会继承父类的所有操作,但是需要注意的是,对于所有非私有操作属于显示继承,而所有的私有操作属于隐式继承
//不允许直接访问非私有操作
//无参构造调用
class Person{
private String name;
private int age;
public void setName(String name)
{
this.name = name;
}
public void setage(int age)
{
this.age = age;
}
public int getage()
{
return this.age;
}
public String getName() {
return this.name;
}
}
class Student extends Person{
private String sex;
public Student(String name,int age,String sex)
{
setName(name);
setage(age);
this.sex = sex;
}
public String getInfo() {
return "姓名:"+getName()+"\n"+"年龄:"+getage()+"\n"+"性别:"+sex;
}
}
public class JavaDemo
{
public static void main(String [] args)
{
Student stu = new Student("张三",19,"male");
System.out.println(stu.getInfo());
}
}
5.关于eclipse补全代码
最近用了eclipse和intellij IDEA ,感觉eclipse还是有点不足。
补全代码
1.选择Eclipse菜单条中的Windows菜单下的Preferences项
2.在左侧找到“Java” -> “Editor” -> “Content Assist”
3.在右侧“Auto Activation”项目下找到“Auto activation triggers for Java:”(可以看到设置框中默认的只有 “.” ,这就是为什么默认只有点“.” 可以触发自动补全窗口了)
4.在框中点”.”后输入你想要的触发自动补全的字母(中间不需要隔开,挨着依次键入即可),如:“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.”,这样写代码时输入任意的大小写字母均会触发自动补全窗口弹出
5.输入完后确定OK即可