- 全局变量有默认值(new对象中会有初值0),局部变量没有默认值全局变量只能声明和创建语句,不能有赋值语句。局部变量可以有赋值语句
public class demo{
public static void main(String[] args) {
int x;
x = 1; //在main方法中是正确的,出了main方法就错了
int y = 1;
}
}
构造方法没有类型,必须要以类的名字来命名。如果没有声明,就默认声明一个没有参数没有语句体的构造方法。类中可以有多个构造方法,但是参数必须要不同,此时在创建对象的时候可以选用不同的构造方法用new声明的对象叫做对象的一个引用,分配给对象的变量叫做对象的实体 //new a = Zimu() //(a是引用) (Zimu是一个实体)引用类型的参数传值:当一个类声明的两个对象有相同的引用(对象名相同),那么二者就有完全相同的变量,指向相同的实体。当一个对象操作其引用的变量发生改变,另一个也会改变。除非重新创建一个新的引用,则原引用不会受影响。(P70例7)对象的组合:原理和6差不多this.成员变量:用该方法赋值后,说明该类中其他的该成员变量也都是这个值(因此this不可以出现在类方法中!,同时还有个原因是因为类方法可以通过类名直接调用,此时任何对象可能还没有创建)
class Tom{
private int x = 120;
protected int y = 20;
int z = 11;
void showX(){
System.out.println(x);
}
public void setX(int x){
this.x = x;
System.out.println(x);
}
}
public class E {
public static void main(String arg[]) {
Tom tom = new Tom();
Tom jiafei = new Tom();
tom.setX(22); //22
tom.showX(); //22
jiafei.showX(); //120
}
} 访问权限:
成员变量成员方法构造方法可以是上面的任何一个访问权限。不可以用protected和private修饰类。
继承:子类可以调用父类的非private方法。
方法重载:一个类中可以有多个名字相同的方法,但是参数必须不同(参数个数或参数类型不同)
构造方法可以被重载,static方法也可以被重载。不可以用static修饰构造方法(类方法被加载到相应的内存后就有了相应的地址,而实例方法只有用构造方法声明后才有相应地址。二者作用矛盾)!static方法可以进行重写操作,但是重写后,子类对象的上转型对象不能调用子类的static方法,而只能调用父类的static方法。
class Animal{
public static int get(int n){
return n+10;
}
public int see(int n){
return n+10;
}
}
class Dog extends Animal {
public static int get(int n){
return n*10;
}
public int see(int n){
return n*10;
}
}
public class lei {
public static void main(String args[]){
Animal animal = null;
Dog dog = new Dog();
animal = new Dog();
System.out.printf("%d,%d,%d",animal.get(10),dog.get(10),animal.see(10)); //20,100,100
}
} 方法重写:子类的方法和父类方法类型 名字 参数完全相同。这时父类的方法会被隐藏(变量的隐藏:自类变量和父类变量名字相同)。这时子类就不可以调用父类被隐藏的方法和变量,除非用super()。
关于子类操作的变量:子类继承的方法 :只可操作子类继承和隐藏的成员变量。 子类新定义的方法: 可操作子类继承和子类新声明的成员变量,不可操作被隐藏的成员变量和方法(除非super()) 子类重写的方法 :同新定义的。
如果想在子类中使用被子类隐藏的成员变量或方法,就要用super.x或super.play()。super调用父类的构造方法:子类是不继承父类的构造方法的。必须要用super()来调用,且参数要与父类的参数设置一致,且必须是子类构造方法中第一句。只是,当父类构造方法为默认的时,子类构造方法通常默认有super(),因此不必写。但是当父类的构造方法定义了一个或多个构造方法是,要想子类不写super,就必须要规定一个无参数的构造方法。子类构造方法中不可以有多条super调用父类的某个构造方法的语句!super关键字形成的语句必须是子类构造方法中的第1条语句(×) 子类可以用super关键字调用父类的父类中的方法(×)
final关键字:类不可以被继承 不可以修饰构造方法 不可以被子类重写 他可以认为是一个常量,但是没有默认值,必须要指定该常量。不允许用final和abstrat同时修饰一个方法或类。final方法可以是static方法。
对象的上转型对象(可参考P127例子10):简而言之就是父类用子类的方法。但是对象的上转型对象只可以操作两个:1.隐藏或继承的变量(原属于父类) 2.继承或重写的对象(是子类的,表现出多态)
class 类人猿{
int m = 10
void cryspeak (String s){
System.out.println(s);
}
}
class People extends 类人猿{
int m = 100;
void cryspeak (String s){
System.out.println(s);
}
}
public class E{
public static void main(String arg[]){
类人猿 monkey; //或 类人猿 monkey = null;
People geng = new People();
monkey = geng; //monkey 是People对象geng的上转型对象
//还可直接:类人猿 monkey = new People();
monkey.cryspeak("啊啊啊");//等价于geng.cryspeak("啊啊啊");
monkey.m //输出是10 abstract方法 只允许声明,不允许实现,因此不可以用new创建该类的对象。没有方法体。不可以用static修饰abstract方法(即abstract方法必须是实例方法)。abstract类中可以有abstract方法,也可以有非abstract方法。非abstract类中不可以有abstract方法。 如果一个abstract类的子类为非abstarct类,那么它必须重写父类的方法。
方法局部变量的命名和方法的形参不能相同。 当成员变量命名与方法的形参或局部变量一样时,即使形参或局部变量的赋值与成员变量不同,成员变量也不会变(Java的就近原则),除非有this声明。
public class Mainceshi {
private String a = "成员变量";
public void GetA() {
String a = "局部变量";
System.out.println(this.a);
System.out.println(a);
}
public static void main(String[] args) {
Mainceshi mainceshi = new Mainceshi();
mainceshi.GetA(); //成员变量 局部变量
}
}



