java中方法参数类型以及返回值类型问题研究及权限修饰符 内部类 匿名内部类的举例

一:java方法参数的传递:

    方法参数的传递类型由基本类型与引用类型组成;
    基本类型:基本数据类型(如int ,double 等)
    引用类型:类,接口,对象;

(1)基本类型
举例:

public class Test {
    public static void change(int i, int j) { 
        int temp = i; 
        i = j; 
        j = temp;
    } 

    public static void main(String[] args) { 
        int a = 3; 
        int b = 4; 
        change(a, b); 
        System.out.println("a=" + a); 
        System.out.println("b=" + b);
    }
}

结果: 这里写图片描述
基本类型并不会引起初始值的改变。
(2)引用类型

  如果你看到一个方法参数需要一个类的类型,那么你要传一个类的子类对象;
  如果你卡到一个方法参数需要一个抽象类的类型,那么你需要传递一个抽象类的子类对象;
  如果你看到一个方法参数需要一个接口的类型,那么你需要传递一个接口的子类对象。

举例:
Person类:

public abstract class Person {
    public int num=100;
    public abstract void eat();

}

Student 类:

public class Student extends Person implements MyInterface {
    private String name;
    private int age;
    public int num = 1;
    public int a=600;

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void eat() {
        System.out.println("我爱吃麻辣烫");

    }

    @Override
    public void haha() {
        System.out.println("我实现了一个haha方法");

    }

}

接口:

public interface MyInterface {
    int a=500;
    public abstract void haha();
}

Test 类:

public class MyTest {
    public static void main(String[] args) {
        // 如果以后你看大一个方法要一个类 类型,传该类的对象
        Student student = new Student();
        setStudent(student);
        System.out.println(student.getName());// abc
        System.out.println(student.getAge());// 30
        System.out.println("----------------------------------------------");
        // 如果你以后看到一个方法的参数需要一个抽象类类型,传一个抽象类的子类对象
        setStudent2(new Student());
        System.out.println("---------------------------");
        // 如果你以后看到一个方法的参数要一个接口类型,你传一个该接口的子类对象
        setStudent3(new Student());
    }

    private static void setStudent(Student s) {
        s.setName("abc");
        s.setAge(30);
    }

    private static void setStudent2(Person s) {
        s.eat();
    }

    private static void setStudent3(MyInterface s) {
        s.haha();
    }
}

结果:
这里写图片描述
二:权限修饰符
(1)四种权限修饰符

    private(私有的)  , 默认 , protected(受保护的) , public(公共的)
    本类   同一个包下   (子类和无关类)   不同包下(子类)  不同包下(无关类)
    private   Y     
    默认       Y             Y
    protected  Y             Y             Y
    public     Y             Y             Y                Y 

A:修饰符:
    权限修饰符:private,默认的,protected,public
    状态修饰符:static,final
    抽象修饰符:abstract
B:修饰类:
    权限修饰符:默认修饰符,public
    状态修饰符:final
    抽象修饰符:abstract
    用的最多的就是:public

C:成员变量:
    权限修饰符:private,默认的,protected,public
    状态修饰符:static,final
    用的最多的就是:private

D:构造方法:
    权限修饰符:private,默认的,protected,public
    用的最多的就是:public
E:成员方法:
    权限修饰符:private,默认的,protected,public
    状态修饰符:static,final
    抽象修饰符:abstract
    用的最多的就是:public
F:除此以外的组合规则:
    成员变量:public static final
    成员方法:public static 
            public abstract
            public final

三:内部类

 (1)定义:把一个类的定义在另一个类的内部这个内部的类就叫内部类
  (2)  访问特点:内部类可以直接访问外部类的成员,但是外部 类要想访问内部类的话 就必须创建一个内部类的对象。
  (3)创建一个内部类的格式为:Outer.Inner inner = new Outer().new Inner();   外部类为Outer内部类为Inner。外部类名.内部类名 对象名 = 外部类对象.内部类对象;
  (4)内部类的分类为;成员位置:在成员位置定义的类,被称为成员内部类。 局部位置:在局部位置定义的类,被称为局部内部类。  

举例:

成员内部类:
class Outer {
            public int num = 10;
            class Inner {
                public int num = 20;
                public void show() {
                    int num = 30;
                    System.out.println(num);// 30
                    System.out.println(this.num);// 20
                    System.out.println(new Outer().num);// 10
            }
        }
        class InnerClassTest {
            public static void main(String[] args) {
                Outer.Inner oi = new Outer().new Inner();
                oi.show();
            }   
        }

结果:
这里写图片描述
局部内部类的理解 :

   A: 可以直接访问外部类的成员
   B: 可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
   C:局部内部类访问局部变量必须用final修饰为什么呢?
因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。

举例:

class Outer {

    // 成员变量
    private int a = 45 ;

    // 成员方法
    public void show() {

        // 定义一个局部变量
        final int b = 45 ;//JDK1.7之前要加final不然报错  但是在JDK1.8 不用加 不会报错

        // 局部内部类
        class Inner {
            public void method(){
                System.out.println(a) ;
                System.out.println(b) ;
            }
        }

        // 创建对象
        Inner i = new Inner() ;

        // 调用放
        i.method() ;

    }

}

// 测试类
class InnerClassDemo6 {

    public static void main(String[] args) {

        // 创建Outer的对象
        Outer out = new Outer() ;

        // 调用show方法
        out.show() ;
    }
}

结果:这里写图片描述

四:匿名内部类
(1)定义:就是局部内部类的简化写法。
(2)使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
(3)匿名内部类中是不能定义构造函数的。
(4)匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

猜你喜欢

转载自blog.csdn.net/weixin_40843624/article/details/81266746