第一章 final关键字
1.1 概述
学习继承之后,我们可以通过子类在父类的基础上行修改父类内容,但是我们不能继承jdk中提供的类,改他的内容。为了避免这种随便写的情况。java提供了关键字final关键字,用来修饰不可以改变的内容。
-
final: 不可以改变的。 可以用来修饰类、方法和变量。
-
类:被修饰的类,不能被继承
-
方法:被修饰的方法,不能被重写
-
变量:被修饰的变量,不能被重新赋值。
-
1.2使用方式
修饰类
格式
final class 类名{
}
jdk中String,Scanner,Math 等学过的类 都被final修饰,目的就是给你用,你别改。
修饰方法
格式
修饰符 final 返回值类型 方法名(参数列表){
//方法体
}
重写被final修饰的方法,编译时就会报错。
修饰变量
局部变量:只在当前大括号中能使用
全局变量:能在整个类中使用
-
修饰局部变量---- 基本类型
//声明变量,使用final修饰
final int a ;
//第一次赋值
a=10;
//a=20; 第二次赋值报错
final int b =10;//声明并第一层赋值
//b=20;//第二次赋值报错
final int c =0;
for(int i =0 ;i<10;i++){
c=i;//第二次赋值,报错
System.out.println(c);
}
for(int i =0 ;i<10;i++){
final int c =i ;//每循环一次定义一个变量c并赋值一次,不报错
System.out.println(c);
}
每次循环都是一个新的变量c所以方式二通过编译;
-
局部变量--引用类型
引用类型的局部变量,被final修饰之后,只能指向一个对象,地址值不能修改,但是不影响对象内部的成员变量值的修改;
public class Demo02 {
public static void main(String[] args) {
//创建Animal对象
final Animal animal= new Animal();
System.out.println(animal);
// animal=new Animal(); 报错 指向了新的对象,地址值改变
//System.out.println(animal);
animal.setName("张3");
System.out.println(animal.getName());//可以修改
animal.setName("李4");
System.out.println(animal.getName());
}
}
-
成员变量
成员变量涉及到初始化的问题,初始化方式只有两种;
1.显示初始化
private String name;
//显示初始化
final String address="张三";
2.构造方法初始化
final String address;
public Animal() {
this.address="";
}public Animal(String name, String address) {
this.name = name;
this.address = address;
}
被final修饰的常量名称 ,一般都有书写规范,默认所有字母大写;
第二章 static关键字
2.1概述
static是静态修饰符,一般修饰成员。被static修饰的成员属于类,不属于单个的类的某个对象。static修饰的成员可以被多个对象共享。static修饰的成员属于类,但是会影响每一个对象。被static修饰的成员叫做类成员,不是对象的成员。
2.2定义和使用格式
类变量
当static成员变量时,该变量称之为类变量。该类的每个对象都能共享同一个类变量的值。任何对象都可以更改类变量的值。也可以在不创建类的对象的情况下对类变量进行操作。
-
类变量: 就是使用static修饰的成员变量。
-
定义格式:
static 数据类型 变量名;
static String school;
public static String school="abc";
//类变量,记录学生学习的学校
System.out.println(Student.school);//abc
Student.school="def";
System.out.println(Student.school);//def
静态方法
当static 修饰成员方法时,该方法称之为类方法。静态方法在声明时有static,建议使用类名来调用,不需要创建类的对象。
类名.方法名();
Student.study();
-
注意事项:
-
静态方法可以直接访问类变量和静态方法。
-
静态方法不能直接访问普通成员变量和普通成员方法,反之,成员方法可以直接访问类变量或者静态方法。
-
静态方法中,不能使用this关键字。
-
2.3静态原理图解。
static修饰的内容:
-
是随着类加载的 ,且只加载一次。
-
存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。
-
它优先于对象存在,所以,可以被所有对象共享。
2.4静态代码块。
-
静态代码块:定义在成员位置,使用static修饰的代码块{}
-
位置:类中方法外
-
执行:随着类的加载而执行且执行一次,优先于构造方法的执行。
-
-
格式:
public class Person {
private String name ;
private int age;
public Person() {
System.out.println("我是空参构造");
}
// 静态代码块
static {
System.out.println("我是静态代码块 我执行了");
System.out.println("我是静态代码块 我执行了");
System.out.println("我是静态代码块 我执行了");
System.out.println("我是静态代码块 我执行了");
System.out.println("我是静态代码块 我执行了");
}
}
第三章 权限修饰符
3.1概述
在java中提供了四种访问权限,使用不同的访问权限修饰符时,被修饰的内容会有不同的访问权限。
-
public : 公共的
-
protected: 受保护的
-
default: 默认的
-
private: 私有的
3.2不同权限的访问能力
public | protected | default(空) | private | |
同一个类中 | Yes | Yes | Yes | Yes |
同一个包中(子类与无关类) | Yes | Yes | Yes | |
不同包中的子类 | Yes | Yes | ||
不同包中的无关类 | Yes |
编写代码时,建议大家,这样使用;
-
成员变量使用private;
-
隐藏细节
-
-
构造方法使用public;
-
方便创建对象
-
-
成员方法使用public;
-
方便调用。
-
第四章 内部类
4.1概述
将一个类A定义在类B里面,里面的那个类A就是内部类,B称之为外部类
4.2成员内部类
-
成员内部类:定义在类中方法外的类
定义格式:
class 外部类{
class 内部类{
}
}public class Car { //外部类
class FaDongJi{//内部类}
}
访问特点:
-
内部类可以直接访问外部类的成员(成员变量和成员方法),包括私有成员。即可以在写内部类时直接用到外部类中的变量和方法。
-
外部类要访问内部类的成员,必须要创建内部类的对象
创建内部类对象格式:
外部类名.内部类名 对象名=new 外部类型().new 内部类型();
public class Car { //外部类
private boolean run = true;
public boolean isRun(){
return run;
}
class FaDongJi {//内部类
public void drive() {
if (run) {
System.out.println("在跑");
} else {
System.out.println("不跑");
}
}
}
}
public class Demo {
public static void main(String[] args) {
//创建外部类对象
Car c =new Car();
//创建内部类对象
Car.FaDongJi faDongJi =c.new FaDongJi();
//外部类创内部对象调内部方法
faDongJi.drive();
//外部类调外部方法
boolean run = c.isRun();
System.out.println("run = " + run);
}
}
4.3匿名内部类
匿名内部类:是内部类的简化写法,本质是一个带具体实现的父类或者接口的匿名的子类对象
比如接口举例,当使用接口时
-
定义实现类
-
重写接口中的方法
-
创建实现类对象
-
调用重写方法
匿名内部类可以把这四步简化成一步
前提:
存在一个类或者接口,类可以是抽象类也可以是具体类
格式:
new 父类名或者接口名(){
//重写方法
@Override
public void method(){
//执行
}
};
使用案例:
public abstract class Fly {
public abstract void fly();
}
public class FlyDemo {
public static void main(String[] args) {
Fly fly=new Fly() {
@Override
public void fly() {
System.out.println("起飞");
}
};
fly.fly();
}
}
//运行结果:
//起飞
public interface USB {
public void open();
}
public class USBDemo {
public static void main(String[] args) {
new USB(){
@Override
public void open() {
System.out.println("打开了");
}
}.open();
}
}
//运行结果:
//打开了
第五章 引用类型作为方法参数
5.1类名作为方法的参数和返回值
-
类作为方法的形参
-
方法的形参是类,需要的是类的对象
-
传递的是对象的地址值
-
-
类作为返回值
-
方法的返回值如果是类,需要的也是该类的对象
-
传递的是对象的地址值
-
public class Car {
public void fly(){
System.out.println("车飞了");
}
}
public class Demo05 {
public static void main(String[] args) {
method(new Car());//调用了fly方法
Car car = method2();
System.out.println("car = " + car);//打印的对象car地址值
}
//类做形参
public static void method(Car c){
c.fly();
}
//类做返回值
public static Car method2(){
return new Car();
}
}
5.2接口作为形参和返回值
-
接口作为形参和返回值
-
方法的形参是接口名,需要的是接口的实现类对象
-
返回值是接口,需要的是接口的实现类对象
-
/**1.Outer.method()说明是method是静态方法
* 2.调用完方法发现还能调用,说明method返回的是一个对象且该对象能调用show方法
* 3还要对接口中的抽象方法重写
*/
public class Demo {
public static void main(String[] args) {
Outer.method().show();
}
}
interface Inter {
void show();
}
class Outer {
public static Inter method(){
return new Inter(){
public void show(){
System.out.println("哈喽");
}
};
}
}