子类不会继承父类的构造方法,在子类的构造方法中可使用super(参数列表)调用父类的构造方法。
class Person
{ String name;
int age;
public Person();
public Person(String name,int age)
{ this.name=name;
this.age=age;
}
public void getInfo()
{ System.out.println("name="+name+",age="+age);}
}
class Student extends Person
{ public String school="unknow"
public Student()
{ super();}
public Student(String name,int age)
{ super(name, age)}
public Student(String name,int age,String school)
{ this(name,age); //此处用this 调用其它的构造函数 public Student(String name,int age)
// super(name,age); 此处用super就没有意义了
this.school=school;
super.getInfo(); //调用父类的getInfo()
}
public void getInfo() //重写父类中的方法
{ System.out.println("school="+school+",name="+name+",age="+age)}
public void study()
{ }
}
// 1.super()和this()调用语句不能同时在一个构造函数中出现
// 2.super()和this()调用语句只能作为构造函数中的第一句出现
class TestStudent
{ public static void main(String[] args)
{ Student st=new Student("zhangshan",20,"清华大学")
st.getInfo()
}
}
-----------------------
final用法
1.final 加在类前这个类不允许被继承
2.final 加在成员变量前,成员变量为常量,不允许再被赋值. (1)final String x="abc"; (2) final String x;
x="abc" //x="abc"必须放在构造函数中,而且重载的构造函数都得写上x="abc";
3.方法被定义为final,在子类中方法就不允许被复盖,只能继承
static 作用:用static定义的变量,可不用创建对象直接用类名进行调用 Abc.x
class Abc{
public static String x="abc"
}
class Abc{
public static final String x="abc"
public Abc(){ x="abc" } //错,因为x已经被定义成静态的了,所以final定义的常量就不能在构造函中赋值了,必须在定义时初使化。
}
System.out.println (Float.MAX_VALUE);打印出最大的浮点小数
---------------------------
抽象类(abtract)
java中可以定义一些不含方法体的方法,它的方法体的实现交给该类的子类根据自己的情况去实现,这样的方法就是抽象方法,包含抽象方法的类就叫抽象类。
--抽象类必须用abstract关键字来修饰;抽象方法也必须用abstract来修饰。抽象类中所有的类必须为抽象的方法
--抽象类不能被实例化,也就是不能用new关键字去产生对象。
--抽象方法只需声明,而不需实现。
--含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。
abstract class A
{ private int i=1; //在抽象类中可以定义变量
abstract int aa(int x,int y);
abstract void bb();
public void cc() //在抽象类中可以定义一般的方法
{System.out.println(i);}
}
class B extends A
{ int aa(int x,int y){ return 1; } //方法中必须有一个反回值
void bb(){}
public static void main(String[] args)
{ B b=new B();
System.out.println(b.aa(1,2));
b.cc();
}
}
接口(interface)
如果一个抽象类中的所有方法都是抽象的,我们就可以将这个类用另外一种方式来定义,也就是接口定义。接口是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
--接口中的成员都是public访问类型的。接口里的常量默认是用public static final标识的,所以接口中的变量,都是全局静态常量。
--我们可以定义一个新的接口用extends关键字去继承一个已有的接口
--我们也可以定义一个类用implements关键字去实现一个接口中的***所有方法***(包括这个接口的父接口中的方法)
----我们还可以去定义一个抽象类用implements关键字去实现一个接口中定义的***部分方法***。
-- 一个类可以继承一个父类的同时,实现一个或多个接口,extends关键字必须位于implements关键字之前。
interface Runner
{ public static final int ID=1;或 int ID=1 // 定义常量,可将public static final 省略,定义的也是常量,因为接口中只能定义常量。
void run();
}
interface Animal extends Runner //继承Runner的接口
{ void breathe();
}
class Fish implements Animal
{ public void run(); //因为接口里声明的类默认是public,而在继承时子类必须比父类的访问权限要高,所以不能直接写void run(),如果不写public编绎时会出错。
{ System.out.println("fish is swimming");
}
public void breathe()
{ System.out.println("fish is bubbling");
}
public static void main(String[] args)
{ Fish f=new Fish();
int j=0;
j=Runner.ID; //去引用Runner中的常量id,因为id默认是static型的,所以用Runner直接调用。
j=f.ID;
j=Fish.ID; //因为Fish类,继承父类,所以可以这样的引用
f.iD=2; //这句错,因为id是常量,不能赋值
}
}
abstract class LandAnimal implements Animal //因为LandAnimal没有继承Animal的所有方法,所以在类前必须声明为抽象类。
{ public void breathe(){}; //?????有一个问题,这样定义一个类以后,因为是抽象类不能定义对象,然而作一个这个类的继承以后,编译出错,还有抽象类里面为什么加{},原程序在我的文档中,Aaa.java
} //问题解决了,抽象类的确不能创建对象,这没错,而要是继承这个类,前面的所有继承都须要被重写,而前面说到的{}则是必须要加到里面的,一个抽象类继承一个接口,抽象类中的方法必须加{},下面写一个继承它的程序,但要是把它再定义成抽象方法,可以这样写,abstract public void breathe() ;
class LAL extends LandAnimal
{ public void breathe(){
System.out.println("hhhhhhhhhhhhhhhhh");
}
public voic run(){}; //子类继承父类是抽象类或接口必须继承父类的所有的方法
} // 这样就没问题了
class Student extends Person implements Runner //假设前面有个Person类,这个就是即继承Person这个类,而且还实现了implements这个接口,但extends必须在implements的前面.
{ public void run();
}
interface Flyer
{ void fly();}
class Bird implements Runner,Flyer //一个类可以同时继承多个接口
{ public void run(){}
public void fly(){}
}