BluemSun 一预
封装
面向对象编程的核心思想之一就是将数据和对数据的操作封装在一起。通过抽象,即从具体的实例中抽取出共同的性质形成一般的概念,比如说,“类”。
类是一般的概念,所以class可以声明对象,对象即是具体的实例
共同的性质体现在数据和对数据的操作上,即对象的属性和行为
我们来看一下 java 中类的基本结构
class 类名{
成员变量;
方法;
}
成员变量即是数据,方法便包含对成员变量(数据)的操作。
成员变量
实例变量和类变量
class people{
int x;//实例变量
static y;//类变量
}
方法
构造方法
创建对象
class people{
int x;
int y;
people(int a,int b){//无类型
x=a;
y=b;
}
}
public class Example{
public static void main(String []args){
people P1;
P1 = new people(100,100);
}
}
如果类中没有编写构造方法,则系统默认有一个无参数,无语句的构造方法,平时我们经常使用默认的构造方法
people P2;
P2 = new people();
此处请忽略上文中作者编写的构造方法,当有构造方法时,系统不提供默认的构造方法
构造方法可以有多个,此处我觉得可以体现出一种多态
不同构造方法需保证参数不同
方法重载与此有点类似,也可以体现多态
方法重载:在一个类中可以有多个方法具有相同的名字,但这些方法的参数须不同
实例方法与类方法
class people{
int f(){
return 0;//实例方法
}
static void speak(){
System.out.println("这是类方法!")
}
}
接下来回到数据和对数据的操作上
在我们使用对象时,对象操作自己的变量体现对象的属性,对象调用类中的方法体现对象的行为,类中的方法可以操作成员变量体现封装。
那这些操作调用可以做到哪种程度呢?
受限于访问权限
先列一个访问权限从高到低的顺序:
public protected 友好的 private
声明大同小异,在成员变量前或方法前添加相应关键字即可
具体程度参照了一位学长的图
继承
继承是一种由已有的类创建新类的机制。利用继承,可以先定义一个共有属性的一般类,根据该一般类再定义具有特殊属性的子类,子类继承一般类的属性和行为,并根据需要增加它自己的新的属性和行为。
由继承得到的类称为子类,被继承的类称为父类。
使用extends关键字来定义子类
class 子类名 extends 父类名{
...
}
成员变量的隐藏
当子类和父类定义的成员变量的名字相同时(类型可以不同),就会发生成员 变量的隐藏,特点如下。
子类对象以及子类自己定义的方法 操作 与父类同名的成员变量是指子类重新声明的这个成员变量
子类对象仍然可以 调用从父类继承的方法 操作 被子类隐藏的成员变量
子类继承的方法可以操作子类继承和隐藏的成员变量,不可以操作子类新声明的成员变量。子类新定义的方法可以操作子类继承和子类新声明的成员变量,但无法操作子类隐藏的成员变量
方法的重写
子类 通过重写可以隐藏已继承的方法
方法重写后,父类的方法就被隐藏,重写方法既可以操作继承的成员变量、调用继承的方法,也可以操作子类新声明的成员变量、调用新定义的其他方法,但无法操作被子类隐藏的成员变量和方法。
这里举一个在实际中遇到的例子
class Father{
int age;
void speak(){
System.out.println("I am father");
}
}
class Son extends Father{
int age;
void helpSetAge(int x){
super.age = x;
}
void speak(){
System.out.println("I am son");
}
void helpSpeak(){
super.speak();
}
}
public class example{
public static void main(String []args){
Father father=new Father();
Son son=new Son();
son.age=18;//隐藏父类同名的成员变量
son.helpSetAge(44);
System.out.println(father.age);
System.out.println(son.age);
son.speak();
son.helpSpeak();
}
}
我以为的输出:
44
18
I am son
I am father
实际的输出:
0
18
I am son
I am father
错误的原因用内存分配很好解决
原因就是忽略了第一个age。
多态
目前还没学到,但方法重写可以体现多态的特性。父类的某个方法被子类重写时可以产生自己的功能行为。
总结
预习的比较糟糕,一是时间的投入不够二是学习重点不明确三是学习的比较肤浅,四是缺少练习。下次预习会以网课为主,并保证足够的练习来理解学习到的内容。
送一句话给我自己吧,学编程的你再菜也是假的,有自信的人才是最帅的,加油。
非常感谢在配置环境中帮助我的学长学姐和问问题时帮助我的学长和群友。