学习笔记---第8章 类的封装,继承与多态(Java)

8.1封装

(1)封装的目的是提高安全性和简化编程
(2)Java访问权限修饰符一共有4种。

  1. 私有private
  2. 公有public
  3. 保护protected
  4. 默认default(没有修饰符)

(3)在面向对象编程法则里,用对象直接访问类中的属性是不允许的,为了避免这种情况发生,通常要将类中的属性封装,用关键词private声明为私有,从而保护起来。如果要给对象的属性赋值,则要获得这些私有属性的公共接口,这些接口的外在表现形式都是公有方法public。
通常,对属性值设置的方法命名为setXxx(),这类方法可统称为setter方法,获取属性值的方法被命名为getXxx(),这类方法可统称为getter方法
举个例子:


class MyCat
{
	private float weight;
	private float height;   //初始化私有属性 weight 和 height
	public MyCat(float weight, float height)   //在构造函数中初始化私有变量
	{
		setWeight(weight);
		setHeight(height);    //调用私有方法设置 weight 和 height
	}
	//通过 private 修饰符,封装setWeight方法和setHeight方法
	private void setWeight(float wt)
	{
		if(wt > 0) {weight = wt;}
		else
		{
			System.out.println("weight设置非法(应该>0).\n采用默认值10.");
			weight = 10.0f;
		}
	}
	private void setHeight(float ht)
	{
		if(ht > 0) {height = ht;}
		else
		{
			System.out.println("height设置非法(应该>0).\n采用默认值20.");
			height = 20.0f;
		}
	}
	
	public float getWeight()     //创建公有方法getWeight()作为与外界通信的接口
	{return weight;}
	public float getHeight()
	{return height;}
}
public class TestEncapsulation 
{
	public static void main(String[] args) 
	{
		MyCat aCat = new MyCat(12, -5);
		float wt = aCat.getWeight();
		float ht = aCat.getHeight();
		System.out.println("The weight of the cat is: " + wt);
		System.out.println("The height of the cat is: " + ht);
	}
}

程序运行结果:

8.2继承

Java中继承的格式如下:
class 子类名 extends 父类名
继承的限制:

  1. 不允许多重继承,但可以多层继承,即C类不能同时继承A类和B类,但可以B类继承A类,C类再继承B类。
  2. 从父类继承的私有成员,不能被子类直接使用,必须通过设置Setter和Getter方法间接操作。
  3. 子类进行对象实例化时,从父类继承而来的数据成员需要先调用父类的构造方法来初始化,然后用子类的构造方法来初始化本地的数据成员。使用super关键字。
  4. 被final修饰的方法不能被子类覆写实例,被final修饰的类不能再被继承。

8.3覆写(属性覆盖)

即子类定义了和父类之中相同名称的属性(Override)。
super调用父类的方法:

class Person
{
	String name;
	int age;
	public String talk()
	{
		return "I am " + this.name + ", I am " + this.age + " years old.";
	}
}

class Student extends Person
{
	String school;
	public Student(String name, int age, String school)
	{
		this.name = name;    //super.name = name
		this.age = age;     //super.age = age
		this.school = school;
	}
	public String talk()      //此处覆写Person中的talk方法
	{   //通过super.talk()调用父类talk()方法
		return super.talk() + " I am from " + this.school + "."; 
	}
}
public class Override 
{
	public static void main(String[] args) 
	{
		Student s = new Student("Lyuwalle", 22, "TJ");
		System.out.println(s.talk());
	}
}

运行结果:
I am Lyuwalle, I am 22 years old. I am from TJ.

8.4多态

在Java中,多态性分为两类:(1)方法多态性,体现在方法的重载与覆写上。通过传递不同的参数来令同一方法接口实现不同的功能。(2)对象多态性,体现在父、子对象之间的转型上。这其中分为向上转型和向下转型,向上转型可以自动完成,向下转型必须进行强制类型转换。

class Animal
{
	public void move()
	{
		System.out.println("动物移动!");
	}
}
class Fish extends Animal
{
	public void move()    //覆写了父类的move()方法
	{
		System.out.println("鱼儿游!");
	}
}
class Bird extends Animal
{
	public void move()
	{
		System.out.println("鸟儿飞!");
	}
}
class Horse extends Animal
{
	public void move()
	{
		System.out.println("马儿跑!");
	}
}
public class ObjectPoly 
{
	public static void main(String[] args) 
	{
		Animal a;      //声明了一个父类对象a,但没有去实例化它
		Fish f = new Fish();
		Bird b = new Bird();
		Horse h = new Horse();
		a = f;  a.move();    
		//先通过赋值操作,将子类对象向上转型为Animal类型,再调用Fish()的move()方法,输出“鱼儿游!”
		a = b;  a.move();
		a = h;  a.move();
	}
}
//简单来说,继承是子类使用父类的方法,而多态则是父类使用子类的方法,更为确切地说,多态是父类使用被子类覆盖地同名方法。

猜你喜欢

转载自blog.csdn.net/Lyuwalle/article/details/88424716
今日推荐