目录
一、方法参数和返回值
-
类名作为形式参数传递
Student类:
public class Student { int age; String name; public Student(int age, String name) { this.age = age; this.name = name; } public void show(Student student) { System.out.println("年龄:" + student.age + "; 名字:" + student.name); } }
测试类Test:
public class Test1 { public static void main(String[] args) { Student student = new Student(20,"Alice"); student.show(student); } }
从这段代码我们可以看出,类名可以作为参数进行传递,而这时传递的就是一个实例化的对象。
-
抽象类名作为形参传递
抽象父类Animal:
public abstract class Animal { int age; String name; abstract void show(Animal animal); public Animal(int age, String name) { this.age = age; this.name = name; } }
子类Cat:
public class Cat extends Animal { public Cat(int age, String name) { super(age, name); } @Override void show(Animal animal) { System.out.println("年龄:" + animal.age + "; 名字:" + animal.name); } }
测试类Test:
public class Test2 { public static void main(String[] args) { Animal cat = new Cat(2, "Jack"); cat.show(cat); } }
这个例子中我们发现如果需要一个抽象类类型的形参,那么就可以传递一个该类的子类对象。
-
接口名作为形参
定义的接口MyInterface:
public interface MyInterface { int age = 20; void show(MyInterface myInterface); }
Student类:
public class Student implements MyInterface { int age = MyInterface.age; String name; public Student(String name) { this.name = name; } public Student(int age, String name) { this.age = age; this.name = name; } @Override public void show(MyInterface myInterface) { System.out.println("age:" + age + ";name:" + name); } }
测试类Test:
public class Test { public static void main(String[] args) { MyInterface student = new Student("Alice"); student.show(student); } }
这个例子我们可以知道,如果形参为接口类型,那么我们可以传递一个该接口的子类对象。
二、链式编程
-
什么是链式编程
链式编程是一种代码编写风格。
比如调用了一个方法,该方法返回的类型是对象,那么直接可以在后面加上 . 来继续调用该对象的方法。
-
例子
Student类:
public class Student { int age = 20; String name = "Alice"; public int getAge() { return age; } public Student getStudent(Student student, int age) { student.age = age; return student; } }
测试类Test:
public class Test { public static void main(String[] args) { //链式编程 int age = new Student().getStudent(new Student(), 18).getAge(); System.out.println(age); //常规编程 Student student = new Student(); Student student1 = new Student(); student = student.getStudent(student1, 18); int age1 = student.getAge(); System.out.println(age1); } }
如上所示,我给出了两种代码风格,明显链式编程简化了代码,提高了效率。
三、包
-
包的定义
包定义的格式: package 包名;
多级包之间可以用 . 分开。
-
package关键字
注意事项:
A:package语句必须是程序的第一条可执行的代码 B:package语句在一个java文件中只能有一个 C:如果没有package,默认表示无包名
-
import关键字
import关键字是Java为我们提供的导包的方式。
格式:
import 包名;
注意:这种方式导入是到类的名称;
虽然最后可以写*,但是不建议。
四、四种权限修饰符
本类 | 同一包下(子类和无关类) | 不同包下(子类) | 不同包下(无关类) | |
---|---|---|---|---|
private | √ | |||
缺省(默认) | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
-
各种修饰符
权限修饰符:private,缺省,protected,public 状态修饰符:static,final 抽象修饰符:abstract
2.修饰类的关键字
权限修饰符:默认修饰符,public 状态修饰符:final 抽象修饰符:abstract
3.修饰成员变量的关键字
权限修饰符:private,缺省,protected,public 状态修饰符:static,final
4.修饰构造方法的关键字
权限修饰符:private,缺省,protected,public
5.修饰成员方法的关键字
权限修饰符:private,缺省,protected,public 状态修饰符:static,final 抽象修饰符:abstract
五、内部类
-
内部类概述
定义在其他类内部的类,这个类称为内部类。
例如:在类A中定义了一个类B,那么类B就是内部类。
例子:
public class NeiBuLei { public class Nei{ //内部类 } }
-
内部类的访问特点
内部类可以直接访问外部类的成员,包括私有; 外部类要访问内部类的成员必须创建对象。
例如:
内部类访问外部类成员:
public class Wai { private int age = 20; private void show() { System.out.println("外部类的show方法"); } public class Nei { public int num = 100; public void printAge() { System.out.println("age:" + age); } public void getShow() { show(); } } } //测试类Test public class Test { public static void main(String[] args) { Wai.Nei nei = new Wai().new Nei(); nei.getShow(); nei.printAge(); } }
外部类访问内部类成员:
public class Wai { public class Nei { public int num = 100; public void show() { System.out.println("内部类的show方法"); } } public void getShow() { Nei nei = new Nei(); nei.show(); } public void printNum() { Nei nei = new Nei(); System.out.println(nei.num); } } //测试类Test public class Test { public static void main(String[] args) { Wai wai = new Wai(); wai.getShow(); wai.printNum(); } }
-
内部类按照位置的分类
成员内部类:定义在成员位置;
局部内部类:定义在局部位置。
成员内部类:
public class Wai { public class Nei { public int num = 100; public void show() { System.out.println("内部类的show方法"); } } }
局部内部类:
public class Wai { public void show(){ class Nei{ int age=10; public void neiShow(){ System.out.println("局部内部类的show方法"); } } } }
-
成员内部类如何在测试类中直接访问内部类的成员
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
例如:
//成员内部类 public class Wai { public class Nei { public int num = 100; public void show() { System.out.println("内部类的show方法"); } } } //测试类Test public class Wai { public class Nei { public int num = 100; public void show() { System.out.println("内部类的show方法"); } } }
-
成员内部类的常见修饰符及应用
成员内部类的修饰符:
private:为了保证数据的安全性
static:为了方便访问数据
注意事项:
a.静态内部类访问的外部类数据必须用静态修饰;
b.成员方法可以是静态的也可以是非静态的。
成员内部类被静态修饰后的访问方式是:
格式: 外部类名.内部类名 对象名=new 外部类名.内部类名();
例如:
//定义的成员内部类 public class Wai { static String str="Hello"; public static class Nei { int num = 100; public void show() { System.out.println(str); } } } //测试类 public class Test2 { public static void main(String[] args) { Wai.Nei nei = new Wai.Nei(); nei.show(); } }
-
局部内部类访问局部变量
访问方式:
1. 直接访问外部类成员; 2. 创建内部类对象,通过对象调用内部类的方法,来使用局部内部类的功能;
注意事项: 局部内部类访问局部变量必须用final修饰。
-
匿名内部类
1. 匿名内部类:就是局部内部类的简化写法。 2. 前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类。 3. 格式: new 类名或者接口名(){ 重写方法; }; 4. 匿名内部类的本质: 是一个继承了该类或者实现了该接口的子类匿名对象。
例如:
//Student类 public class Student { int age = 20; String name = "Alice"; public void show(){ System.out.println("Student的show方法"); } } public class Test { public static void main(String[] args) { Student student = new Student() {//匿名内部类 @Override public void show() { System.out.println("重写的show方法"); } }; student.show(); } }
匿名类中的this关键字代表的是匿名内部类。