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可以用来修饰类,方法和属性,不能修饰构造方法.
封装(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可以用来修饰类,方法和属性,不能修饰构造方法.