Java 封装 继承

1.封装

封装(Encapsulation):是类的三大特征之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问.简而言之就是隐藏对象的属性和实现细节,仅对外提供公共访问方式.

封装的具体步骤:修改属性的可见性来限制对属性的访问;为每个属性创建一对赋值(setter)方法和取值(getter)方法,用于对这些属性的存取;在赋值方法中,加入对属性的存取控制语句.

封装的好处主要有:隐藏类的实现细节;让使用者只能通过程序员规定的方法来访问数据;可以方便的加入存取控制语句,限制不合理操作.

封装时的权限控制符区别如下:

private:成员变量和方法只能在类内被访问,具有类可见性.

default:成员变量和方法只能被同一个包里的类访问,具有包可见性.

protected:可以被同一个包中的类访问,被同一个项目中不同包中的子类访问.

public:可以被同一个项目中所有类访问,具有项目可见性,这是最大的访问权限.

举例:

Penguin类和Dog类图


封装代码:

public class Dog

{

/*

* 封装演示

* */



//私有化属性

private Stringname;

private Stringsex;

private Stringcolor;



//封装字段

public StringgetName()

{

returnname;

}

public voidsetName(String name)

{

this.name = name;

}

public StringgetSex()

{

returnsex;

}

public voidsetSex(String sex)

{

this.sex = sex;

}

public StringgetColor()

{

returncolor;

}

public voidsetColor(String color)

{

this.color = color;

}

}



Penguin类同理

2.继承

语法:

修饰符SubClass extends SuperClass{

//类定义部分

}

在java中,继承通过extends关键字来实现,其中SubClass称为子类,SuperClass称为父类,基类,或超类.修饰符如果是public,该类在整个项目中可见;不写public修饰符则该类只在当前包可前;不可以使用private和protected修饰符.

继承(Inheritance):是java中实现代码重用的重要手段之一.java中只支持单继承,即每个类只能有一个父类.继承表达的是isa的关系,或者说是一种特殊和一般的关系.

在java中,所有的java类都直接或间的接的继承了java.lang.long.Object类.Object类是所有java类的祖先.在定义一个类时,没有使用extends关键字,那么这个类直接继承Object类.

在java中,子类可以从父类中继承的有:

继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里.

继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里.

子类无法继承父类的有:

无法继承private修饰的属性和方法

无法继承父类的构造方法

如果从父类继承的方法不能满足子类的需求,在子类中可以对父类的同名方法进行重写(覆盖),以符合要求.

抽象出Dog类和Penguin类和父类Pet类(Pet类为抽象类,不能被实例化)




/*

* Dog和Penguin的父类Pet,而Pet对象是没有意义的,只是抽象出来的一个概念,国此给Pet类添* 加abstract修饰符,让其成为一个抽象类,抽象不能被实例化.

* */



public abstract class Pet

{

//私有化属性

private Stringname;

private Stringsex;



//封装字段

public StringgetName()

{

returnname;

}

public voidsetName(String name)

{

this.name = name;

}

public StringgetSex()

{

returnsex;

}

public voidsetSex(String sex)

{

this.sex = sex;

}



//无参构造方法

public Pet()

{



}



/*

* 有参构造方法

* @param name 名称

* @param sex 性别

*

* */

publicPet(String name, String sex)

{

this.setName(name);

this.setSex(sex);

}



//Pet类的抽象方法eat(),抽象方法必需被子类重写

publicabstract void eat()



//final修饰的方法不能被子类重写

publicfinalvoid println()

{

//方法体…

}



}



//狗继承动物类

class Dog extends Pet

{

private Stringcolor;



//封装字段

public StringgetColor()

{

returncolor;

}



public voidsetColor(String color)

{

this.color = color;

}



//无参构造方法

public Dog()

{



}



//有参构造方法

publicDog(String name, String sex, String color)

{

//传参到父类的构造方法,此处不能用this.name = name.....

super(name,sex);



//调用setColor()方法给属性color赋值

this.setColor(color);

}



//重写父类eat()方法

public void eat()

{

//方法体....

}

}



//企鹅继承动物类

class Penguinextends Pet

{

private double weight;



public doublegetWeight()

{

returnweight;

}



public voidsetWeight(double weight)

{

this.weight = weight;

}

//重写父类eat()方法



public void eat()

{

//方法体….



}



}



//测试类Test

class Test

{

public static voidmain(String[] args)

{

String name= "dog1";

String sex ="男";

String color= "red";



//实例化对象

Dog dog = new Dog();



dog.setName(name); //通过从父类处继承来的方法设置dog的属性name

dog.setSex(sex);



//通过有参构造函数实例化对象

Dog dog1 = new Dog("dogName","man", "black");



//调用eat()方法,此方法被重写了

dog1.eat();

}

}

继承条件下构造方法调用规则如下

如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造 方法.在这种情况下写不写super()语句效果都是一样.

如果子类的构造方法中通过super显示调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法.

如果子类的构造方法中通过this显示调用自身的其他构造方法,在相应 构造方法中应用以上两条规则.

特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止.

abstract和final是功能相反的两个关键字,abstract可以用来修饰类和方法,不能用来修饰属性和构造方法.final可以用来修饰类,方法和属性,不能修饰构造方法.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值