持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天
封装
封装和隐藏
面向对象的三个特征是,封装,继承,多态。
封装的含义简单来说就是将该隐藏的隐藏起来,将该暴露的暴露出来。而这些功能都是需要java提供的访问控制符来完成的。
为了实现比较好的封装:
->将对象的成员变量和实现细节隐藏起来
->把方法暴露出来,让方法来控制对这些成员变量进行安全的访问和操作
使用访问控制符
java提供了三个访问控制符,private,protected,public来对成员变量,方法和构造器进行修饰。另外如果不加访问控制符的话,访问控制符为default。访问控制级别按照private,default,protected,public进行排序。
- private(当前类访问权限):只能在类的内部被访问
- default(只有同一个的包访问权限*):包直译过来就是package,因为在命名的过程中经常会出现重名的情况。所以出现了package这个概念
- protected(子类访问权限):
- public(公共访问权限):最宽松的访问级别
package包
package lee;
public class Arraytest
{
public static void main(String[] args) {
System.out.println("hello world");
}
}
则在这个packag lee下建立的类都在lee这个软件包下,不会出现和其他类重名的情况。
继承
继承最大的好处就是可以代码复用
方法重载(overload)
重载是发生在同一个类的多个同名方法之间的
方法重载(Overload)指方法名相同,形参列表不同的方法。Java 通过参数类型来判断该方法是否为重载方法。修饰符不同或返回值类型不同的方法不能称为方法重载!
Java的继承通过extends关键词来实现,实现继承的类是子类(例如苹果),被继承的类被称为父类(也叫基类,超类)(例如水果)。因为子类是一种特殊的父类,所以父类包含的范围总比子类包含的范围要大,所以可以认为父类是大类,子类是小类。
语法格式如下
修饰符 class 子类名 extends 父类名
{
//类的定义部分
}
public class Fruit {
public double weight;
public void info() {
System.out.println("我是一个水果!重"+weight+"g");
}
}
public class Apple extends Fruit {
@Override
public void info() {
System.out.println("我变红了");
}
public static void main(String[] args) {
var a=new Apple();
a.weight=56;
a.info();
}
}
如果父类跟子类的方法名相同,则执行子类里的方法.@Override是方法重写的标志-
如果定义一个java类的时候没有指定这个类的直接父类,那么这个类默认扩展为java.lang.Object类.
多态
多态是指同一个类型的多个实例,在执行同一个方法时,呈现出多种行为特征。
public class Bird {
protected void fly () {
System.out.println("鸵鸟地上跑");
}
}//定义了一个Bird的父类
public class Sparrow extends Bird{
@Override
protected void fly() {
System.out.println("麻雀天上飞");
}
}//定义了一个Sarrow的子类
public class Ostrich extends Bird{
}//定义了一个Ostrich的子类
public class Main {
public static void main(String[] args) {
Bird b1=new Sparrow();
Bird b2=new Ostrich();
b1.fly();
b2.fly();
}
}//main函数
由此可见,在同样一个fly的方法,显现出来了不同的结果,这就被称为多态。
变量的类型
编译时类型:声明该变量时指定的类型。在 Java 程序编译阶段,Java 编译器只认编译时类型。当调用子类有而父类没有的方法,且使用向上转型时,编译器将报错。
运行时类型:该变量实际所引用的类型。
向上转型
子类的对象可以直接赋值给父类变量,其可以自动完成。
构造器重载要求形参列表不同
Super限定
使用super来调用重复的方法的示例如下,同样也可以用super来调用父类里面重复命名的变量:
s
class Fruit {
public double weight;
int b=6;
public void info() {
System.out.println("我是一个水果!重"+weight+"g");
}
}//-------------------------------------------父类
public class Apple extends Fruit {
@Override
public void info() {
System.out.println("我变红了");
}
protected void callinfo() {
super.info();//可以用super调用父类中重复命名的方法
System.out.println(super.b);
}
public static void main(String[] args) {
var a=new Apple();
int b=7;
a.weight=56;
a.info();
a.callinfo();
}
}-----------------------------------------子类