Java面向对象

2021/4/18 20:27:58

本文主要是介绍Java面向对象,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

this关键字

this关键字的作用:

@Data
public class jtest {
   private String name;
   public jtest(){
       //调用构造方法,只能在构造方法中使用,且必须是第一行
       this("dwx");
   }
   public jtest(String name){
       //区分成员变量和局部变量
       this.name=name;
   }
   public void sN(){
       //调用类中其他方法
       this.setName("dwx");
   }
}

this在类中表示当前类将来创建出来的对象

封装,继承,多态

使用private修饰需要封装的成员变量;提供一个公开方法来获取和设置成员变量

Java中类只有单继承,没有多继承,接口可以多继承

Super关键字

在子类继承父类后,可以使用super来访问或调用父类中方法或属性

子类构造器会隐式调用父类的无参构造(super()),如果父类的无参构造被有参构造覆盖,则不能调用父类无参构造

super调用父类构造器必须在子类构造器的第一行、

方法重写:

静态方法不能重写:

  • 父类的静态方法不能被子类重写为非静态方法
  • 父类的非静态方法不能被子类重写为静态方法
  • 子类可以定义与父类的静态方法同名的静态方法,相当于父类子类都有个同名的静态方法

私有方法不能被子类重写,因为子类继承父类不能直接访问父类的私有方法,但是可以拥有两个同名的方法

方法在重写时:

  • 方法名必须相同
  • 参数列表必须相同
  • 访问控制修饰符只能扩大不能缩小
  • 抛出异常的范围只能缩小不能扩大
  • 返回类型可以相同,或者子类方法返回类型为父类方法返回类型的子类型

多态

一个父类的引用可以指向其任何一个子类对象

编译看左边:找编译时,编译器会检测对象引用类型中是否含有指定的成员,没有就会报错

instanceof:x instanceof y,主要看变量x与变量y是否存在父子关系,有父子关系编译会通过,没有父子关系编译会报错;输出是true还是false要看x指向的实际类型是不是y的子类

总结:

  • 父类引用可以指向子类对象,子类引用不能指向父类对象
  • 把子类对象直接赋值个父类引用叫做向上转型,不需要强制转型
  • 把指向子类对象的父类引用赋值给子类引用叫做向下转型,需要强制转换
  • 向上转型会丢失子类的特有方法,但是子类重写父类的方法依旧有效

修饰符

代码块(匿名代码块)和静态代码块,匿名代码块的作用主要是初始化成员变量的值

public class jtest {
    //匿名代码块
    {
        System.out.println("执行匿名代码块");
    }
    static {
        System.out.println("执行静态代码块");
    }

    public static void main(String[] args) {
        //类加载,执行静态代码块,只执行一次;创建对象时自动执行匿名代码块,执行两次
        jtest jtest1=new jtest();
        jtest jtest2=new jtest();
    }
}

抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类

接口

接口中的变量都是静态常量(public static final修饰的)

一个类可以实现多个接口,且需要实现所有接口里的方法,如果没有全部实现,则需要将这个类声明为抽象类

一个接口可以继承多个父接口

内部类

内部类分为4种:

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

成员内部类

成员内部类不能写静态方法或静态属性

public class JavaTest {
    class Inner{
    }
    public static void main(String[] args) {
        //先实例化外部类
        JavaTest javaTest=new JavaTest();
        //再实例化内部类
        JavaTest.Inner inner=javaTest.new Inner();
    }
}

成员内部类作用:

  • 可以访问外部类的所有属性,包括私有属性和方法
  • 如果内部类的变量名与外部类中的成员变量名相同,就要通过外部类对象.属性来访问外部类中的变量,内部类的变量可以通过this.属性来访问
public class JavaTest {
    private int id;
    class Inner{
        private  int id=9;
        public void test(){
            System.out.println(JavaTest.this.id);
        }
    }
    public static void main(String[] args) {
        //先实例化外部类
        JavaTest javaTest=new JavaTest();
        //再实例化内部类
        JavaTest.Inner inner=javaTest.new Inner();
        inner.test();
    }
}

静态内部类

静态内部类直接用外部类类名来实例化就行

public class JavaTest {
    private int id;
    public static class Inner{

    }
    public static void main(String[] args) {
       JavaTest.Inner inner= new JavaTest.Inner();
       
    }
}

不能访问外部内的非静态变量或方法,可以声明自己的静态变量和方法

局部内部类

局部内部类是在一个方法内部声明一个类,可以访问外部类的成员变量和方法,局部内部类要访问其所在方法的局部变量,局部变量必须是final修饰

局部内部类由其所在方法实例化

匿名内部类

匿名内部类需要依托于其他类或接口创建

匿名内部类的声明必须是在使用new关键字时。



这篇关于Java面向对象的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程