封装就是将对象的属性保护起来,只能通过类内部的方法来访问
可以在修改属性时做一些检验防止意外发生,提高安全性
封装好以后其他人只需要知道怎么调用,不用考虑内部的实现原理
private),使其不能被外部访问public)set方法来设置属性的值public)get方法来获取属性的值alt + insert后选择getter和setter

将set方法写在构造器中,可以保证初始化的安全
public class Homework {
private String password = "000000";
public Homework(String password) {
setPassword(password);
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
if(password.length() == 6){
this.password = password;
} else {
System.out.println("密码不是六位,默认密码为000000");
}
}
}
有些类中有很多相同的方法,但是又有一些不同的方法,这就造成了代码冗余。
将共同的部分抽离成父类(也叫基类,超类),让子类(也叫派生类)去继承可以解决这个问题。

使用extends关键字
父类
public class Student {
public String name;
public int age;
private float score;
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
public void info() {
System.out.println("姓名:" + name + " 年龄:" + age + " 分数" + score);
}
}
子类
//让pupil类继承student类
public class Pupil extends Student{
public void testing() {
// 这里用到了从父类继承的name属性
System.out.println("小学生" + name + "正在考小学数学");
}
public static void main(String[] args) {
Pupil pupil = new Pupil();
pupil.name = "xiaoming";
pupil.testing();
}
}
这里的score是私有属性,可以看到直接使用IDEA会报错

2. 子类必须调用父类的构造器完成父类的初始化,因为子类中有一个隐藏的无参的super()函数,super函数在子类构造器的最上面,会被默认调用。
3. 创建子类对象时,无论子类使用哪个构造器,都会默认调用父类的无参构造器,如果父类没有无参构造器,则必须指明使用父类的哪个构造器。
4. 如果希望使用父类的某一个构造器,则需要显式得调用。
5. super必须放在构造器的第一行。
6. super()和this()都只能放在第一行,因此两个方法不能共存。
7. 所有的类都是Object的子类,Object类是所有类的父类。(在IDEA中ctrl + H可以查看类之间的关系)。


super是父类的引用,类似于this是子类本身的引用。
使用super可以访问父类的属性、方法和构造器。

如果子类中的某个方法与父类(不一定是直接父类)中完全相同(方法名,返回类型,参数),则子类中的方法会覆盖掉从父类中继承来的方法。

题目要求

代码
// 定义父类
class Person {
private String name;
private int age;
// 父类的构造器
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void say() {
System.out.println("我的名字是:" + name +
" 我的年龄是:" + age);
}
}
// 定义子类
class Student extends Person{
private String id;
private float score;
// 子类的构造器
public Student(String name, int age, String id, float score) {
// 调用父类的构造器
super(name, age);
this.id = id;
this.score = score;
}
public void say() {
// 调用父类的say方法
super.say();
System.out.println("我的学号是:" + id +
"我的分数是:" + score);
}
public static void main(String[] args) {
Student student = new Student("小明",18,"123456",99);
student.say();
}
}
建立在封装和继承之上。
指的是方法和对象具有多种形态,父类的引用可以指向子类。
看不懂没关系,往下继续看就明白了。
举一个动物给动物喂食的案例,不再需要每种动物都重载一次方法,直接使用动物的父类和食物的父类来指向各个子类。
之后再添加新的子类时也不需要修改feed方法。

重写和重载体现多态
例如animal和cat是两个类
animal o = new cat();
定义的o编译类型为animal,运行类型为cat
两个对象(类)存在继承关系
父类 引用名 = new 子类()子类 引用名= (子类类型)父类对象instanceof,可以查看一个对象是否是某个类型或者其子类型(运行类型)例如:A instanceof B,检查A对象是否是B类型,或者A对象是否是B类型的子类型,返回布尔值
//Teacher类
public class Teacher extends Person{
public static void main(String[] args) {
// 向上转型 将Student和Teacher都存储在Person数组中
Person[] people = new Person[5];
people[0] = new Person("砂糖",12);
people[1] = new Student("刻晴",16,88.0);
people[2] = new Student("蜜莓",14,80.0);
people[3] = new Teacher("凯尔希",100,80000);
people[4] = new Teacher("钟离",5000,0);
for (int i = 0; i < people.length; i++) {
//instanceof 与 向下转型结合调用子类特有方法
if(people[i] instanceof Student){
Student student = (Student)people[i];
student.study();
} else if(people[i] instanceof Teacher){
Teacher teacher = (Teacher)people[i];
teacher.teach();
}
people[i].say(people[i].getAge(), people[i].getName());
}
}
private int money;
public Teacher(String name, int age, int money) {
super(name, age);
this.money = money;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
@Override
public void say(int age, String name) {
super.say(age, name);
System.out.println("我的工资是:" + money);
}
public void teach(){
System.out.println(getName() + "正在讲课");
}
}
//Student 类
public class Student extends Person{
private double score;
public Student(String name, int age, double score) {
super(name, age);
this.score = score;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public void say(int age, String name) {
super.say(age, name);
System.out.println("我的分数是:" + score);
}
public void study(){
System.out.println(getName() + "正在学习");
}
}
//Person 类
public class Person {
private String name;
private int age;
public Person(String name, int age) {
setAge(age);
setName(name);
}
public Person() {
}
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 say(int age,String name) {
System.out.println("我的名字是:" + name + "我的年龄是" + age);
}
方法定义的形参为父类,实参可以是子类。

//test类
public class test {
public static void main(String[] args) {
sass tom = new sass("tom", 2000);
less milan = new less("milan", 5000, 200000);
test test = new test();
test.show(tom);
test.show(milan);
test.testwork(tom);
test.testwork(milan);
}
public void show(css e){
System.out.println(e.getMoney());
}
// 形参参数为css父类,传入的实参为其子类
public void testwork(css e){
if(e instanceof less){
((less)e).manage();
} else if(e instanceof sass){
((sass)e).work();
} else {
System.out.println("自己检查哪里出错了");
}
}
}
//css类
public class css {
String name;
private int money;
public css(String name, int money) {
this.name = name;
this.money = money;
}
public int getMoney() {
return money * 12;
}
}
//sass类
public class sass extends css{
public void work(){
System.out.println("员工在工作");
}
public sass(String name, int money) {
super(name, money);
}
//方法重写
@Override
public int getMoney() {
return super.getMoney();
}
}
// less类
public class less extends css {
int bonus = 1000;
public less(String name, int money, int bonus) {
super(name, money);
this.bonus = bonus;
}
public void manage(){
System.out.println("领导在管理");
}
@Override
public int getMoney() {
return super.getMoney() + bonus;
}
}