文章目录
基本内容
- final关键字
- 匿名对象
- 内部类
- 四种访问修饰符
- 类和接口作为参数和返回值
final关键字
- 修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值,意味着该变量成为了常量。
final int MAX_SPEED = 120;
- 修饰方法:该方法不可被子类重写。但是可以被重载!
final void study(){}
- 修饰类: 修饰的类不能被继承,可以继承别的类(如抽象类和普通类和实现类)。比如:Math、String等。
final class A {}
final修饰成员变量时,可以在下面三种情况下进行初始化:
- 声明时直接初始化
- 在初始化程序块中初始化
- 在构造方法中初始化
public class hello{
final int a = 1;
final int b;
final int c;
{
b = 2;
}
public hello(){
c = 3;
}
/*
public hello(int x){
c = x;
}
*/
}
final修饰引用数据类型时,表示这个类的地址不能改变,但是里面的数值是可以改变的。
定义静态常量
在类中定义静态常量:
public static final 数据类型 变量名 = 值;
变量名全部大写,多个单词使用_进行连接
- 在类中所有的成员变量全是静态常量。由于接口中没有构造方法,定义的变量全是静态常量,默认使用public static final修饰。
匿名对象
匿名对象:
没有名字的对象。
匿名对象是指创建对象时,只有创建对象的语句,却灭有把对象地址赋值给某个变量。
格式如下:
new Person().showMessage();
当然,你也可以通过Person创建一个实例对象后,再去调用Person类中的方法,具体如下:
Person p = new Person(); //创建对象p.
//给对象的各个属性赋值。
p.name = "蛋蛋";
p.age = 6;
p.height = 1.1;
//调用类中的方法
p.showMessage();
匿名对象的使用场景:
(1)类中的方法仅被对象调用一次。
new Person().showMessage(); //showMessage方法被对象调用一次的时候.
(2)匿名对象做实参传递。
Person.show(new Person()); //匿名对象做实际参数。
匿名对象与非匿名对象对属性赋值的区别:
首先,看下面的代码,你感觉两者之间的区别是什么?
//非匿名对象
Person p = new Person();
p.name = "蛋蛋";
p.age = 6;
p.height = 1.1;
//匿名对象
new Perosn.name = "花花";
new Perosn.age = 21;
new Perosn.height = 1.2;
两者的最大区别:非匿名对象只是给对象p的三个属性赋值;匿名对象在给三个匿名对象的不同属性(单个属性)赋值。
匿名对象的内存分析:
非匿名对象:
匿名对象:
注意事项
- 两个匿名对象不可能是同一个对象
- 一般不给匿名对象赋予属性值,因为永远无法获取到
- 匿名对象执行完毕后,由于再无引用引用之,Java的自动回收机制会视作垃圾处理。
内部类
在Java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。
什么是内部类:
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类
匿名内部类
定义方式
抽象类或接口名 变量名 = new 抽象类或接口(){
将抽象类或接口中的抽象方法进行重写,可以调用
};
变量名.重写的方法
接口:
public interface AnonyInterface {
void face();
}
测试类:
public class AnonyMousClass {
public static void main(String[] args) {
AnonyInterface p = new AnonyInterface() {
@Override
public void face() {
System.out.println("这是脸");
}
};
p.face();
}
}
权限(四种访问修饰符)
-
private:
Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的属性以及方法只能被该类的对象 访问,其子类不能访问,更不能允许跨包访问。
-
default:
即不加任何访问修饰符,通常称为“默认访问权限“或者“包访问权限”。该模式下,只允许在同一个包中进行访问。
-
protected:
介于public 和 private 之间的一种访问修饰符,一般称之为“保护访问权限”。被其修饰的属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
-
public:
Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且 允许跨包访问。
同一个类 | 同一个包 | 不同包的子类 | 不同包的非子类 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
default(默认) | √ | √ | ||
private | √ |
类作为参数传递和返回值
类作为参数进行传递:
public class Test01 {
private int age;
private String name;
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 class Test02 {
public void run(Test01 p,String name , int age){
p.setAge(age);
p.setName(name);
System.out.println("年龄是:"+p.getAge()+"姓名是:" + p.getName());
}
}
public class ReferenceDataDemo {
public static void main(String[] args) {
Test01 p = new Test01();
Test02 t = new Test02();
t.run(p,"王五",236);
}
}
年龄是:236姓名是:王五
类作为返回值进行传递
public class Test01 {
private int age;
private String name;
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 class Test02 {
public Test01 run(String name, int age){
Test01 t = new Test01();
t.setAge(age);
t.setName(name);
System.out.println("年龄是:"+t.getAge()+"姓名是:" + t.getName());
return t;
}
}
public class ReferenceDataDemo {
public static void main(String[] args) {
Test02 t = new Test02();
Test01 p;
p = t.run("xiaohong",265);
System.out.println(p.getAge()+ p.getName());
}
}
年龄是:265姓名是:xiaohong
265xiaohong