封装
- 高内聚:类的内部数据操作细节自己完成,不允许外部干涉
- 低耦合:仅暴露少量的方法给外部使用
- 信息隐藏:通过操作接口访问对象中数据的实际表示而不是直接访问
以下为在主函数demo中调用student类,通过公有方法访问私有属性的例子:
public class demo{
public static void main(String[] args) {
student zhangsan = new student();
zhangsan.setName("张三");
System.out.println(zhangsan.getName());
}
}
public class student {
//私有属性
private String name;
private int age;
//通过set方法初始化值
public void setName(String name){
this.name =name;
}
//通过get方法获取该值
public String getName(){
return this.name;
}
}
继承
- 继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖、组合、聚合等。
- 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键词extends来表示
- 子类和父类之间,从意义上讲应该具有“is a”的关系
- 继承的本质是对某一批类的抽象
- Java中只有单继承,没有多继承,但可以间接继承多个父类
super方法:
- super调用父类的构造方法,必须在构造方法的第一个
- super和this不能同时调用构造方法
以下为student类继承person类的例子:
demo主函数
public class demo{
public static void main(String[] args) {
student zhangsan = new student();
zhangsan.f();
zhangsan.relation();
}
}
student类
public class student extends person{
public student(){
System.out.println("调用student无参构造");
}
private String name = "张三儿";
public void relation(){
System.out.println("学生叫"+this.name);
System.out.println("爸爸叫"+super.name);
}
public void say(){
System.out.println("student是子类");
}
public void f(){
this.say();
super.say();
}
}
person类
public class person {
public person(){
System.out.println("调用person无参构造");
}
protected String name ="张三";
public void say(){
System.out.println("person是父类");
}
}
方法重写:
- 方法名必须相同
- 参数列表范围必须相同
- 修饰符范围可以扩大,但不能缩小(public>protected>default>private)
- 抛出异常的范围可以缩小,但不能扩大
以下为A类重写B类方法的例子:
public class demo{
public static void main(String[] args) {
A a = new A();
B b = new A();
a.f();
b.f();
}
}
public class A extends B{
@Override
public void f(){
System.out.println("A的方法");
}
}
public class B {
public void f(){
System.out.println("B的方法");
}
}
- b是A new()出来的对象,因此调用了A的方法
- 同名方法有static时,b调用了B类的方法,因为b是用B类定义的,b.f()输出为B类的f方法
- 同名方法没有有static时,b调用的是对象的方法,即A new()对象b的方法,b.f()输出A类重写的f方法
- 静态方法是类的方法,非静态方法是对象的方法
多态
- 同一种方法可以根据发送对象的不同而采用多种不同的行为方式
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
- 存在条件:有继承关系、子类重写父类方法、父类引用指向子类对象
- 方法有多态性,属性没有多态性
对象能执行哪些方法,主要看对象左边的类有哪些方法,如果左边类重写了其父类的方法,则执行子类的方法:
public class demo{
public static void main(String[] args) {
//student类能调用的方法都是自己的或者继承父类的
student a =new student();
//person父类,可以指向子类,但是不能调用子类独有的方法
person b =new student();
Object c =new student();
}
}