创建一个Student类
public class Student { //属性私有,无法直接操作这些属性 private String name; private int age; private char sex; private int id; //set/get是提供给外部操作这些属性的方法, //alt+insert ---》生成 getter和setter 可以根据属性自动生成set/get方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } //安全检查,设置默认值 public void setAge(int age) { if(age<0 || age>150){ this.age = -1; }else{ this.age = age; } } public int getId() { return id; } public void setId(int id) { this.id = id; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } }
主程序类Application
public class Application { public static void main(String[] args) { Student s1 = new Student(); System.out.println(s1.getName()); //null s1.setName("zhangsan"); System.out.println(s1.getName()); //zhangsan s1.setAge(70); System.out.println(s1.getAge()); //70 s1.setAge(180); System.out.println(s1.getAge()); //-1 } }
最后,我们简单描述下封装的作用
扩展:修饰符 public>protected>default>private
首先定义一个Person类
//父类 public class Person { public int money = 1_0000; public void say(){ System.out.println("说话"); } }
然后,定义一个Student类,继承于Person类
//子类,继承父类的所有方法和属性 public class Student extends Person{ }
最后,主程序类Application
public class Application { public static void main(String[] args) { Student s1 = new Student(); s1.say(); //说话 System.out.println(s1.money); //10000 } }
这里父类中的属性是public,但一般的情况下应该设置为private(封装),所以我们要进行一下修改
Person类
public class Person { //public int money = 1_0000; //若设置为private,子类不能直接操作该属性,但可以通过set/set方法进行操作 private int money = 1_0000; public void say(){ System.out.println("说话"); } public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } }
主程序类
public class Application { public static void main(String[] args) { Student s1 = new Student(); s1.say(); //说话 // System.out.println(s1.money); //10000 System.out.println(s1.getMoney()); //10000 } }
Person类
//父类 public class Person { public String name = "zhangsan"; public void print(){ System.out.println("person"); } }
Student类
//子类 public class Student extends Person { private String name = "lisi"; public void print(){ System.out.println("student"); } public void test1(){ System.out.println(name); //lisi System.out.println(this.name); //lisi System.out.println(super.name); //zhangsan } public void test2(){ print(); //student this.print(); //student super.print(); //person } }
主程序类
public class Application { public static void main(String[] args) { Student s1 = new Student(); s1.test1(); System.out.println("======================="); s1.test2(); } }
注意点:
看不懂的去看原视频:B站狂神说
我们先看一下非重写的情况,B类
public class B { public static void test(){ System.out.println("B==>test"); } }
A类
public classA extends B{ public static void test(){ System.out.println("A==>test"); } }
主程序类
public class Application { public static void main(String[] args) { A a = new A(); a.test(); //A==>test B b = new A(); b.test(); //B==>test } }
把static去掉,重写test方法,B类
public class B { public void test(){ System.out.println("B==>test"); } }
A类
public class A extends B{ // public void test(){ // System.out.println("A==>test"); // } //重写 @Override //注解,有功能的注释 public void test() { super.test(); } }
主程序类
public class Application { public static void main(String[] args) { //方法的调用只和左边的数据类型有关(数据类型有哪些方法,该对象就有哪些方法) A a = new A(); a.test(); //A==>test //父类的引用指向了子类,若子类重写了方法,执行子类的子类中的方法 B b = new A(); b.test(); //A==>test } }
注意点:
//方法的调用只和左边的数据类型有关(数据类型有哪些方法,该对象就有哪些方法) A a = new A(); a.test(); //A==>test //父类的引用指向了子类,若子类重写了方法,执行子类的子类中的方法 **//b 不能调用子类中有而父类中没有的方法** B b = new A(); b.test(); //A==>test
多态存在的条件: