简单的说,封装就是使用private将属性私有,然后提供get/set方法获取和设置该属性
在idea中,生成get/set方法快捷键:win(alt+insert), Mac(command+n),然后在列表中选择get/set
package com.oop.demo03;
public class Person {
private String name;
private int age;
private char sex;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
// 对属性设置增加判断
public void setAge(int age) {
if (age>120 || age<0) {
System.out.println("输入的年龄异常!");
} else {
this.age = age;
}
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
/*
Application:
//一个项目只有一个main方法
public class Application {
public static void main(String[] args) {
Person ps1 = new Person();
ps1.setName("小明");
String name = ps1.getName();
System.out.println(name);
ps1.setAge(150);
int age = ps1.getAge(); // 输入的年龄异常!
System.out.println(age); // 0
}
}
*/
idea中重写方法快捷键,Win(Alt+Insert), Mac(command+N) 在选项中选择Override
重写需要有继承关系,是子类对父类方法的重写!
重写,子类的方法必须和父类保持一致,但是方法体不同!
父类的方法,子类不一定需要,也不一定满足。
下面Student类中调用了父类Person的构造方法,并重写了doWork方法
Application
package com.oop;
import com.oop.demo04.Student;
//一个项目只有一个main方法
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test();
student.name = "小明";
student.doWork();
}
}
/*
运行结果:
Person...
Student...
Person: null正在工作。
Student: 小明正在工作。
*/
Student
package com.oop.demo04;
public class Student extends Person{
public Student() {
super(); //调用父类的构造方法
System.out.println("Student...");
}
public void test() {
super.doWork(); //使用super调用父类的方法
}
//重写父类的方法
@Override
public void doWork() {
System.out.println("Student: "+this.name+"正在工作。");
}
}
Person
package com.oop.demo04;
public class Person {
public Person() {
System.out.println("Person...");
}
public String name;
public int age;
protected void doWork() {
System.out.println("Person: "+this.name+"正在工作。");
}
}
现在有B类继承自A类,并且B中重写了A的test()方法,另外拥有一个父类没有的test2()方法
B
package com.oop.demo05;
public class B extends A{
@Override
public void test() {
System.out.println("BBB");
}
public void test2() {
System.out.println("Only BBB");
}
}
A
package com.oop.demo05;
public class A {
public void test() {
System.out.println("AAA");
}
}
Application
package com.oop;
import com.oop.demo05.A;
import com.oop.demo05.B;
//一个项目只有一个main方法
public class Application {
public static void main(String[] args) {
//对象的示例类型由右边决定
//对象可以使用那些方法由左边决定,与右边无关
B b1 = new B();
b1.test();
A b2 = new B();
b2.test();
//b2.test2(); //无法调用B(子类)中独有方法
Object b3 = new B();
}
}
/*
运行结果:
BBB
BBB
AAA
*/
一个对象的实际类型是确定的,即new右侧的类型;A a = new A();这里的A()
但是可以指向的引用类型是不确定的:父类的引用类型可以指向子类 A a = new B();
B类可以调用的方式都是自己的或继承自父类的;而A可以指向子类型(即使用子类中重写的方法test()),但是不能使用子类的独有方法(test2())
对象能执行哪些方法,主要看对象左边的类型,和右边关系不大!
如果子类重写了父类的方法,则父类在引用时回执行子类重写的方法(A a = new B())。
从上可以得出,使用多态需要具备一下三个条件:
instance of方法判断一个对象是否是一个类的实例
后续补充:引用类型的转换和强制转换
原文:https://www.cnblogs.com/lucaz/p/14405607.html