Java类与对象及类的继承
一.类与对象
1.对象:对象是指一个具体的事物。举个例子:一朵粉红玫瑰。那么这朵粉红玫瑰就可以是一个对象。
2.类:类是对对象的抽象,用来描述对象的总的属性。例如:花。花可以当作一个类,是用来描述一类事物的,比如粉红玫瑰,百合等都可以归为花这个类。
3.类的定义:
public class <类名>{
//定义属性
<修饰词> <类型> <属性名>;
……
//定义方法
<修饰词> <返回类型> <方法名>(参数……){}
……
}``
属性可以理解为我们为描述一个对象的特征而定义的一些变量。
方法则可以理解为对这个类的操作。
其中,Java修饰词有四个:
public:公有的,其他类可以直接访问。
protected:受保护的,同一包下的类或继承该类的子类可以访问。
default(即不写任何修饰符的时候):作用同protected。
private:私有的,其他类不能直接访问,要通过该类的成员方法进行操作。
举个具体例子:
//定义花这个类
public class Flower {
//-----属性------
public String name;//花的名称
protected String color;//花的颜色
private float price;//花的市场价格
//-----方法-----
//获取花价格
public float getPrice() {
return price;
}
//设置花价格
public void setPrice(float p) {
price = p;
}
}
定义了一个简单的花类,name,color,price都是花这个类的属性,getPrice(),setPrice(float p)是这个类的方法(可以理解为C语言中的函数)。
public String name;//花的名称
public 即修饰词,表示这个是公有的,其他类可以直接访问,权限最大,String表示这个变量是字符串类型的,name则是变量名。
//获取花价格
public float getPrice() {
return price;
}
//设置花价格
public void setPrice(float p) {
price = p;
}
定义price变量时我们用得时private修饰词,所以其他类不能直接访问,所以我们定义两个成员方法来对其进行操作。
//获取花价格
public float getPrice() {
return price;
}
float表示返回值类型,利用它我们可以获取该类的私有变量price。
public void setPrice(float p) {
price = p;
}
这串代码让我们可以设置私有变量price的值。
二.类的继承
1.类的继承的格式:
public class <类名>(即子类或派生类) extends <父类名>(即父类或基类){
……
}
Java规定,一个类只能继承一个父类(当然每个类被创建时都默认继承一个Object类,这个类除外)。
子类可以继承父类的所有属性和方法。子类可以重写父类已用的方法。
例:
public class Person {
public String name;
public void eating() {
System.out.println("吃东西中");
}
public void sleeping() {
System.out.println("睡觉中");
}
}
Person父类,Student子类。
public class Student extends Person{
public void eating() {
System.out.println("喝汤中");
}
public void study() {
System.out.println("学习中");
}
}
Student 类重写了Person类的eating()方法。
public class Inter {
public static void main(String[] args) {
Student person = new Student();
person.eating();
person.sleeping();
person.study();
}
}
运行下列代码,输出
喝汤中
睡觉中
学习中
可知调用的eating()方法时Student类重写过的,而sleeping()方法是Student类从父类中继承过来的,Student本身没有,却能调用,这就是继承的好处,通过继承父类已有的东西,而不需要重新再写,可以提高效率,而当父类的一些东西不好用时,我们还可以重新定义,也可以覆盖父类的方法,来实现代码的灵活性。
2.关于向上转型(自动转型)
public class Inter {
public static void main(String[] args) {
Person person = new Student();
person.eating();
person.sleeping();
//person.study();该行代码会报错
}
}
我们可以用父类的类型去声明一个变量而用子类去创建它。
Person person = new Student();
而当我们调用方法时,会先去查找父类的方法,如果没有,则无法调用,上述代码中,Student中的study() 方法无法被调用,正因为父类中没有该方法,如果有,则看子类中是否有重新该方法,若有,则调用子类的方法,若没有,则调用的方法来自父类。
向上转型的应用:
当一个类方法的参数为类时,我们可以用继承了该类的派生类来充当该参数,避免了一个方法因为类的不同而针对其各子类都写一个一样的方法,这样提高了代码的灵活性和高效性。
举个例子:
JLabel jl = new JLabel("你好");
jf.add(jl);
JButton jb = new JButton("确定");
jf.add(jb);
图中JLabel类和JButton类均可以充当add()方法的参数,而该方法的原参数类型为:
public Component add(Component comp) {
addImpl(comp, null, -1);
return comp;
}
Component类,正因为JLabel类和JButton类都是Component类的子类,所以当作该参数来使用。
本人也是一个Java初学者,上述内容都是个人理解,可能包含很多错误和片面的想法,望网友们体谅,也欢迎各位大佬参与讨论和评论。