Java第五章——面向对象(二)


重点:
封装(java访问控制权限)
继承(定义、子类访问控制权限)
类的组合的实现(与继承的区别)
多态(重载与覆写)

1.访问控制修饰符

Java的访问控制修饰符有哪些?各有什么访问权限?

访问权限控制符:

public(公共访问权限)
protected(包访问权限,继承访问权限)
无访问控制修饰(包访问权限)
private(类内部访问权限)

这些修饰符可以用于
(1)修饰类

	[类修饰符] class 类名( )

(2)修饰类的域变量(属性成员)
(3)修饰类的成员
在这里插入图片描述

2.继承

继承通过extends关键字实现

子类对于从父类继承的哪些属性与方法是可见的?请分别写程序进行验证。

子类继承了父类的所有属性和方法, 但只有public、protected的属性和方法在子类是可见的。

子类在继承父类的时候,首先应该满足父类可被访问,例如当子类和父类不在同一个包当中时,父类修饰符必为public;在父类能被访问的前提下,凡是修饰符为public或是protected的父类属性成员或是方法能被子类所访问;private的属性成员或是方法则不能被访问。

实例
1.子类访问父类的protected属性和方法

class Plane{
    protected String name;
    public void setName(String _name){
        name=_name;
    }
    public String getName(){
        return name;
    }
}
class FighterPlane extends Plane{
    private int missileNum;
    public void setNum(int _missileNum){
        missileNum=_missileNum;
    }
    public void fire(){
        missileNum-=1;
    }
}
public class Run{
    public static void main(String[] args){
        FighterPlane p=new FighterPlane();
        //子类可以直接访问父类的protected属性和方法
        p.name="su35";
        p.setName("f35");
        System.out.println(p.getName());
        p.fire();
    }
}

输出

f35

2.子类访问父类的private属性和方法

class Plane{
    private String name;
    public void setName(String _name){
        name=_name;
    }
    public String getName(){
        return name;
    }
}
class FighterPlane extends Plane{
    private int missileNum;
    public void setNum(int _missileNum){
        missileNum=_missileNum;
    }
    public void fire(){
        missileNum-=1;
    }
}
public class Run{
    public static void main(String[] args){
        FighterPlane p=new FighterPlane();
        //p.name="su35";name在Plane中是private 访问控制
        //子类不能直接访问父类的private属性和方法,可以调用父类的公共方法来间接访问私有属性
        p.setName("f35");
        System.out.println(p.getName());
        p.fire();
    }
}

输出

f35

3.组合

什么是组合?有什么作用?请举例说明

组合是选用已有类的对象作为,表达的是有一个的包含关系,是类的复用方式,优先于继承。

public class Point{//端点类
   private int x,y;
   public Point(int x,int y){
       this.x=x;
       this.y=y;
   }
   public int getX(){
       return x;
   }
   public int getY(){
       return y;
   }
}
class Line{//线段类
    private Point p1,p2;//两端点
    Line(Point a,Point b){
        p1=new Point(a.getX(),a.getY());
        p2=new Point(b.getX(),b.getY());
    }
}

多态——是指一个程序中同名的不同方法共存的情况
Java中提供两种多态机制:重载(overloading)与覆写(overriding)

4.重载

什么是重载?有什么作用?请构造各种重载示例
重载:方法名称相同,参数类型或个数不同
在编译器视角来看,方法签名=方法名称+参数类型+参数个数

public class StuManage {
    public int getScore(){
        return 3;
    }
    public int getScore(int i){
        return i;
    }
    /*public long getScore(int i){
        return i;
    }
    private int getScore(int i){
        return i;
    }
    public static int getScore(int i){
        return i;
    }
    public final int getScore(int i){
        return i;
    }*/
    //同名同参数但不同类型返回值的方法不是重载,编译不能通过
    public int getScore(Integer i){
        return i;
    }
    //可变参数,i实质上是数组int[]    
    public int getScore(int...i){
        return 3;
    }
}
p.getScore(5);调用public int getScore(int i)
p.getScore(1,3,5);调用public int getScore(int ... i)

5.覆盖(覆写)

什么是覆写?有什么作用?覆写父类方法的条件有哪些?请举例说明。

子类对父类的同名方法(方法名称相同,参数相同,返回类型相同)重新进行定义,即在子类中定义与父类中已定义的同名而内容不同的方法。

覆写需满足的条件:
子类的访问修饰符权限应等于或大于父类,不能变小
子类的返回类型能够向上转型成为父类的返回类型
异常也要能向上转型为父类的异常
方法名、参数类型及个数必须严格一致

注意:
覆写只能针对非静态,非final、非构造方法

class Parent {
    Number getScore(int a) {
      return new Integer(7);
   }
}
class Son extends Parent {
    @Override//所有的覆写方法需注明
    Number getScore(int b){
      return new Integer(8);
    }
 }
 public class RunSon{
    public static void main(String args[]){
      Son  s = new Son();
      System.out.println(s.getScore());
   }
}

在JDK中,很多父类的方法被子类重新覆盖,赋予了不同的含义,如Object类中的boolean equals(Object obj)方法

public boolean equals(Object obj){
    return this==obj;
}
public class Equals{
    public static void main(String[] args){
        String s1="apple";
        String s2="apple";
        System.out.println(s1==s2);//true
        System.out.println(s1.equals(s2));//equals比较的是内容,true
        String s3=new String();
        String s4=new String();
        System.out.println(s3==s4);//false
        System.out.println(s3.equals(s4));//初始化的两个对象都为 null,所以是相等,返回 true
    }
}

输出:

true
true
false
true

从上面例子可以看出来“==”比较的是两个引用的对象是否相等,而equals()方法比较的是两个对象的实际内容
内存分配空间为:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值