目录
注:final修饰的成员变量,在未初始化时,JAVA虚拟机不会为final修饰的变量默认初始化,因此必须在声明时立即初始化或者在构造方法中进行初始化。
注:static只能修饰成员变量,在修饰局部变量时,会报错。
注:当Child 继承Parent时,需要实现Parent接口中所有方法,任何实现继承接口的类,必须实现该接口继承的其他接口,除非类被声明为abstract。
判断两个对象是否相等,尽量使用equals()方法,而不是用==来判断是否对象相等,==也可能因为new新建的对象变化导致值相同,但报不同。
面向对象下
1.final关键字:
1.final修饰的类不能被继承,且final类中的所有成员方法都会被隐式地指定为final方法。
2.final修饰的方法不能被子类重写
3.final修饰的变量是常量,初始化后不能再修改
注:final修饰的成员变量,在未初始化时,JAVA虚拟机不会为final修饰的变量默认初始化,因此必须在声明时立即初始化或者在构造方法中进行初始化。
4.final与static的区别是啥(static关键字在第三项)
static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变
两次打印的j值都是一样的,而i的值却是不同的,因此final是永远不会改变的。
final关键字的好处
# final关键字提高了性能。JVM和Java应用都会缓存final变量。
# final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
# 使用final关键字,JVM会对方法、变量及类进行优化。
# final和abstract这两个关键字是反相关的,final类就不可能是abstract的
# 在匿名类中所有变量都必须是final变量
2.抽象类
1.用abstract修饰的方法,称为抽象方法,只有方法的声明,没有方法体;
用abstract修饰的类,称为抽象类,抽象类可以不包含任何抽象方法。
2.子类继承的父类为抽象类时,必须实现父类所有的抽象方法,否则子类必须声明为抽象类
abstract class A{//定义一个抽象类
public void fun(){//普通方法
System.out.println("存在方法体的方法");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
上面所说,就是一般的抽象类的说明,在写管理系统时经常要用到抽象类或者接口,先定义框架,然后在进行详细功能的实现
注:抽象类的使用原则如下:
(1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
(2)抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
(3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
3.抽象类中有构造方法么?
由于抽象类里会存在一些属性,那么抽象类中一定存在构造方法,其存在目的是为了属性的初始化。
并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。
4.外部抽象类不允许使用static声明,而内部的抽象类运行使用static声明。(关于static的介绍就在第三条)
package com.azhe.www;
static abstract class A{//在外部定义一个抽象类
public abstract void print();
}
class B extends A{
public void print(){
System.out.println("**********");
}
}
public class TestDemo {
public static void main(String[] args) {
A a = new B();//向上转型
a.print();
}
}
改程序无法正常运行,会报错,说明外部类不能用static声明
package com.azhe.www;
abstract class A{//定义一个抽象类
static abstract class B{//static定义的内部类属于外部类
public abstract void print();
}
}
class C extends A.B{
public void print(){
System.out.println("正确输出");
}
}
public class TestDemo {
public static void main(String[] args) {
A.B ab = new C();//向上转型
ab.print();
}
}
使用static声明的内部抽象类相当于一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称
结果程序正常运行,由此说明,内部的抽象类运行使用static声明,此时内部类相当于是一个外部类。
3.static关键字
1.静态变量
使用static修饰的变量将被类的所有对象共享,若未用static修饰属于具体对象独有
class Person{
int number;
public Persion()
{
number++;
}
}
public class TestNumber{
public static void main(string[]args){
Persion p1=new Persion();
Persion p2=new Persion();
System.out.println(p2.number);}
}
如上述代码,输出结果为1,因为p1与p2是分别对number加一。
class Person{
static int number;
public Persion()
{
number++;
}
}
public class TestNumber{
public static void main(string[]args){
Persion p1=new Persion();
Persion p2=new Persion();
System.out.println(p2.number);}
}
number加上static修饰后,输出结果为2,这是因为p1和p2同时对同一个number操作。
注:static只能修饰成员变量,在修饰局部变量时,会报错。
2.静态方法
静态方法只能访问静态方法或静态变量。
4.接口
1.JAVA中提供关键字interface来声明接口
提供关键字implements来实现接口
2.接口中定义的变量和方法都包含默认的修饰符,如下面代码所示:
interface Parent{
String name=null;//等价于 public static final String name;
void say();//等价于 public abstract void say();
}
3.接口的继承支持多继承;
注:当Child 继承Parent时,需要实现Parent接口中所有方法,任何实现继承接口的类,必须实现该接口继承的其他接口,除非类被声明为abstract。
下面是接口的声明及实现测试样例
package com.wz.interfacedemo;
interface A{//定义一个接口A
public static final String MSG = "hello";//全局常量
public abstract void print();//抽象方法
}
interface B{//定义一个接口B
public abstract void get();
}
class X implements A,B{//X类实现了A和B两个接口
@Override
public void print() {
System.out.println("接口A的抽象方法print()");
}
@Override
public void get() {
System.out.println("接口B的抽象方法get()");
}
}
public class TestDemo {
public static void main(String[] args){
X x = new X();//实例化子类对象
A a = x;//向上转型
B b = x;//向上转型
a.print();
b.get();
}
}
5.接口与抽象类的区别
注:接口一般不会写常量,如果有,要赋初值,如下图片所示。
字符串name若未赋初值,会报错。
6.instanceof关键字
JAVA提供关键字instanceof关键字来判断一个对象是否是一个类的(或接口)的实例,
表达式返回为boolean值,例如如下代码所示
public class COM {
public static void main(String[] args) {
B v = new B();
A a = v;
if(a instanceof B) {
System.out.println("start1");
}
}
}
interface A{
}
class B implements A{
}
}
7.object类
1.在Java语言里,Object类是所有类的父类
如果一个类没有指定父类,则它默认父类就是Object
2. toString()方法会默认返回一个描述该对象的字符串,由该对象的所属类名,@和对象的十六进制形式的内存地址组成,
也可自己重写toString方法来实现自己想要的功能,toString()是Object的一个方法,重写这个方法,可以在调试的时候快速显示对象的值。例如
package www.azhe.com;
public class Student
{
public String id;
public String name;
public boolean sex;
@Override
public String toString()
{
String s = "学号: " + id + ", 姓名: " + name ;
if ( sex )
{
s = s + "(男)";
}
else
{
s = s + "(女)";
}
return s;
}
}
Student stu = new Student();
stu.id = "52581";
stu.name = "azhe";
stu.sex = true;
System.out.println("学生信息: " + stu);
如图所示,程序运行结果如图所示,重写了tostring函数后,当字符串与Student对象拼接时,等效于:
System.out.println("学生信息: " + stu.toString() );
而其中stu.toString() ,就是将stu对象转成字符串显示。
3.equals()方法
判断两个对象是否相等,尽量使用equals()方法,而不是用==来判断是否对象相等,==也可能因为new新建的对象变化导致值相同,但报不同。
因此在比较两个对象是否内容相同时,一般使用equals,在写管理系统时,经常会用到equals()方法来比较输入的内容与存在的内容是否相同,如下所示:
8.多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
多态性是对象多种表现形式的体现。
-
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
- 方式一:重写:
- 这个内容已经在上一章节详细讲过,就不再阐述,详细可访问:Java 重写(Override)与重载(Overload)。
- 方式二:接口
生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。 - 方式三:抽象类和抽象方法
类型转换
子类转化为父类,可能丢失自己本身的原来的一些方法!
-
父类引用指向子类对象
-
把子类转换为父类,向上转型;不用强制转换
-
想把父类转化为子类,向下转型;需要强制转换,强制转换可能会丢失一些方法,此时只能调用父类的方法,子类的方法无法调用
public class Protion{
public static void main(String[] args) {
//类型之间的转化:基本类型转换 高转低(强转),低转高不需要强转
//父与子
//高 低
Person obj = new Student();
//student将这个对象转化为Student类型,就可以使用Student类型的方法了!
Student obj1 = (Student) obj;
obj1.print();
((Student) obj).print();
}
}
9.esclipe中的快捷键与食用方法
Alt+方向键
这也是个节省时间的法宝。这个组合将当前行的内容往上或下移动。在try/catch部分,这个快捷方式尤其好使
ctrl+m
大显示屏幕能够提高工作效率是大家都知道的,Ctrl+m是编辑器窗口最大化的快捷键。
ctrl+1
修改建议的快捷键
ctrl+T
查看一个类的继承关系树,是自顶向下的,再多按一次Ctrl+T, 会换成自底向上的显示结构。
提示:选中一个方法名,按Ctrl+T,可以查看到有这个同名方法的父类、子类、接口。
助记:"T"------->"Tree"----->"层次树"
Ctrl+O
查看一个类的纲要,列出其方法和成员变量。提示:再多按一次Ctrl+O,可以列出该类继承的方法和变量。
助记:"O"--->"Outline"--->"纲要"
ctrl+1Getter与Setter(写管理系统时实用!)
在Java里,类的属性一般设置为private。那么,外部还怎么访问属性的值呢?
Getter: 添加一个方法,用于读取该属性的值
Setter: 添加一个方法,用于设置该属性的值
方法的命名规则:
get + 属性名
set + 属性名
注意把属性名的首字母大写,如setNumber当写一个系统的时候,有时候也许你会需要些十七八个甚至更多的set或是get函数,注意,eclipse里可以自动添加 Getter/Setter!
如下图书管理系统所示,将书写大量set,get函数,可以使用快捷键来节省时间。
如下操作就可以创建set,get函数