一.形式参数和返回值问题
1.形式参数:
基本类型: byte,short,int,long,float,double,boolean,char
引用类型:类,抽象类,接口
1.1 类:当一个类作为方法参数类型传递的时候,将来调用时应该传入该的类对象
演示:
package com.shujia.day09;
/*
形式参数
基本类型: byte,short,int,long,float,double,boolean,char
引用类型:
类:当一个类作为方法参数类型传递的时候,将来调用时应该传入该的类对象
抽象类:
接口:
*/
public class Student1 {
public void show(){
System.out.println("断桥是否下过雪");
}
}
class Demo1{
public void fun(Student1 s1){
s1.show();
}
}
class Test1{
public static void main(String[] args) {
Demo1 demo1 = new Demo1();
Student1 s1 = new Student1();
demo1.fun(s1);
}
}
1.2 抽象类:当你看到一个抽象类作为方法形式参数类型的时候,将来调用时,应该传入该抽象类的具体子类的对象
演示:
/*
形式参数
基本类型: byte,short,int,long,float,double,boolean,char
引用类型:
类:当一个类作为方法参数类型传递的时候,将来调用时应该传入该的类对象
抽象类:当你看到一个抽象类作为方法形式参数类型的时候,将来调用时,应该传入该抽象类的具体子类的对象
接口:
*/
abstract class Demo2 {
abstract void print1();
public void show() {
System.out.println("桃花岛屿之间");
}
}
class DemoZi extends Demo2 {
@Override
void print1() {
System.out.println("输出:许嵩");
}
}
public class Student2 {
public void fun2(Demo2 d2) { // Demo2 d2 = new DempZi 抽象多态
d2.show();
}
}
class Test {
public static void main(String[] args) {
Student2 s2 = new Student2();
DemoZi demoZi = new DemoZi();
s2.fun2(demoZi);
}
}
1.3 接口:当你看到一个接口作为方法形式参数类型的时候,将来调用该方法时,应该传入实现该接口的具体子类对象
演示:
/*
形式参数
基本类型: byte,short,int,long,float,double,boolean,char
引用类型:
类:当一个类作为方法参数类型传递的时候,将来调用时应该传入该的类对象
抽象类:当你看到一个抽象类作为方法形式参数类型的时候,将来调用时,应该传入该抽象类的具体子类的对象
接口:当你看到一个接口作为方法形式参数类型的时候,将来调用该方法时,应该传入实现该接口的具体子类对象
*/
interface JieKou1{
public void print1();
}
class Demo3{
public void show(JieKou1 j1){ //JieKou j1 = new Demo4(); //接口多态
j1.print1();
}
}
class Demo4 implements JieKou1{
@Override
public void print1(){
System.out.println("许嵩");
}
}
public class Student3 {
public static void main(String[] args) {
Demo3 demo3 = new Demo3();
demo3.show(new Demo4());
}
}
2.返回值类型
返回值类型:
基本类型: byte,short,int,long,float,double,boolean,char
引用类型:类,抽象类,接口
2.1类:当你看到一个类作为方法的返回值类型的时候,将来方法内部定义时应该返回该类的对象
演示:
/*
返回值类型
基本类型: byte,short,int,long,float,double,boolean,char
引用类型:
类:当你看到一个类作为方法的返回值类型的时候,将来方法内部定义时应该返回该类的对象
抽象类:
接口:
*/
class TeacherDemo1{
public void fun1(){
System.out.println("雅俗共赏");
}
}
class TeacherDemo2{
public TeacherDemo1 show(){ //类:当你看到一个类作为方法的返回值类型的时候,将来方法内部定义时应该返回该类的对象
return new TeacherDemo1();
}
}
public class Teacher1 {
public static void main(String[] args) {
TeacherDemo2 t2 = new TeacherDemo2();
t2.show().fun1(); //t2.show返回的是一个TeacherDemo1对象,之后调用fun()方法
}
}
2.2抽象类:当你看到一个抽象类作为方法的返回值类型的时候,将来方法内部定义时应该返回该抽象类具体子类对象
演示:
/*
返回值类型
基本类型: 跳过
引用类型:
类:当你看到一个类作为方法的返回值类型的时候,将来方法内部定义时应该返回该类的对象
抽象类:当你看到一个抽象类作为方法的返回值类型的时候,将来方法内部定义时应该返回该抽象类具体子类对象
接口:
*/
abstract class TeacherDemo3 {
public void print() {
System.out.println("许嵩");
}
}
class TeacherDemo3Zi extends TeacherDemo3 {
}
class TeacherDemo4 {
public TeacherDemo3 show() {
return new TeacherDemo3Zi();
}
}
public class Teacher2 {
public static void main(String[] args) {
TeacherDemo4 t4 = new TeacherDemo4(); //第一种
t4.show().print();
TeacherDemo3 tt3 = t4.show(); //第二种
tt3.print();
}
}
3.3 接口:当你看到一个接口作为方法的返回值类型的时候,将来方法内部定义时应该返回实现该接口的具体子类对象
/*
返回值类型
基本类型: 跳过
引用类型:
类:当你看到一个类作为方法的返回值类型的时候,将来方法内部定义时应该返回该类的对象
抽象类:当你看到一个抽象类作为方法的返回值类型的时候,将来方法内部定义时应该返回该抽象类具体子类对象
接口:当你看到一个接口作为方法的返回值类型的时候,将来方法内部定义时应该返回实现该接口的具体子类对象
*/
interface JieKou2{
void jiSuan();
}
class JieKOuTmpl implements JieKou2 {
@Override
public void jiSuan() {
System.out.println("计算");
}
}
class Teacher3Demo{
public JieKou2 show(){
return new JieKOuTmpl() ;
}
}
class Test2{
public static void main(String[] args) {
Teacher3Demo t3 = new Teacher3Demo();
JieKou2 j2 = t3.show();
j2.jiSuan();
}
}
二.包
1.包:其实就是文件夹
2.作用:
(1)方便管理查找对应的文件
(2)让工程与工程之间的关系更加清晰,将来修改的时候方便一些
3.包的划分:
一般情况下,包会按照两种类型进行划分:
(1)按照角色划分
(2)按照功能划分
举例:
基于ssm的xxxx管理系统
老师(增删改查)
学生(增删改查)
一般情况下,包的划分是不会频繁更新的
1、按照角色划分
老师(包)
增加.java
删除.java
修改.java
查询.java
学生(包)
增加.java
删除.java
修改.java
查询.java
2、按照功能划分
增(包)
老师增加.java
学生增加.java
删(包)
老师删除.java
学生删除.java
改(包)
老师修改.java
学生修改.java
查(包)
老师查询.java
学生查询.java
3.SpringBoot结构:(面试题)
--Controller 主要是前端与后端的交互层
--entity(pojo) 实体类层
--dao 数据库操作接口层
--service 实现类接口层
--serviceImpl
--utils 工具类层
4.定义包的格式:
package 包名; (多级包用.分开即可)
注意事项: package语句必须是程序的第一条可执行的代码
package语句在一个java文件中只能有一个
如果没有package,默认表示无包名
5.导包
格式:import 包名;
注意: 这种方式导入是到类的名称。 虽然可以最后写*(表示导入一个包下所有的类),但是不建议。
6.权限修饰符
三.类及其组成可以用的修饰符
四种权限修饰符:public,protected,默认的,private
四. 内部类
1.概述:
把类定义在其他类的内部,这个类就被称为内部类。
2. 分类:
成员内部类:在类中方法外定义的类,叫做成员内部类
局部内部类:在方法内部定义的类,叫做局部内部类
3.创建成员内部类对象的语法:
成员内部类(非静态):
外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
演示:
class Outer1 {
//成员变量
private int a = 10;
//成员内部类
class Inner1 {
public void show() {
System.out.println(a); //在成员内部类可以获取成员变量
}
}
}
public class InnerDemo1 {
public static void main(String[] args) {
Outer1.Inner1 oi1 = new Outer1().new Inner1(); //创建内部类对象
oi1.show();
}
}
3.注意:
1、成员内部类(非静态)既可以访问外部类的中的成员变量,也可以是私有的成员变量
2、内部类都不会单独编译出一个class文件
3.成员内部类可以使用private关键字和static关键字进行修饰,如果内部类被privata修饰,则其他类中无法创建内部类的对象了
演示:
/*
成员内部类可以使用private关键字和static关键字进行修饰
*/
class Outer2 {
//如果内部类被privata修饰,则其他类中无法创建内部类的对象了
private class Inner2 {
public void fun1() {
System.out.println("庐州月光");
}
}
public void show(){
//创建成员内部类
Inner2 inner2 = new Inner2();
inner2.fun1();
}
}
public class InnerDemo2 {
public static void main(String[] args) {
Outer2 outer2 = new Outer2();
outer2.show();
}
}
4. 创建静态的成员内部类的对象语法:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
演示:
/*
创建静态的成员内部类的对象语法:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
*/
class Outer3 {
static class Inner3 { //class Inner3
public void show() {
System.out.println("千百度");
}
}
public void fun() {
Inner3 inner3 = new Inner3();
inner3.show();
}
}
public class InnerDemo3 {
public static void main(String[] args) {
//当内部类为静态
// 创建静态的成员内部类的对象语法:
// 外部类名.内部类名 对象名 = new 外部类名.内部类名();
Outer3.Inner3 oi3 = new Outer3.Inner3();
oi3.show();
// new Outer3.Inner3().show();
//
}
}
5.局部内部类:将类定义在类中方法的内部
演示:
package com.shujia.day09.InnerClass;
/*
局部内部类:将类定义在类中方法的内部
*/
class Outer4 {
int a = 80;
public void fun1() {
//局部变量
int a = 10;
//在这里定义的类,叫做局部内部类
class Inner4 {
public void show() {
// a = 40; // 在JDK1.8之后,方法中的局部变量在内部中无法修改
System.out.println(a);
System.out.println("孤芳自赏");
}
}
Inner4 inner4 = new Inner4();
inner4.show();
}
}
public class InnerDemo4 {
public static void main(String[] args) {
Outer4 outer4 = new Outer4();
outer4.fun1();
}
}
五.匿名内部类
1.匿名内部类的语法定义格式:
Xxx xx = new 类名/抽象类名/接口(){ 重写方法; }
演示:
abstract class Demo1{
abstract void show();
}
//class Demo1Zi extends Demo1{
// @Override
// void show() {
// System.out.println("我乐意");
// }
//}
class Demo2{
public void fun1(Demo1 demo1){
demo1.show();
}
}
public class NiminDemo2 {
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
demo2.fun1(new Demo1() { //匿名内部类
@Override
void show() {
System.out.println("年少初遇");
}
});
// demo2.fun1(new Demo1Zi());
}
}
匿名内部类的练习:
按照要求,补齐代码:
interface Inter { void show(); } class Outer { //补齐代码 } class OuterDemo { public static void main(String[] args) { Outer.method().show(); } } 要求在控制台输出”HelloWorld”
第一种(不用匿名内部类):
/*
interface Inter { void show(); }
class Outer { //补齐代码 }
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
*/
interface Inter {
void show();
}
class InterTmpl implements Inter {
public void show() {
System.out.println("hello world");
}
}
class Outer {
public static Inter method() {
return new InterTmpl(); //当你看到一个接口作为方法的返回值类型的时候,方法内部返回的是实现了该接口的具体子类对象
}
}
public class NiMIngTest {
public static void main(String[] args) {
//分析:
//1、发现method()直接可以通过Outer5类名的方式进行调用,说明method()是静态的
//2、发现调用完method()之后,可以继续调用show方法,而show方法在接口中,说明method()调用完毕之后返回的是Inter类型的对象
Outer.method().show();
}
}
第二种(使用匿名内部类):
/*
interface Inter { void show(); }
class Outer { //补齐代码 }
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
*/
//使用 匿名内部类改写
interface Inter1 {
void show();
}
class Outer1 {
public static Inter1 methond() {
return new Inter1() {
public void show() {
System.out.println("hello world");
}
};
}
}
public class NiMingTest2 {
public static void main(String[] args) {
Outer.method().show();
}
}