Final关键字
final 可以修饰的结构:类、方法、变量
用来修饰一个类,此类不能被其他类所继承
用来修饰方法:表明此方法不能被重写
用来修饰变量,此时的'变量'就称为一个常量
修饰属性、可以考虑赋值的位置:显示初始化、代码块初始化、构造器初始化
修饰局部变量 尤其是使用final修饰形参时,表明此形参是一个变量,当我们调用此方法,给常量形参赋值一个实参,一旦赋值以后,就只能在方法体内使用形参,但不能进行重新赋值
static final 表示用来修饰属性 全局变量
final所有的方法都不能被重写(但是可以被重载),所以不能同时使用abstract和final修饰类的方法,但是子类可以使用父类中final修饰的
static关键字的使用
static 关键字的使用
静态的
可以用来修饰属性、方法、代码块、内部类
使用static修饰属性: 静态变量
按照是否使用static修饰,又分为:静态属性 VS 非静态属性(实例变量)
实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性,但修改其中一个对象的非静态属性时,不会导致其他对象中同样的属性值的修改。
静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量,当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,时发生修改了的。
static 修饰属性的其他说明:
①静态变量随着类的加载而加载,可以用过"类.静态变量"的方式调用
②静态变量的加载要早于对象的创建
③由于类只会加载一次,则静态变量中在内存中也只会存在一份,存在方法区的静态域中
使用static修饰方法:静态方法
①随着类的加载而加载,可以通过"类.静态方法"的方式进行调用
②静态方法中只能调用静态的方法或属性
③非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
static注意点:
在静态方法中,不能使用this super关键字(this指明了本类中构造器的初始化,super代表了父类中的构造器中的初始化)(静态方法中static是随着类的加载而加载的,而super和this是随着对象创建而加载)(慢的可以加载快的,而快的不能加载慢的)
this关键字
this可以用来修饰:属性、方法、构造器、调用
this修饰属性和方法
this理解为:当前对象
在类的方法中,我们可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法。调用当前对象属性或方法。但是,通常情况下,我们都选择省略"this.变量"的方式,表明此变量是属性 ,而非形参。
this调用构造器
我们在类的构造器中,可以显示的使用"this(形参列表)"方式,调用本类中指定的其他构造器
构造器中不能通过"this(形参列表)"方式调用自己
'this.(形参列表)'必须声明在当前构造器的首行
构造器内部,最多只能声明一个"this(形参列表)"用来调用其他构造器(因为this和super只能在方法体内声明一个,而且必须是首行)
注意事项:
只能在构造方法中使用this()调用其他的构造方法,不能在成员方法中使用
不能再一个类中的两个构造方法中使用this()互相调用
super关键字
super可以用来调用:属性、方法、构造器;
super的使用:
我们可以再子类的方法或构造器中,通过使用"super.属性"或"super.方法"的方式,显示的调用
特殊情况:当子类和父类中定义了同名的束形式,我们要再子类中调用父类欧洲那个声明的属性,则必须显示的使用"super.属性"的方式,表明调用是父类中声明的属性;
super调用构造器:
我们可以再子类的构造器中显示的使用"super(参数列表)"的方式,调用父类中声明的指定的构造器
"super(形参列表)"的使用,必须声明再子类构造器的首行
我们再类的构造器中,针对于"this(形参列表)"或"super(形参列表)"只能二选一,不能他同时出现。
在构造器的首行,没有显示的声明"this(形参列表)"或"super(形参列表)", 则默认调用的是父类空参的
在类的多个构造器 中,至少有一个类的构造器中使用了"super(形参列表)".调用父类中的构造器
包装类的转化
Integer in1=new Integer("123");
Integer in2=new Integer("123aa");
System.out.println(in1.toString());
Boolean b1=new Boolean(true);
Boolean b1=new Boolean(1);
Boolean b1=new Boolean(false);
除以一以外的任何数字
Boolean b1=new Boolean(x);
Integer in1=new Integer(11);
int i1=in1.Value();
Float fl1=new Float(12.3);
float f1=fl1.floatValue();
int num1=10;
Integer interger =new Integer(num1);
mother(integer);
int num2=10;
Integer integer=num2;
boolean b1=true;
Boolean b2=b1;
Integer integer = 20;
int i1=integer;
System.out.print((int)integer);
int num=10;
String str1=num+"";
float f1=12.3f;
String str2=String.Vauleof(f1);
Double d1=new Double(12.5);
String str3=String.valueof(d1);
String str1="123";
int num1=Integer.parseInt(str1);
String str2="true";
boolean b1=Boolen.parseBoolean(str2);
多态性
理解多态性:
理解多态性:可以理解为一个事务的多种形态。
何为多态性:对象的多态性,父类的引用指向子类的对象(或子类的对象赋给父类的引用)
多态的使用,虚拟方法调用
有了对象的多态性以后,我们再百年一起,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法
总结:编译,看左边,运行,看右边;
多态性使用的前提①要有类的继承关系②要有方法的重写;
对象的多态性:只适用于方法,不适用于属性(编译和运行都看左边);
若子类重写了父类方法,就意味着类里定义的方法彻底覆盖了父类里的同名方法;
系统将不可能把父类里的方法转移到子类中,运行看有右边;
对于实例变量则不存在这样的现象,即使子类里定义与父类完全相同的实例变量;
这个实例变量依然不可能覆盖父类中顶一的实例变量,编译运行都看左边;
Man m1=(Man)p2;
m1.isSmoking=true;
面向对象
接口
package 接口;
public class USBTest {
public static void main(String[] args) {
Computer com=new Computer();
Flash flash=new Flash();
com.transferData(flash);
com.transferData(new Printer());
USB phone = new USB(){
@Override
public void start() {
System.out.println("手机开始工作");
}
@Override
public void stop() {
System.out.println("手机结束工作");
}
};
com.transferData(new USB(){
@Override
public void start() {
System.out.println("巩固走");
}
@Override
public void stop() {
System.out.println("结束");
}
});
}
}
class Computer{
public void transferData(USB usb){
usb.start();
System.out.println("具体输出数据的细节");
usb.stop();
}
}
interface USB{
void start();
void stop();
}
class Flash implements USB{
@Override
public void start() {
System.out.println("U盘开启工作");
}
@Override
public void stop() {
System.out.println("U盘结束工作");
}
}
class Printer implements USB{
@Override
public void start() {
System.out.println("打印机开启工作");
}
@Override
public void stop() {
System.out.println("打印机结束工作");
}
}
代理模式
package 接口;
public class NetWorkTest {
public static void main(String[] args) {
Server server=new Server();
ProxyServer proxyServer=new ProxyServer(server);
proxyServer.browse();
}
}
interface NetWork{
void browse();
}
class Server implements NetWork{
@Override
public void browse() {
System.out.println("真实的网络");
}
}
class ProxyServer implements NetWork{
private NetWork work;
public ProxyServer(NetWork work){
this.work=work;
}
public void check(){
System.out.println("联网之前的检查工作");
}
@Override
public void browse() {
check();
work.browse();
}
}
匿名类
package 内部类;
public class InnerClassTest {
public static void main(String[] args) {
Person.Dog dog =new Person.Dog();
dog.show();
Person person=new Person();
Person.Bird b =person.new Bird();
b.sing();
}
}
class Person{
String name;
int age;
public void eat(){
System.out.println("人,吃饭");
}
static class Dog{
String name;
int age;
public void show(){
System.out.println("往往");
}
}
class Bird{
String name;
public Bird(){
}
public void sing(){
System.out.println(Person.this.name);
System.out.println("我是一只鸟");
Person.this.eat();
}
}
{class AA{}}
public void method(){
class BB{}
}
public Person(){
class CC{}
}
public Comparable getComparable(){
return new Comparable() {
@Override
public int compareTo(Object o) {
return 0;
}
};
}
}