目录
一:final关键字
1:final关键字是最终的意思,可以修饰类,成员变量,成员方法。
2:修饰类,类不能被继承
3:修饰变量,变量就变成了常量,只能被赋值一次
4:修饰方法,方法不能被重写
5:final修饰局部变量
在方法内部,该变量不可以被改变
在方法声明上,局部变量是值不能被改变, 引用类型是地址值不能被改变
6:final修饰变量的初始化时机在对象构造完毕前即可(可以在局部变量,构造代码块以及成员变量)
二:形式参数和返回值问题
1:形式参数
基本类型
引用类型(类,数组,接口)
类做形参时时,传入的应该是一个对象。
抽象类做形参,由于抽象类不能实例化所以应该有继承子类实例化并传入对象
接口做形参时,应该是传入的具体实现接口的类的实例化对象
2:返回值类型
基本类型
引用类型
类做返回值时,返回的应该是一个对象。
抽象类做返回值,由于抽象类不能实例化所以应该有继承子类实例化并返回对象
接口做返回值时,应该是返回具体实现接口的类的实例化对象
注意:应该用多态实例化对象
3:例子
1:数组做形参
package com.shujia.java.day2.proctice3;
public class Text1 {
public static void main(String[] args) {
int[] a={3,4,8,6,9,10,45};
int i = arrayMax(a);//调用arrayMax方法返回一个最大值
System.out.println("数组最大值为"+i);
}
/*定义一个方法arrayMax,传入的形参是数组,计算数组的最大值 */
public static int arrayMax(int[] a){
int max=0;
for (int i : a) {
if(i>max){
max=i;
}
}
return max;
}
}
2:类做形参
package com.shujia.java.day2.proctice3;
class Student{
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public Student() {
}
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(getName()+"**"+getAge());
}
}
public class Text2 {
public static void main(String[] args) {
Student student = new Student(20,"小华");//使用有参构造创建一个20岁叫小华的学生
showNews(student);//调用showNews方法传入学生对象
}
/* 定义一个方法传入的是Student类 */
public static void showNews(Student student) {
student.show();//调用show方法
}
}
3:抽象类做形参
package proctice3;
/*定义一个抽象类Person有姓名和年龄成员属性和show抽象方法,定义一个学生类继承Person抽象类*/
abstract class Person{
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public Person() {
}
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 abstract void show();
}
class Student1 extends Person{
public Student1(int age, String name) {
super(age, name);
}
public Student1() {
}
@Override
public void show() {
System.out.println(super.getName()+"**"+super.getAge());
}
}
public class Text3 {
public static void main(String[] args) {
Person person=new Student1(18,"小花");//多态实例化 Person创建一个18的小花对象
show(person);//调用show方法传入实例化对象
}
/*定义一个形参是Person抽象类的方法*/
public static void show(Person person){
person.show();//调用show方法
}
}
4:接口做形参
package proctice3;
/*定义一个学习接口,接口里有一个抽象方法学习,定义一个老师类实现学习接口*/
interface Study{
public abstract void study();
}
class Teacher implements Study{
@Override
public void study() {
System.out.println("老师需要学习");
}
}
public class Text4 {
public static void main(String[] args) {
Study s=new Teacher();//接口多态创建一个s对象
show(s);//将对象传入show方法
}
public static void show(Study study){//定义一个show方法传入的形参是接口
study.study();//调用study方法
}
}
5:返回值是数组
package proctice3;
public class Text5 {
public static void main(String[] args) {
int[] arr={1,5,2,3,4,9,0,19,12};
int[] sort = sort(arr);
System.out.print("[");
/*输出数组*/
for (int i : sort) {
if(i==sort[sort.length-1])
{ System.out.print(i+","+"]");}
else{
System.out.print(i+",");
}
}
}
/*定义一个冒泡排序对数组进行排序返回数组*/
public static int[] sort(int[] a){
for(int i=0;i<a.length;i++){
for(int j=0;j<a.length-i-1;j++){
if(a[j+1]<a[j]){
int tem=a[j];
a[j]=a[j+1];
a[j+1]=tem;
}
}
}
return a;
}
}
6:返回值是类
package proctice3;
//定义一个学生类
class Student3{
private int age;
private String name;
public Student3(int age, String name) {
this.age = age;
this.name = name;
}
public Student3() {
}
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(getName()+"**"+getAge());
}
}
public class Text6 {
public static void main(String[] args) {
Student3 s = show();//调用show方法
//利用set方法给对象赋值
s.setName("小华");
s.setAge(18);
s.show();//调用Student3的show方法
}
public static Student3 show(){//定义一个返回值是Student3类型的数据
return new Student3();//Student3的匿名对象
}
}
7:返回值是抽象类
package proctice3;
/*定义一个抽象类Person有姓名和年龄成员属性和show抽象方法,定义一个学生类继承Person抽象类*/
abstract class Person{
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public Person() {
}
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 abstract void show();
}
class Student1 extends Person{
public Student1(int age, String name) {
super(age, name);
}
public Student1() {
}
@Override
public void show() {
System.out.println(super.getName()+"**"+super.getAge());
}
}
public class Text3 {
public static void main(String[] args) {
Person person = show();//调用show方法返回 Person对象
//利用set方法赋值
person.setAge(18);
person.setName("小华");
//调用 Person的show方法
person.show();
}
/*定义一个形参是Person抽象类的方法*/
public static Person show(){
Person p=new Student1();//多态实例化 抽象类Person
return p;
}
}
7:返回值是接口
package proctice3;
/*定义一个学习接口,接口里有一个抽象方法学习,定义一个老师类实现学习接口*/
interface Study{
public abstract void study();
}
class Teacher implements Study{
@Override
public void study() {
System.out.println("老师需要学习");
}
}
public class Text4 {
public static void main(String[] args) {
Study study = show();//调用show方法
study.study();
}
public static Study show(){//定义一个show方法返回的是接口Study
Study s=new Teacher();//接口实例化创建对象
return s;
}
}