who knows the truth。
Fork me on GitHub
返回顶部

关于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.在一个子类继承的时候,实际上会继承父类的所有操作,但是需要注意的是,对于所有非私有操作属于显示继承,而所有的私有操作属于隐式继承

img

//不允许直接访问非私有操作
//无参构造调用
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即可

posted @ 2021-01-19 17:11  no_sense  阅读(176)  评论(0编辑  收藏  举报
欢迎来到kanashimi的博客
pic
kanashimi
真理将引领我们