侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 100 阅读 / 4,167 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
/ 后端 / JAVA /
每个基本类型成员变量都有初值0 , 对象为null , 可以直接使用.
方法的局部变量必须要有初始化才能用,否则编译错误 .
面向对象的语言 在解决一个问题的时候,找一个对象(包含了完成功能的步骤),让这个对象来完成这个功能。面向过程的语言 在解决一个问题的时候,完成这个问题的每一步都是自己一步一步实现的 面向过程
三大特征
封装
继承
多态
抽象
一个文件里只能有一个public类且这个类名与文件名一样.可以写多个其它非public类,类里还可以写类.另外,一个文件里写多个类的话编译之后会生成多个 类名.class文件 哈哈哈

一个类省掉作用域修饰符默认是包共享,既不是public也不是private
super(参1,参2)表示调用父类的这个函数
成员变量与局部变量
构造函数
实际上是个静态方法
构造函数不用带返回值类型,函数名与类名相同,可以重载.
类中不自己写构造函数的话系统自动生成一个无参数的构造函数.当自己写构造函数后就不自动生成了,此时海需要无参构造函数的话要自己写
可以在构造函数里用this() 调用本类的其它构造函数, 但是只能写在首句, 且只能调用一个.
static
静态的东西,程序一运行就会存在,直到程序停止,且只有一份,存在静态区
ClassName.name 调用,不用实例化类,哪里都可以调用.
不用实例化的类可以用这种
在静态函数里不可以调用非静态类成员变量
静态方法随着类的加载而加载,优先于对象存在
所在在静态方法中不能访问this,因为对象不存在.静态方法属于类,不属于任何一个对象,所以在静态方法内访问this不成功
final
常量:变量被final修饰后就是常量
成员常量 : 成员变量被final修饰后也为常量,赋值可以声明时或者必须是构造函数里,不能是函数里
不可重写函数 : 被修饰的函数不可以被重写.
不可被继承
封装
把成员变量设成私有,然后通过get,set函数来读取.确保值会按照规则修改也可控制权限
继承
子类调用父类的方法时,用父类的变量. 也就是说 谁的方法用谁的变量.
一个类只能继承一个类,但是可以一层一层的继承下去,有点世代单传的意思
会把父类所有东西继承下来,包括静态变量,静态函数(修饰符限定本类私有的都不可继承不论什么)
从书中看到子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,但是私有的方法似乎不能简单的访问,这里暂不考虑Java反射机制,于是我分析,子类不能继承父类私有的属性及方法,但是分析了内存后,我发现我是错的,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的。可以继承,只是无法访问到而已。
成员变量也会继承下来,自己再添加也也可以
在Java中有方法的重写,没有属性/字段的重写,准确的来说,是隐藏字段代替了重写。
成员特点
   成员方法:当父子类中出现同样方法,调用的是子类的方法(方法同名但不一定是一个)

成员变量:子类有使用子类自己的,子类没有,使用父类的成员变量



父类和子类定义了一个同名的字段,不会报错,但对于同一个对象,用父类的引用去取值(字段),会取到父类的字段的值,用子类的引用去取值(字段),则取到子类字段的值。
构造函数的细节
构造函数不会被继承
子类中的构造方法默认隐式调用父类中的无参构造方法
如果父类中没有无参构造方法,子类构造方法中必须手动调用父类的有参构造方法。
this()和super()在构造方法中只能存在一个( 因为都要求在第一句...)
重写

如果某个函数和父类逻辑不一样的话就可以重写,重写要求参数列表一模一样
多态的函数的重载,正常重载就行,每一个态重载一次
参数列表必须完全与被重写方法的相同;
返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同);
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
声明为static的方法不能被重写,但是能够被再次声明。
父类的成员方法只能被它的子类重写。
声明为final的方法不能被重写。
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
构造方法不能被重写。
如果不能继承一个方法,则不能重写这个方法。
super
当需要在子类中调用父类的被重写方法时,要使用super关键字。
和this一样,只不过一个是指当前对象,一个是指父亲
成员变量
   super.成员变量名
   this.成员变量名
成员方法
   super.成员方法名();
   this.成员方法名();
构造方法
   super();//super(参数);
   this();//this(参数);

重载(Overload)
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
重载规则:
被重载的方法必须改变参数列表(参数个数或类型或顺序不一样);
被重载的方法可以改变返回类型;但是只有返回类型不同不是重载.
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异常;
方法能够在同一个类中或者在一个子类中被重载。
无法以返回值类型作为重载函数的区分标准。
如果是基本类型,那么如果传入类型小于参数类型的话会自动转换成对应类型, 如: 定义方法 a(double a) , 用a('c') 调用也可以. 反之则不行, 因为精度会有损失.
多态
实现机制
靠的是父类 或接口定义的引用变量可以指向子类的实例,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

多态是指, 把给父类赋值一个子类,然后调用其方法, 调用的是子类的方法.

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
多态存在的三个必要条件
继承
重写
父类引用指向子类对象
比如:
Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。(即编译看左边,调用看右边)(所以无法调用子类独有的方法,可以转型一下解决,下面例子里有) 成员变量和静态量编译调用都是看左边
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。 使用场景 : 某函数要拿一个类的子类当参数时,参数类型写父类,传参传子类就好.
以下是一个多态实例的演示,详细说明请看注释:
虽然Object有个方法叫getClass()可以获取是什么类,但是无法当成类名那样使用.
Class c = s.getClass(); if(s instanceof c){这样是报错的
Test.java 文件代码:
public class muti {
    public static void main(String[] args) {
         show(new Cat()); // 以 Cat 对象调用 show 方法 
				 show(new Dog()); // 以 Dog 对象调用 show 方法 
				 Animal a = new Cat(); // 向上转型 
				 a.eat(); // 调用的是 Cat 的 eat 
				 Cat c = (Cat) a; // 向下转型 
				 c.work(); // 调用的是 Cat 的 work  
 }
public static void show(Animal a) {
    a.eat();
    // 类型判断  

if (a instanceof Cat) {
// 猫做的事情
Cat c = (Cat) a;
c.work();
} else if (a instanceof Dog) {
// 狗做的事情
Dog c = (Dog) a;
c.work();
}
}
}

abstract class Animal {
abstract void eat();
}

class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}

public void work() {
    System.out.println("抓老鼠");
}

}

class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}

public void work() {
    System.out.println("看家");
}

}



执行以上程序,输出结果为:
吃鱼 抓老鼠 吃骨头 看家 吃鱼 抓老鼠
对象的作用域
String ss;
 {
     String s = new String("a string");
    ss=s;
 } /* 作用域的终点 */
 System.out.println(ss);//这里会输出内容.
0

评论区