1. 参数传递

形式参数的传递
a.当以后看到一个方法的形参 需要一个类类型,你就传递一个该类的对象(没有可以定义一个)。

package org.westos.demotest;

public class MyTest {
    public static void main(String[] args) {
        Student student = new Student();
        set(student,20);

        student.show(new Student(),80);
    }
    public static void set(Student student,int num){
    }
}
class Student{
    public void show(Student student,int num){}
}

b.当以后看到一个方法的形参 需要一个抽象类类型,你就传递一个该类的子类对象(没有可以定义一个)。

package org.westos.demotest;

public class MyTestTwo {
    public static void main(String[] args) {
        Cat cat = new Cat();
        set(cat,80);
        cat.show();
    }
    public static void set(Animal an,int num){}
}

abstract class Animal{
    public abstract void show();
}
class Cat extends Animal{
    @Override
    public void show() {
    }
}

c.当以后看到一个方法的形参 需要一个接口类型,你就传递一个该接口的子类对象(没有可以定义一个)。

package org.westos.demotest;

public class MyTestThree {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        set(myClass,70);
        myClass.show();
    }
    public static void set(MyInterface myInterface,int num){}
}

interface MyInterface{
    void show();
}
class MyClass implements MyInterface{
    @Override
    public void show() {

    }
}

返回值类型的传递

a.当以后看到一个方法的返回值类型 需要一个类类型,你就返回一个该类的对象(没有可以定义一个)。

package org.westos.demotest;

public class MyTestA {
    public static void main(String[] args) {
        Teacher teacher=getTeacher();
        teacher.getTea();
    }
    public static Teacher getTeacher(){
        Teacher teacher=new Teacher();
        return teacher;
    }
}

class Teacher{
    public Teacher getTea(){return this;}
}

b.当以后看到一个方法的返回值类型 需要一个抽象类类型,你就传递一个该类的子类对象(没有可以定义一个)。

package org.westos.demotest;

public class MyClassB {
    public static void main(String[] args) {
        AnimalDog ad=getAnimal();
        Dog dog=(Dog) ad;
    }
    public static AnimalDog getAnimal(){
        Dog dog = new Dog();
        return dog;
    }
}

abstract class AnimalDog{}
class Dog extends AnimalDog{}

c.当以后看到一个方法的返回值类型 需要一个接口类型,你就传递一个该接口的子类对象(没有可以定义一个)。

package org.westos.demotest;

public class MyTestC {
    public static void main(String[] args) {
        Myinterface myinterface = getMyinterface();
    }
    public static Myinterface getMyinterface(){
        return new gouzi();
    }
}

interface Myinterface{}
class gouzi implements Myinterface{}

它返回什么类型,就用什么类型来收:

java 接口传参params java接口传文件采用的方式_编程语言


2.链式编程的语法风格

当你调用完一个方法后,他返回一个对象,那你就可以紧接着打点 . 再去调用这个对象所属类中的方法… …

package—包,就是文件夹,用来解决同一个路径下不能存在同名文件的问题(分类管理);不同包下的类之间进行访问 要用import进行导包。

定义包的格式: package 包名;(多级包用.分开即可)

注意事项:
a: package语句必须是程序的第一条可执行的代码
b: package语句在一个java文件中只能有一个
c: 如果没有package,默认表示无包名

package org.westos.demotest;
import org.westos.demotest.MyTest;

public class MyTestLSBC {
    public static void main(String[] args) {
        int age=getPer().getPerson().show(100).getAge();
        System.out.println(age); // 20
    }
    public static Person getPer(){
        return new Person();
    }
}
class Person{
    int age=20;
    public int getAge(){return age;}
    public Person getPerson(){
        Person person = new Person();
        return person;
    }
    public Person show(int age){
        return this;
    }
}

3.权限修饰符

四种权限修饰符: private(私有的) , 默认 , protected(受保护的) , public(公共的)

本类

同一个包下(子类和无关类)

不同包下(子类)

不同包下(无关类)

private

Y

默认

Y

Y

protected

Y

Y

Y

public

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 / abstract / final


4.内部类

将类A定义到类B中,那么类A 就称之为内部类,类B可以称之为外部类

根据内部类位置不同,分为成员内部类和局部内部类:

成员内部类–把内部类定义到外部类的成员位置(类中方法外)

局部内部类–把内部类定义到外部类的局部位置(方法内)

在测试类中直接访问内部类的成员:外部类名.内部类名 对象名 = 外部类对象.内部类对象;

4.1 成员内部类:

创建内部类对象–Outer.Inner inner=new Outer().new Inner();

特点:
a.内部类可以直接访问外部类的成员,包括私有成员;
b.外部类不能直接访问内部类的成员,要访问就必须创建内部类的对象;
c.private—内部类可以使用private来修饰,可以用来隐藏细节,私有的内部类,外界无法创建对象;

package org.westos.demo2;

public class MyTest2 {
    public static void main(String[] args) {
        //私有的内部类,外界无法创建其对象。
        //Wai.Nei nei=new Wai().new Nei();
        Wai wai = new Wai();
        wai.test();
    }
}

class Wai {
    //内部类,可以使用private来修饰
    private class Nei {
        public void neiShow() {
            System.out.println("内部类的方法");
        }
    }
    public void test(){ //在外部类方法中,创建内部类对象,调用其中的方法
        Nei nei = new Nei();
        nei.neiShow();
    }
}

d.static—内部类可以使用static来修饰,可以用来隐藏细节,静态的内部类,外界创建静态内部类的语法简化了;静态内部类只能访问外部类的静态成员。

package org.westos.demo3;

public class MyTest {
    public static void main(String[] args) {
        //创建静态内部类的语法
        Outer.Inner inner=new Outer.Inner();
        //静态内部类,只能访问外部类的静态成员,不能访问非静态成员。
        inner.neiShow();
    }
}

class Outer {
    static int num=20;
    //内部类,可以使用static来修饰
    static class Inner {
        public void neiShow(){
            System.out.println(num);
            hehe();
        }
    }
    public static void hehe(){
    }
}

注意语法:调用外部类中的 Outer.this.num

this代表的是内部类的对象,

Outer.this 代表外部类的对象。

填空,要求:使用已知的变量,在控制台输出30,20,10
	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();
		}	
	}

4.2 局部内部类:

a.内部类都可以直接访问外部类的成员,包括私有成员;

b.局部内部类外界没有其创建对象的语法;

package org.westos.demo5;

public class MyTest {
    public static void main(String[] args) {
        //1.内部类都能直接访问外部类的成员,包括私有成员。
        //2.成员内部类,外界没有其创建对象的语法。
        Wai wai = new Wai();
        wai.show();
    }
}

class Wai {
    int num = 20;
    private int age = 30;

    class Inner {
    }

    public void show() {
        //局部内部类
        class Nei {
            int b = 1;
            public void neiTest() {
                System.out.println(num);
                System.out.println(age);
                test();//调用外部类的私有方法
            }
            public void neiShow() {
                System.out.println("nei show");
            }
        }
        Nei nei = new Nei();
        nei.neiTest();
        nei.neiShow();
    }
    private void test() {
        System.out.println("外部类的私有方法");
    }
    public void hehe() {
        //Nei nei=new Nei();
        //Inner inner = new Inner();
        show();
    }
}

c.局部内部类访问外部类的局部变量 外部类的局部变量,必须为一个常量。

package org.westos.demotest;

public class MyTestNBL {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.waiShow(300);
    }
}
class Outer{
    int b=1000;
    public void waiShow(int num){
        int a=200;
        class Inner{
            public void neiShow(){
                System.out.println(b);
                System.out.println(a);
                System.out.println(num);
            }
        }
        Inner inner = new Inner();
        inner.neiShow();
    }
}

4.3 匿名内部类:

它是局部内部类的一种简写形式

语法格式:new 接口名/类名(){重写方法}

package org.westos.demotest;

public class NMNBL {
    public static void main(String[] args) {
        new monkey(){
            @Override
            public void show() {
                System.out.println("重写了父类的抽象方法");
            }
        }.show();
    }
}
abstract class monkey{
    public abstract void show();
}
class M extends monkey{
    @Override
    public void show() {
    }
}

本质:匿名内部类本质上是一个对象,是谁的对象,是 实现了该接口 或者 继承了 该抽象类 的子类对象。经常用用于传参,对于一个普通的类,我们也可以使用匿名内部类,来创建该类的子类对象。

package org.westos.demo2;

public class MyTest {
    public static void main(String[] args) {
        //使用同一个匿名内部类,来调用两个方法。
        //多态
        MyInterface myInterface = new MyInterface() {
            @Override
            public void aa() {
                System.out.println("aaaaaaaaaaaaaaa");
            }
            @Override
            public void bb() {
                System.out.println("bbbbbbbbb");
            }
        };
        myInterface.aa();
        myInterface.bb();
    }
}

interface MyInterface {
    void aa();
    void bb();
}

在一个类里面,也可以定义一个接口,在外界可以采用匿名内部类的方式,内部接口的子类对象;内部接口也可以私有,私有后外界无法创建其子类对象。

package org.westos.demotest;

public class NMNBL {
    public static void main(String[] args) {
    public static YourInterface getYI(){
        return new YourInterface() {
            @Override
            public void show() {

            }
        };
    }
    public static monkey HZ(){
        return new monkey() {
            @Override
            public void show() {

            }
        };
    }
}
    
abstract class monkey{
    public abstract void show();
}
class M extends monkey{
    @Override
    public void show() {
    }
}
interface YourInterface{
    void show();
}

练习:

package org.westos.demo6;

interface Inter {
    void show();
}
//类
class Outer {
   //补齐代码 要求在控制台输出”HelloWorld”
   public static Inter method(){
      return new Inter() {
         @Override
         public void show() {
            System.out.println("hello world");
         }
      };
   }
}

//测试类
class OuterDemo {
    public static void main(String[] args) {
        Outer.method().show();
    }
}

//要求在控制台输出”hello world”

5. 常用类的学习

API(Application Programming Interface) :应用程序编程接口。
Java API:就是Java提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。

类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。

Object:所有类的顶层父类 所有的类都是直接或者间接继承自他。

hashCode():返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。不同对象的哈希码值是不一样的(不是对象的实际地址值,可以理解为逻辑地址值)。

public class MyTest extends Object {
    public static void main(String[] args) {
        Object obj = new Object();
        int code = obj.hashCode();
        System.out.println(code);// 356573597

        Object obj2 = new Object();
        int code2 = obj2.hashCode();
        System.out.println(code2);// 1735600054
    }
}

getClass():获取该类的字节码文件对象,当Object.class这个字节码文件加载的时候,JVM就会为字节码文件来创建对象,这个字节码文件对象,用Class类型来描述。

package org.westos.demo;

public class MyTest2 {
    public static void main(String[] args) {
        //getClass() 获取该类的字节码文件对象
        Object obj1 = new Object();
        Object obj2 = new Object();
        System.out.println(obj1);// java.lang.Object@1540e19d
        System.out.println(obj2);// java.lang.Object@677327b6
        System.out.println(obj1 == obj2);// false
        //获取 Object.class 这个字节码文件对象
        Class<?> aClass1 = obj1.getClass();
        System.out.println(aClass1.getName());// java.lang.Object
        Class<?> aClass2 = obj2.getClass();
        System.out.println(aClass1 == aClass2);// true
    }
}

toString():获取该对象的地址值,以字符串形式返回。

Object类中的toString()方法的默认实现,是在获取对象的地址值,但是我们任务老是看对象的地址值意义不大。
当子类调用toString()方法时,打印成员变量的值来说更有意义。

当你以后输出一个对象名,输出的不是地址值,就说明该类重写了父类Object中的toString()。

package org.westos.demo3;

import java.util.Scanner;

public class MyTest {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("张三");
        student.setAge(23);
        // System.out.println(student.getName()+"=="+student.getAge());
        // student.show();
        System.out.println(student);

        Scanner scanner = new Scanner(System.in);
        //当你以后输出一个对象名,输出的不是地址值,就说明该类重写了父类Object中的toString();
        System.out.println(scanner.toString());
    }
}


class Student {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    public void show() {
        System.out.println(this.name + "==" + age);
    }

    //IDEA 可以按 alt+insert 自动重写toString()方法
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}