进一步认识java中的类

认识类

1、访问修饰符

  • 访问修饰符有四个private、default、protected、public;
  • private:被private修饰的表示只能在本类中访问;
  • default:被default修饰的表示只能在本包访问;
  • protected:被protected修饰的表示只能在本包中访问,要在其他包中使用必须继承;
  • public:被public修饰的表示可以在任何地方中访问。

2、包:

  • 包的本质是一个文件夹,Java中不允许有同名的类出现,于是便有了包的概念,我们可以在不同包中创建同名得类。如何使用不同包中的同名的类呢?这就需要引入。

3、引入(import):

  • 引入的作用主要就是用来引入不同包中的类的,类在同一个包中不需要引入。Java中使用任何类都需要引入,Java一般都会默认引用Java.lang.*, *代表所有的类,但是不包括子包中的类。
  • 所有代码只能写在类当中,而有两个例外,一个是包语句,另一个就是Import语句。

4、属性访问器

  • 有些类中的的属性不是公有的没有办法直接访问,这时候就会用到属性访问器,也就是getter和setter方法。
  • 在类中定义个getter方法来获取属性;定义个setter方法来修改属性。
    下面展示 getter和setter方法
public class Person {
    private String name = "张三";
    public int age = 10;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public Person(){
        System.out.println("我是爸爸");
    }
}

5、继承

  • 继承是面向对象语言的主要特点之一,继承的主要特点就是用来省写代码。
  • 如何继承?用extends关键字来实现继承,被继承的类称为超类或父类,继承的类称为子类。
    下面展示 类的继承,继承的是上面那个Person类。
public class Man extends Person{
    public Man() {
        System.out.println("我是儿子");
    }
}
  • 那么有哪些特征被继承下来了呢?
public class Test {
    public static void main(String[] args) {
        Man m = new Man();
        int i = m.age;
        m.setName("张麻子");
        m.getName();
    }
}
  • 可以看到Man类中什么也没写但是却有属性和方法可以调用,但是却没有Person类中的name属性,所以它继承了它父类中的公有的属性和方法,name属性是私有所以没有被继承。所以类的继承除了私有的和构造器(构造函数)不能继承,其他的都可以继承。
  • 但其实我们没有给Man这个类中定义name属性它却可以设置name属性和得到name属性,可以推测其实它也继承了它的父类中的这个私有的name只不过我们看不到罢了。
  • 类的继承中,没有继承父类的构造函数,但是在在使用到自己的构造函数时却是先从父类的开始调用,例如:
public class Test {
    public static void main(String[] args) {
        Man m = new Man();
        int i = m.age;
        m.setName("张麻子");
    }
}

运行结果:
运行结果如下
先调用了父类的无参构造器再调用了自己的。

  • 继承的分类:
    像Man类继承Person类的用extends关键字来指明的叫做显示继承。
    而没有用关键字的默认继承Object类叫做隐式继承。 在Java中Object类就像是一个树根,其他类基本间接或直接继承与它。

6、重载和重写

  • 说到继承就必须说下方法的重载和重写了;
  • 重载:就是在本类或被继承的类中方法的名字相同,但是参数不同
  • 重写:就是在继承的类中方法的名字必须和父类相同,但是必须重写父类的方法。
  • 重载:
 public void sing(){
        System.out.println("爸爸在唱歌");
    }
    public void sing(String name){
        System.out.println(name + "在唱歌");
    }//这就是方法的重载,在Person类中定义了两个同名方法,但参数不同。

重写:

public class Man extends Person{
    public Man() {
        System.out.println("我是儿子");

    }
    public void sing(){
        System.out.println("儿子在唱歌");
    }
}//Man类重写了父类的Person中的无参sing()方法

子类在重写父类方法时要注意,可以做到两小一大:

  • 返回值只能缩小不能放大。
  • 抛出异常的范围只能缩不能放大。
  • 访问修饰符只能放大不能缩小。

7、父类引用指向子类对象和多态

  • Person p = new Man(); 时调用的是谁的属性?谁的方法?
  public static void main(String[] args) {

        Person p = new Man();
        p.sing();
        System.out.println(p.age);
    }

结果如下:

我是爸爸
我是儿子
儿子在唱歌
10

由此说明引用的是父类的属性和子类的同名方法。

  • 而由此引出一个概念多态
  • 多态:同一个方法在不同类中的不同的表现形式。类似上面那个例子。
    • 多态存在的必要条件:
      子类必须重写父类的方法
      父类引用必须指向子类对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值