很久没有更博了~
可能是自己感觉对java的学习越来越吃力了吧,然后就用生活学习上的一些琐事拿来当我没有更博的理由,未免显得太过冠冕堂皇了,但是转眼就是新的一个月了,应该给自己划上一个新的起点吧!哈哈所以到这里,我已经将接下来要狂补学习总结的想法暴露无疑咯凭借课堂的分组记忆+讲课笔记,接下来我将回忆第九周java的学习咯
-----------------此处作为闲聊分割-------------------
进入正题,第九周的学习呢主要是学习了该语言的封装(Java面向对象编程——封装)
***&首先,我们来认识一个单词: OOP:Object-Oriented Programming
这个单词的意思就是:面向对象编程
而面向对象具有三大特性,即:封装、继承、包装
现在,我们开始对封装的学习
一、类的封装(encapsulation)
一个类里,可以封装数据(静态 - static)和操作(动态 - dynamic),分别称为类的数据成员(data member)和方法成员(method member)。
要对学生进行管理,我们就要创建一个学生类,包含两个属性:姓名和人品,另外还包含一个自我介绍的方法。注意:要求学生的人品值在[1, 10]。
1、创建Student1类
包含两个公共属性:name和character,一个公共方法:introduceMyself()
package net.wek9封装;
/**
*功能:创建一个student类使用公共方法
* 作者:谯婷
*
*/
public class Student1 {
/**
* 姓名
*/
public String name ;
/**
* 人品
*/
public int character;
public void introduceMyself(){
System.out.println("Hello,我叫"+ name + ",我的人品值:" + character);
}
}
2、创建一个测试类TestStudent1
package net.wek9封装;
/**
* 功能:测试学生类Student1
* 作者:谯婷
* 日期:2019年4月23日
*/
public class TestStudent1 {
public static void main(String[] args) {
//创建一个Student1对象
Student1 student1 = new Student1();
//设置对象属性
student1.name = "张三丰";
student1.character = -1;
//调用对象方法
student1.introduceMyself();
}
}
看到这里的时候,你有没有觉得很迷呢?
其实很简单的,就相当于@
在student1中定义 了两个姓名、人品的属性,
再定义一个方法调用属性并输出。
此段代码不能直接运行,因为只是一个方法的封装;
然后在另一个相同的包目录下创建一个teststudent1的java文件,
用以测试student1中封装的关键值方法,
设置对象属性的时候要以“包名+.+属性”的格式,实现从键盘输入属性的具体值。
运行结果如下图所示:
显然这样做是不合理的。
应该把属性私有化,统一地提供访问私有属性的公共方法,包括设置与读取私有属性值。
3、创建Student2类
package net.wek9封装;
/**
* 功能:测试学生类Student2
* 作者:谯婷
* 日期:2019年4月23日
*/
package net.wek9封装;
public class Student2 {
/**
* 姓名
*/
private String name ;
/**
* 人品
*/
private int character;
/**
* 设置姓名
* @param name
*/
public void setName(String name){
this.name = name;
}
/**
*获取姓名
* @return 姓名
*/
public String getName(){
return name;
}
/**
* 设置人品
* @param character
*/
public void setCharacter(int character){
if(character >= 1 && character <= 10){
this.character = character;
}else{
System.err.println("人品值必须介于[1,10]之间!");
}
}
/**
*获取人品
* @return
*/
public int getCharacter(){
return character;
}
/**
* 自我介绍
*/
public void introduceMyself(){
System.out.println("Hello,我叫"+ name + ",我的人品值:" + character);
}
}
4、创建TestStudent2类
package net.wek9封装;
/**
* 功能:测试学生类Student2
* 作者:谯婷
* 日期:2019年4月23日
*/
public class TestStudent2 {
public static void main(String[] args) {
//创建一个Student2对象
Student2 student2 = new Student2();
//设置对象属性
student2.setName("杨过");
student2.setCharacter( 5);
//调用对象方法
student2.introduceMyself();
}
}
运行结果:
我们体会到了,通过将属性设置为private,确实可以保护数据属性,
但是却无法访问到这些私有属性,怎么办?
我们就要来修改Student2类,
针对每个私有属性,我们要提供一对方法,
用于设置和获取属性值,命名规范:setXXX()、getXXX()。
小结 - 封装的具体实现步骤
• 修改属性的可见性来限制对属性的访问。
• 为每个属性创建一对赋值方法和取值方法,用于对这些属性的访问。
• 在赋值和取值方法中,加入对属性的存取限制。
课堂练习:创建一个Animal类,包含三个私有属性:名字(name)、类别(category)和年龄(age),创建两个方法:自我介绍(introduceMyself)和走(walk),然后再编写测试类TestAnimal来测试。
或者利用菜单也行:
但是setAge方法需要对age把关,必须要大于0。
所以需要对生成的代码稍微修改
还有一个toString()方法,我们一般可以利用上述方法产生。
package net.wek9封装;
/**
* 功能:动物类
* 作者:谯婷
* 日期:2019.4.25
*/
public class Animal {
private String name;
private String category;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0){
this.age = age;
}else{
System.err.println("年龄必须大于0!");
}
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", category='" + category + '\'' +
", age=" + age +
'}';
}
public void introduceMyself(){
System.out.println("Hello,我叫"+ name + ",是" + category + ",今年我" + age + "岁了");
}
public void walk(){
System.out.println(name + "在行走");
}
}
创建测试类TestAnimal
代码如下:
package net.wek9封装;
/**
* 功能:测试动物类
* 作者:谯婷
* 日期:2019.4.25
*/
public class TestAnimal {
public static void main(String[] args) {
Animal animal1 = new Animal();
animal1.setName("欢欢");
animal1.setCategory("猫");
animal1.setAge(22);
animal1.introduceMyself();
animal1.walk(); }
}
四种访问控制级别
• public 公共的,最高的访问级别,类的public成员所有类的成员都可以访问。
• protected 受保护的,类的protected成员只能被该类的成员以及其子类成员访问。还可以被同一个包中其他类的成员访问。
• private 私有的,不对外公开,类的private成员只能被该类的成员访问,访问级别最低。
• 默认,类的成员什么修饰符都没有,又叫包修饰符,只有类本身成员和当前包下类的成员可以访问。
小结:
1、封装数据与操作
2、数据私有,提供getter与setter(IDEA提供了生成方法)
3、toString()自动生成
二、方法的重载
1、方法重载的特点
• 在同一个类中发生
• 方法名相同
• 参数列表不同(个数不同,顺序不同,类型不同)
2、实例演示方法重载
(1)创建Student3
package net.wek9封装;
public class Student3 {
private String name;
private int character;
/**
* 无参构造方法
*/
public Student3(){
System.out.println("无参构造方法被调用了!");
}
/**
*有参构造方法
* @param name
* @param character
*/
public Student3(String name,int character){
this.name = name;
this.character = character;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCharacter() {
return character;
}
public void setCharacter(int character) {
if(character >= 1 && character <= 10) {
this.character = character;
}else{
System.out.println("人品值必须介于[1,10]之间!");
}
}
public void introduceMyself(){
if(character >= 1 && character <= 10) {
System.out.println("Hello,我叫"+ name + ",我的人品值:" + character);
}
}
public void feed(Cat cat){
System.out.println( name + "喂养了一只猫,名叫" + cat.getName()+",现在" + cat.getAge() + "岁了。");
cat.eat();
}
public void feed(Dog dog){
System.out.println( name + "喂养了一只狗,名叫" + dog.getName()+",现在" + dog.getAge() + "岁了。");
dog.eat();
}
public void feed(Bird bird){
System.out.println( name + "喂养了一只鸟,名叫" + bird.getName()+",现在" + bird.getAge() + "岁了。");
bird.eat();
}
}
(2)创建三个类:Cat、Dog、Bird,每个类都要求两个属性:名字和年龄,还包含一个吃的方法(eat())。
package net.wek9封装;
public class Cat {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println(name + "爱吃鱼");
}
}
package net.wek9封装;
public class Dog {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println(name + "爱吃骨头。");
}
}
package net.wek9封装;
public class Bird {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println(name + "爱吃虫。");
}
}
(3)创建TestStudent3类
package net.wek9封装;
/**
* 功能:测试Student3类
* 主要测试重载现象
* 作者:谯婷
* 日期:2019.4.28
*/
public class TestStusdent3 {
public static void main(String[] args) {
//实例化Cat类
Cat cat = new Cat();
cat.setName("欢欢");
cat.setAge(2);
//实例化Dog类
Dog dog = new Dog();
dog.setName("蕊蕊");
dog.setAge(3);
//实例化Bird类
Bird bird = new Bird();
bird.setName("零零");
bird.setAge(1);
//实例化Student3类
Student3 student3 = new Student3();
student3.setName("函子");
student3.setCharacter(10);
// student3.setName("函子");
// student3.setCharacter(10);
//自我介绍
student3.introduceMyself();
//调用喂养方法
student3.feed(cat);
student3.feed(dog);
student3.feed(bird);
//实例化Student3类
Student3 student1 = new Student3("郭靖",10);
//自我介绍
student1.introduceMyself();
//调用喂养方法
student1.feed(cat);
student1.feed(dog);
student1.feed(bird);
}
}
运行结果:
使用两种方法实例化对象,得出的结果就是两种