day03 【修饰符,内部类,参数传递】
今日内容介绍
final关键字
static关键字
访问权限
内部类
引用类型参数
第一章 final关键字
1.1 final的概述【重点】
final关键字: 代表最终的,不可改变
可以修饰的内容:
1.类:
不可以被继承,不能够有子类
看: MyString和MyArrayList
称之为太监类: 不能有子类,但是有父类
2.方法:
不能被子类覆盖重写
3.变量: 只能赋值一次,不可以进行第二次赋值,变量的值是不可以发生改变的 常量
1.2 final修饰的类的特点【重点】01
final修饰的类的特点
该类不可以被继承,不能有子类
public final class Fu01 extends Object {
public void method() {
System.out.println("Fu01...method...");
}
public void show() {
System.out.println("Fu01...show...");
}
}
public class Zi01 {
}
public class MyString {
}
public class MyArrayList extends ArrayList {
public MyArrayList(int initialCapacity) {
super(initialCapacity);
}
public MyArrayList() {
}
public MyArrayList(Collection c) {
super(c);
}
}
1.3 final修饰的方法的特点【重点】02
被final修饰的方法: 不能被子类覆盖重写
public class Fu02 {
public final void method() {
System.out.println("Fu02...method...");
}
public void show() {
System.out.println("Fu02...show...");
}
}
public class Zi02 extends Fu02 {
@Override
public final void show() {
System.out.println("Zi02...show...");
}
}
public class Demo02FinalMethod {
public static void main(String[] args) {
Zi02 zi02 = new Zi02();
zi02.method();
zi02.show();
}
}
1.4 final修饰的变量的特点【重点】03
final修饰变量:
1.特点: 只能赋值一次,不可以进行第二次赋值,变量的值是不可以发生改变的 常量
2.修饰局部变量(方法内部定义的变量):
(1)基本类型: 基本类型变量中存储的具体的数字是不可以被改变的
(2)引用类型: 存储的对象的地址值,被final修饰后,说明变量存储的对象的地址值是不可以被改变的
但是该地址代表的内存空间中的内容是可以改变的
3.成员变量: 看MyClass03 认为默认值无效,要么显式赋值,要么构造方法中赋值
(1)定义未赋值:
所有构造方法中,必须完成对final修饰的变量的赋值
所有成员方法中,不能修改final修饰的变量的值
(2)定义并赋值:
所有构造方法/成员方法中,不能修改final修饰的变量的值
public class Demo03FinalVar {
public static void main(String[] args) {
final int num = 10;
System.out.println(num);
final int num2;
num2 = 100;
System.out.println(num2);
System.out.println("--------------");
final Student stu = new Student("张三", 18);
stu.show();
stu.setName("李四");
stu.setAge(28);
stu.show();
System.out.println("-------------");
final int[] arr = new int[]{10,20,30};
System.out.println(Arrays.toString(arr));
for (int i = 0; i < arr.length; i++) {
arr[i] *= 10;
}
System.out.println(Arrays.toString(arr));
}
}
public class Demo03FinalVar2 {
String name;
final int num;
final int num2 = 20;
public Demo03FinalVar2() {
num = 10;
}
public Demo03FinalVar2(String name) {
this.name = name;
num = 10;
}
public void show() {
}
}
1.5 权限修饰符 04
在java中有四种权限修饰符:范围从大到小分别是:public、protect、default(friendly)、private
作用域 | public | protected | 默认(什么都不写) | private |
---|
在同一个类中 | √ | √ | √ | √ | 在同一个包中(子类/无关类) | √ | √ | √ | | 不同包的子类 | √ | √ | | | 不同包的无关类 | √ | | | |
public class Fu04 {
public int a = 1;
protected int b = 11;
int c = 111;
private int d = 1111;
public void show() {
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
public class Zi04 extends Fu04 {
public void method() {
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
public class Demo04QuanXian {
public static void main(String[] args) {
Fu04 fu04 = new Fu04();
System.out.println(fu04.a);
System.out.println(fu04.b);
System.out.println(fu04.c);
}
}
public class Zi0402 extends Fu04 {
public void fun() {
System.out.println(a);
System.out.println(b);
}
}
public class Demo04WuGuan {
public static void main(String[] args) {
Fu04 fu04 = new Fu04();
System.out.println(fu04.a);
}
}
第二章 static关键字
2.1 static关键字的概念【重点】
static关键字:
1.概念:
被该类的所有对象共享使用,不依赖于某个具体的对象,和对象无关,依赖于类,在内存中唯一只有一份
2.类的加载过程:
第一次使用new创建Student类的对象时,首先检查.class文件,是否被加载到方法区中,如果没有,把
Student类的.class文件加载到方法区中(此时还没有对象),如果.class文件中有static静态修饰的内容,
会把static静态修饰的内容,加载方法区的静态区中,并且要完成静态成员的初始化然后: 才进行对象的创建
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMn9VqZ4-1643037451879)(img/1600693937764.png)]
2.2 static修饰成员变量的使用【重点】
static修饰修饰成员变量(类变量: 依赖于类,与对象无关)
1.定义格式:
static 数据类型 变量名称 = 数据值;
2.使用格式:
类名.静态成员变量名称; 推荐使用
对象名.静态成员变量名称; 不推荐使用
2.3 static修饰成员方法的使用【重点】05
static修饰成员方法(类方法: 依赖于类,与对象无关)
1.定义格式:
public static 返回值类型 方法名称(参数列表...) {...}
2.使用格式:
类名.静态成员方法名称(...) 推荐使用
对象名.静态成员方法名称(...) 不推荐使用
3.注意:
静态成员变量也有默认初始化值
public class JavaEE372Student {
String name;
static String room;
public static void show() {
System.out.println("班级: "+room);
}
}
public class Demo05Static {
public static void main(String[] args) {
System.out.println(JavaEE370Student.room);
JavaEE372Student stu = new JavaEE372Student();
System.out.println(stu.room);
System.out.println("---------");
JavaEE372Student.room = "HMTBD1002";
System.out.println(JavaEE372Student.room);
System.out.println(stu.room);
System.out.println("---------");
JavaEE372Student stu2 = new JavaEE372Student();
stu2.room = "HMTBD1003";
System.out.println(stu.room);
System.out.println(stu2.room);
System.out.println(JavaEE372Student.room);
System.out.println("---------");
JavaEE372Student.show();
stu.show();
}
}
2.4 静态的注意事项【了解】06
静态的内容只能使用静态的内容,不能使用非静态的内容
1.解释:
(1)静态当中不能使用非静态
(2)静态的内容,是最先被加载到内存方法区中的静态区中,并完成初始化,但是此时没有对象(非静态的内容存在 于对象中)既然没有对象,就不能使用非静态的内容
(3)静态(先人),非静态(后人)
2.静态的注意事项
(1)静态方法可以直接访问静态变量和静态方法。
(2)静态方法不能直接访问非静态成员变量或成员方法。反之,成员方法可以直接访问静态变量或静态方法。
(3)静态方法中,不能使用this关键字。
public class HMTeacher {
String name;
static String country = "CHINA";
public static void show() {
System.out.println("国籍: "+country);
method();
}
public static void method() {
System.out.println("静态方法...method...");
}
public void printName() {
System.out.println("姓名: "+name+", 国籍: "+country);
show();
}
}
public class Demo06StaticNotice {
public static void main(String[] args) {
HMTeacher ht = new HMTeacher();
ht.printName();
}
}
2.6 静态代码块【重点】07
静态代码块
1.格式:
static {
...
}
2.特点:
(1)假如只创建对象,静态代码块会优先于构造方法执行,唯一执行一次
(2)静态代码块,随着类的加载而加载并唯一执行一次
(3)完成静态成员变量的赋值
(4)静态代码块,仍然属于静态内容,内部不能使用非静态
(5)完成项目的初始化工作
public class Demo07StaticKuai {
public static void main(String[] args) {
System.out.println(Person.country);
}
}
public class Person {
String name;
static String country = "CHINESE";
public Person(){
System.out.println("空参构造被执行了...");
}
static {
System.out.println("静态代码块执行了...");
country = "CHINA";
init();
}
public static void init() {
System.out.println("项目正在完成初始化,需要稍等10秒钟....");
for (int i = 10; i > 0; i--) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
System.out.println("项目初始化完成,你可以尽情使用了....");
}
}
第三章 内部类【了解】
3.1 内部类的概念
内部类概念:
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
举例:
汽车(外部类)内部有个发动机(内部类)
人体(外部类)内部有心肝脾肺肾(内部类)
定义一个类来描述一个事物时,该类的内部又定义了一个/多个类来描述其内部的事物
一个东西(外部类)内部包含另外一个/多个东西(内部类)
分类:
1.成员内部类: 定义在外部类的成员位置(和成员变量/成员方法 地位相同)
可以使用: public/private/static进行修饰
2.局部内部类: 定义在外部类的方法内部,该内部类出了方法就没有用了
3.2 成员内部类的定义和使用 08
public class Person {
int age;
private boolean liveAble = true;
public class Heart {
public int num;
public Heart() {
}
public void jump() {
if (liveAble) {
System.out.println("我的小心脏那个扑通扑通的跳啊.....");
} else {
System.out.println("我的小心脏剧烈的痛呢? 来颗速效救心丸,否则哥们罢工....");
}
}
}
public Person() {
}
public void setAge(int age) {
this.age = age;
}
public void setLiveAble(boolean liveAble) {
this.liveAble = liveAble;
}
}
public class Demo08InnerClass {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p.num);
Person.Heart h = p.new Heart();
h.jump();
p.setLiveAble(false);
h.jump();
Person.Heart h2 = new Person().new Heart();
h2.jump();
new Person().setLiveAble(false);
h2.jump();
}
}
3.3 内部类中3个重名变量的使用 08
内部类中3个重名变量的使用
直接写变量名: 方法内部局部变量
this.变量名: 内部类成员变量
Outer.this.变量名: 外部类成员变量
public class Outer {
int num = 1;
public class Inner {
int num = 11;
public void show() {
int num = 111;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}
public class Demo02InnerClass {
public static void main(String[] args) {
Outer.Inner inner = new Outer().new Inner();
inner.show();
}
}
3.4 匿名内部类引入 09
public interface FlyAble {
public abstract void fly();
}
public class Bird implements FlyAble {
@Override
public void fly() {
System.out.println("鸟儿在空中自由的翱翔....");
}
}
public class Demo03NiMing {
public static void main(String[] args) {
FlyAble flyAble = new Bird();
flyAble.fly();
}
}
3.5 匿名内部类的使用 10
public abstract class Animal {
public abstract void eat();
public abstract void sleep();
}
public class Demo10AbstractNiMing {
public static void main(String[] args) {
new Animal(){
@Override
public void eat() {
System.out.println("小狗在吃....");
}
@Override
public void sleep() {
System.out.println("小狗在睡....");
}
};
new Animal(){
@Override
public void eat() {
System.out.println("小狗在吃....");
}
@Override
public void sleep() {
System.out.println("小狗在睡....");
}
}.eat();
new Animal(){
@Override
public void eat() {
System.out.println("小狗在吃....");
}
@Override
public void sleep() {
System.out.println("小狗在睡....");
}
}.sleep();
new Animal(){
@Override
public void eat() {
System.out.println("小狗在吃....");
}
@Override
public void sleep() {
System.out.println("小狗在睡....");
}
public void kanHome() {
System.out.println("小狗在看家....");
}
}.kanHome();
Animal a = new Animal() {
@Override
public void eat() {
System.out.println("小猫在吃....");
}
@Override
public void sleep() {
System.out.println("小猫在睡....");
}
public void catchMouse() {
System.out.println("小猫在逮老鼠....");
}
};
a.eat();
a.sleep();
}
}
第四章 引用类型的传递【重点】
4.1 类作为方法的参数 11
public class Student {
private String name;
private int age;
}
public class Demo11ClassParam {
public static void main(String[] args) {
Student stu = new Student("张三", 18);
show(stu);
}
public static void show(Student stu) {
System.out.println(stu.getName() + "::" + stu.getAge());
}
}
类作为方法的参数的图解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IeVEjzIF-1643037451880)(img/1600762962832.png)]
4.2 类作为方法的返回值 11
public class Demo11ClassParamReturn {
public static void main(String[] args) {
Student stu = getStudent();
show(stu);
}
public static Student getStudent() {
Student stu = new Student("张三", 18);
return stu;
}
public static void show(Student stu) {
System.out.println(stu.getName() + "::" + stu.getAge());
}
}
类作为方法的返回值图解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mdl3Aqq8-1643037451881)(img/1600764478447.png)]
4.3 抽象类作为方法的参数 12
public class Demo12AbstractParam {
public static void main(String[] args) {
Animal a = new Dog();
show(a);
}
public static void show(Animal a) {
a.eat();
a.sleep();
}
}
public abstract class Animal {
public abstract void eat();
public abstract void sleep();
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("小狗吃骨头....");
}
@Override
public void sleep() {
System.out.println("小狗睡觉....");
}
}
4.4 抽象类作为方法的返回值 12
public class Demo13AbstractParamReturn {
public static void main(String[] args) {
Animal a = getAnimal();
show(a);
}
public static Animal getAnimal() {
Animal a = new Dog();
return a;
}
public static void show(Animal a) {
a.eat();
a.sleep();
}
}
4.5 接口作为方法的参数 13
public class Demo13InterParam {
public static void main(String[] args) {
SmokeAble smokeAble = new SmokeAbleTeacher();
show(smokeAble);
}
public static void show(SmokeAble smokeAble) {
smokeAble.somking();
}
}
public interface SmokeAble {
void somking();
}
public class SmokeAbleTeacher implements SmokeAble {
@Override
public void somking() {
System.out.println("老师课后一支烟,课上活神仙....");
}
}
4.6 接口作为方法的返回值 13
public class Demo14InterParamReturn {
public static void main(String[] args) {
SmokeAble smokeAble = getSmokeAble();
show(smokeAble);
}
public static SmokeAble getSmokeAble() {
SmokeAble smokeAble = new SmokeAbleTeacher();
return smokeAble;
}
public static void show(SmokeAble smokeAble) {
smokeAble.somking();
}
}
|