java基础语法(二)

 本文为自学总结,如有错误请大佬指正。

目录

 一.继承

1.概念

2.语法格式

3.子类特点

4.构造方法的访问特点

5.注意事项

6.子类访问父类和父类访问子类

6.1方法重写

6.2子类访问父类

6.3super

6.4super与this的区别 

6.5 父类访问子类

7.权限修饰符

8.static 

8.1概念

8.2static的访问特点

9.final

9.1概念

9.2final修饰局部变量 

二.多态

1.多态的概念

 2.多态成员的访问特点

3.多态的转型

3.1向上转型

3.2向下转型

3.3多态的好处和弊端

三.抽象类

1.概念

2.抽象类的特点

3.抽象类成员的特点

4.抽象类的使用

四.接口

1.概念

2.接口特点

3. 接口成员特点

4.抽象类与接口的区别

五.内部类

1.内部类的概念

2.内部类格式

3.内部类的访问特点

4.内部类的分类

5.成员内部类

6.局部内部类



 一.继承

学会了两个类的使用,接下来了解两个类的关系--继承

1.概念

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

2.语法格式


 public class 子类 extends 父类{}

举例

public class Zi extends Fu{}

  • Zi:是子类,也称派生类
  • Fu:是父类也称基类,超类

3.子类特点

  • 具有父类内容
  • 也可以具有自己独特的内容

4.构造方法的访问特点

5.注意事项

  1. 类支持单继承,不支持多继承
  2. 类支持多层继承
  3. 子类无法直接使用父类中私有的内容。

6.子类访问父类和父类访问子类

如果父类中的变量与方法和子类同名怎么办?访问顺序是什么?

这就涉及了方法重写

6.1方法重写

概念:

子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写

应用场景:

当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容

Override注解:

  • -@Override:注解,重写注解校验!
  • 这是注解标记的方法,就说明这个方法必须是重写父类的方法。
  • 建议重写都加上这个注解,一方面可以提高代码的可读性,一方面可以防止重写出错!
  • 子类重写父类方法的时候,访问权限需要大于等于父类

注意:

  • 私有方法不能被重写(父类私有成员子类是不能继承的)
  • 子类方法访问权限不能更低(public > protected > default > private)
  • 父类中的静态方法不能被重写,如果子类也有相同的方法,并不是重写的父类的方法,而是将父类同名的方法隐藏了起来。

6.2子类访问父类

先定义个Anima类

    public class Animal {
        String name="小动物";
        public void eat() {
            System.out.println(name + "吃东西");
        }

        public void sleep() {
            System.out.println(name + "在睡觉");
        }

    }

再定义个Dog类

public class Dog extends Animal {
    public Dog() {

    }
    void bark() {
        System.out.println(name + "旺旺~");//name继承Anima类
    }
}

在Test类测试输出  

public class Test {

    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog.name);
        dog.eat();
        dog.sleep();
        dog.bark();
    }

}

结果:

如果Dog类里也有变量name,方法eat

public class Dog extends Animal {

    String name="狗";
    void bark() {
        System.out.println(name + "旺旺~");
    }
    @Override
    public void eat() {
        System.out.println("狗吃东西");
    }
}

结果:

会发现子类访问父类时,先看本类里有没有,然后再去父类里找.

如果子类与父类方法的参数列表不同则构成重载,根据方法调用的参数列表选择合适的方法

6.3super

如果我就想调用父类方法怎么办?Super就提供了这个功能

public class Dog extends Animal {

//    String name="狗";
    void bark() {
        System.out.println(name + "旺旺~");
    }
    @Override
    public void eat() {
        System.out.println("狗吃东西");
        super.eat();//在子类调用父类的eat方法
    }
}

Test类

public class Test {

    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog.name);
        dog.sleep();
        dog.bark();
        dog.eat();
    }

}

结果:

6.4super与this的区别 

 

6.5 父类访问子类

有的人想用父类访问子类,但是这样做继承的意义何在?虽然可以但不推荐。

7.权限修饰符

8.static 

8.1概念

8.2static的访问特点

9.final

9.1概念

9.2final修饰局部变量 

二.多态

1.多态的概念

同一个对象,在不同的时刻表现的不同形态

举例:猫

我们可以说:猫 cat=new 猫();

也可以说:动物 animal =new 猫();

多态的前提与体现:

  • 有继承/实现关系
  • 有方法重写
  • 有父类引用指向子类对象

 2.多态成员的访问特点

  • 成员变量:编译看左边,执行看左边
  • 成员方法:编译看左边,执行看右边

 举例:

定义Anima类

package animal;

    public class Animal {
        String name="小动物";
        public void eat() {
            System.out.println(name + "吃东西");
        }

        public void sleep() {
            System.out.println(name + "在睡觉");
        }

    }

定义Dog类

package animal;

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃东西");
    }
}

定义Cat类

package animal;

public class Cat extends Animal {

    @Override
    public void eat() {
        System.out.println("猫吃东西");
    }
}

在Test类进行测试

package animal;

public class Test {

    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat =new Cat();
        cat.eat();
        dog.eat();


    }
}

结果

 如果我向Dog类添加变量num,并将权限改到最大

 public int num=10;

结果爆红:

 这就牵扯到了多态的转型

3.多态的转型

3.1向上转型

格式: 父类名  变量名=new 子类名(); 

由下向上是自动的

本质:父类的引用指向子类的对象

  • 不能调用子类的特有成员

3.2向下转型

 本质:父类引用转为子类引用

 格式:子类名 变量名=(子类名)父类名;

  • 不能强制转换父类的对象,只能转引用
  • 必须指定子类类型
  • 可以调用子类类型所有成员

3.3多态的好处和弊端

三.抽象类

1.概念

Java中一个没有方法体的方法应该定义为抽象方法,而类中有抽象方法就必须定义为抽象类

2.抽象类的特点

3.抽象类成员的特点

4.抽象类的使用

看看抽象类在多态的使用

先定义抽象类Animal

    abstract public class Animal {
        String name="小动物";
        abstract void eat() ;//抽象方法不能有方法主体

        public void sleep() {
            System.out.println(name + "在睡觉");
        }

    }

子类Dog继承Animal

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃东西");
    }
}

如果不重写就报错

这时候就体现了抽象类的好处了,如果你想要重写父类的一个方法但忘了,系统就会提醒你。

四.接口

1.概念

在Java中接口更多体现在对行为的抽象

2.接口特点

3. 接口成员特点

成员方法只能是抽象方法,我们也可以理解它是一个抽象类。里面全是全局变量和抽象方法组成。

4.接口的使用

说白了,如果使用接口,那么就必须把里面的抽象方法全部重写一遍,接口才会承认你,或者你自己是抽象类

举例

定义接口Animal

public interface Animal {
      int a=1;//默认是被final修饰的,这里就不需要加了
    public abstract void eat();
    public abstract void sleep();

}

定义接口实现类Dog

public class Dog implements Animal{
    @Override
    public void eat() {
        System.out.printf("狗在吃东西");
    }
    @Override
    public void sleep(){
        System.out.printf("狗在睡觉");
    }
}

在Test类里进行测试

public class Test {
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.eat();
        dog.sleep();
        System.out.println(dog.a);
    }
}

结果

4.抽象类与接口的区别

五.内部类

你是否想过一个类里面能不能再定义个类,这当然可以,它有个名字叫做内部类

1.内部类的概念

在A类里定义B类,B类就叫做内部类

2.内部类格式

public class 类名{
修饰符 class 类名{



} 
}

3.内部类的访问特点

  • 内部类可以直接访问外部类的成员,包括私有变量
  • 外部类要想访问内部类必须创建对象

4.内部类的分类

  • 在类的成员位置:成员内部类
  • 在类的局部位置:局部内部类

5.成员内部类

成员内部类创建对象格式:外部类.内部类 对象名 = 外部类对象.内部类对象

public class Test {
    
public class test2{//test2为成员内部类
    
public void inner(){
    System.out.println("我是成员内部类");
}

}

    public static void main(String[] args) {
        Test.test2 demo = new Test().new test2();

    }
}

6.局部内部类

局部内部类是定义在外部类的局部位置,比如方法中,并且有类名,外界无法直接使用,需要在方法内部创建对象并使用。 但不能被修饰符修饰如public,但可以被final修饰。

public class Test {
    
    
public void A1(){
       class test2{//在方法里定义局部内部类
               public void inner(){
                       System.out.println("我是局部内部类");
               }
             }
       test2 demo =new test2();//在方法里创建局部内部类的对象
       demo.inner();//调用局部内部类的方法
}

    public static void main(String[] args) {
      Test demo1=new Test();//创建外部类对象
      demo1.A1();//调用方法,从而间接地调用局部内部类的方法
    }
}

 结果

ok,本次学习就此结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶枯雪落光仍在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值